momentic-mobile 0.13.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var h_=Object.defineProperty;var We=(r,e)=>()=>(r&&(e=r(r=0)),e);var f_=(r,e)=>{for(var t in e)h_(r,t,{get:e[t],enumerable:!0})};var nT,oT=We(()=>{"use strict";nT=typeof globalThis=="object"?globalThis:global});var iT=We(()=>{"use strict";oT()});var aT=We(()=>{"use strict";iT()});var ln,ep=We(()=>{"use strict";ln="1.9.0"});function mD(r){var e=new Set([r]),t=new Set,n=r.match(sT);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===r};function i(s){return t.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var l=c.match(sT);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var sT,lT,cT=We(()=>{"use strict";ep();sT=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;lT=mD(ln)});function bi(r,e,t,n){var o;n===void 0&&(n=!1);var i=Ka[qa]=(o=Ka[qa])!==null&&o!==void 0?o:{version:ln};if(!n&&i[r]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+r);return t.error(a.stack||a.message),!1}if(i.version!==ln){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+ln);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+ln+"."),!0}function cn(r){var e,t,n=(e=Ka[qa])===null||e===void 0?void 0:e.version;if(!(!n||!lT(n)))return(t=Ka[qa])===null||t===void 0?void 0:t[r]}function Ei(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+ln+".");var t=Ka[qa];t&&delete t[r]}var pD,qa,Ka,Ya=We(()=>{"use strict";aT();ep();cT();pD=ln.split(".")[0],qa=Symbol.for("opentelemetry.js.api."+pD),Ka=nT});function Xa(r,e,t){var n=cn("diag");if(n)return t.unshift(e),n[r].apply(n,hD([],gD(t),!1))}var gD,hD,uT,dT=We(()=>{"use strict";Ya();gD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},hD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},uT=function(){function r(e){this._namespace=e.namespace||"DiagComponentLogger"}return r.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("verbose",this._namespace,e)},r}()});var Be,ic=We(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(Be||(Be={}))});function mT(r,e){r<Be.NONE?r=Be.NONE:r>Be.ALL&&(r=Be.ALL),e=e||{};function t(n,o){var i=e[n];return typeof i=="function"&&r>=o?i.bind(e):function(){}}return{error:t("error",Be.ERROR),warn:t("warn",Be.WARN),info:t("info",Be.INFO),debug:t("debug",Be.DEBUG),verbose:t("verbose",Be.VERBOSE)}}var pT=We(()=>{"use strict";ic()});var fD,SD,yD,Hr,Ja=We(()=>{"use strict";dT();pT();ic();Ya();fD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},SD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},yD="diag",Hr=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=cn("diag");if(s)return s[o].apply(s,SD([],fD(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:Be.INFO}),o===t){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return t.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=cn("diag"),d=mT((s=i.logLevel)!==null&&s!==void 0?s:Be.INFO,o);if(u&&!i.suppressOverrideMessage){var m=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+m),d.warn("Current logger will overwrite one already registered from "+m)}return bi("diag",d,t,!0)};t.setLogger=n,t.disable=function(){Ei(yD,t)},t.createComponentLogger=function(o){return new uT(o)},t.verbose=e("verbose"),t.debug=e("debug"),t.info=e("info"),t.warn=e("warn"),t.error=e("error")}return r.instance=function(){return this._instance||(this._instance=new r),this._instance},r}()});var gT,hT=We(()=>{"use strict";gT=Symbol("BaggageEntryMetadata")});function tp(r){return typeof r!="string"&&(bD.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:gT,toString:function(){return r}}}var bD,fT=We(()=>{"use strict";Ja();hT();bD=Hr.instance()});function rp(r){return Symbol.for(r)}var ED,np,op=We(()=>{"use strict";ED=function(){function r(e){var t=this;t._currentContext=e?new Map(e):new Map,t.getValue=function(n){return t._currentContext.get(n)},t.setValue=function(n,o){var i=new r(t._currentContext);return i._currentContext.set(n,o),i},t.deleteValue=function(n){var o=new r(t._currentContext);return o._currentContext.delete(n),o}}return r}(),np=new ED});function sp(){return ap}var fo,TD,ac,vD,AD,wD,CD,ip,RD,xD,MD,ap,_D,PD,ID,OD,LD,ND,DD,lp=We(()=>{"use strict";fo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),TD=function(){function r(){}return r.prototype.createGauge=function(e,t){return PD},r.prototype.createHistogram=function(e,t){return ID},r.prototype.createCounter=function(e,t){return _D},r.prototype.createUpDownCounter=function(e,t){return OD},r.prototype.createObservableGauge=function(e,t){return ND},r.prototype.createObservableCounter=function(e,t){return LD},r.prototype.createObservableUpDownCounter=function(e,t){return DD},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),ac=function(){function r(){}return r}(),vD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(ac),AD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(ac),wD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(ac),CD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(ac),ip=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),RD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(ip),xD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(ip),MD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(ip),ap=new TD,_D=new vD,PD=new wD,ID=new CD,OD=new AD,LD=new RD,ND=new xD,DD=new MD});var Kt,ST=We(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Kt||(Kt={}))});var kD,UD,yT,bT=We(()=>{"use strict";op();kD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},UD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},yT=function(){function r(){}return r.prototype.active=function(){return np},r.prototype.with=function(e,t,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return t.call.apply(t,UD([n],kD(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var FD,BD,cp,zD,ET,TT=We(()=>{"use strict";bT();Ya();Ja();FD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},cp="context",zD=new yT,ET=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return bi(cp,e,Hr.instance())},r.prototype.active=function(){return this._getContextManager().active()},r.prototype.with=function(e,t,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,BD([e,t,n],FD(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return cn(cp)||zD},r.prototype.disable=function(){this._getContextManager().disable(),Ei(cp,Hr.instance())},r}()});var Ti,vT=We(()=>{"use strict";TT();Ti=ET.getInstance()});var V,AT=We(()=>{"use strict";Ja();V=Hr.instance()});var HD,wT,CT=We(()=>{"use strict";lp();HD=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return ap},r}(),wT=new HD});var up,RT,xT=We(()=>{"use strict";CT();Ya();Ja();up="metrics",RT=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return bi(up,e,Hr.instance())},r.prototype.getMeterProvider=function(){return cn(up)||wT},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){Ei(up,Hr.instance())},r}()});var sc,MT=We(()=>{"use strict";xT();sc=RT.getInstance()});var Le=We(()=>{"use strict";fT();op();ic();lp();ST();vT();AT();MT()});import{Argument as Zh,Command as cW,Option as uW}from"@commander-js/extra-typings";import lF from"appium";import{z as vd}from"zod";var EW=vd.object({input:vd.string(),agentConfigVersion:vd.string().optional()});import{z as ct}from"zod";var AW=ct.object({srcs:ct.array(ct.string()),urls:ct.array(ct.string()),desiredSrc:ct.string().optional(),desiredUrl:ct.string().optional()}),tf=ct.object({srcRegex:ct.string().optional(),urlRegex:ct.string().optional()}),rf=ct.object({x:ct.number(),y:ct.number(),correlation:ct.number()}),wW=ct.object({searchImageBase64String:ct.string(),pageImageBase64String:ct.string(),id:ct.string().uuid(),timeoutMs:ct.number().max(1e4).min(0).optional()});import{z as _}from"zod";import*as N from"zod";import{extendZodWithOpenApi as S_}from"zod-openapi";S_(N);var fn=(s=>(s.AI="AI",s.AI_HEALED="AI_HEALED",s.CLICK_TO_FIND="CLICK_TO_FIND",s.XY_PERCENT="XY_PERCENT",s.RECORDING="RECORDING",s.USER_CSS_SELECTOR="USER_CSS_SELECTOR",s.HEURISTIC_HEALED="HEURISTIC_HEALED",s))(fn||{}),y_=N.object({mPathSelectorTokens:N.string().array(),frameSrcRegex:N.string().optional(),frameUrlRegex:N.string().optional(),indices:N.number().array()}),ta=N.object({result:N.number(),traceId:N.string()}).array(),en=N.object({type:N.literal("GCS_TRACES"),traces:ta}),It=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(It||{}),nf=N.object({attributes:N.record(N.string(),N.string()).optional(),text:N.string().optional(),position:N.object({x1:N.number(),y1:N.number(),x2:N.number(),y2:N.number(),tolerance:N.nativeEnum(It)}).optional(),shape:N.object({width:N.number(),height:N.number(),tolerance:N.nativeEnum(It)}).optional(),boundingBox:N.object({x:N.number(),y:N.number(),width:N.number(),height:N.number()}).optional()}),b_=N.object({selectors:N.string().array(),requirements:nf.optional()}),Sn=N.object({id:N.number().int(),dataMomenticId:N.number().int().optional(),selector:N.string().optional(),hybridSelector:N.object({textContent:N.string().nullish(),attributes:N.record(N.string(),N.string().optional()),tagName:N.string(),expandShadowRoot:N.boolean().optional(),classNames:N.string().array(),nthChild:N.number()}).array().optional(),generatedSelectors:N.string().array().optional(),requirements:nf.optional(),additionalElements:b_.array().optional(),role:N.string().optional(),name:N.string().optional(),numChildren:N.number().optional(),content:N.string().optional(),pathFromRoot:N.string().optional(),serializedHtml:N.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:N.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:N.string().url().optional(),boundingBox:N.object({x:N.number().optional(),y:N.number().optional(),width:N.number(),height:N.number()}).describe("css pixel bounding box").optional(),frameCache:y_.optional(),inputDescription:N.string().optional().describe("the description that generated this cache"),targetSource:N.nativeEnum(fn).optional(),targetUpdateTime:N.string().optional(),targetUpdateLoggerTags:N.record(N.string(),N.string()).optional(),cacheResolutionUpdateSource:N.string().optional(),cacheResolutionUpdateTime:N.string().optional(),cacheResolutionUpdateLoggerTags:N.record(N.string(),N.string()).optional(),memory:en.optional()}).openapi({ref:"ElementTargetCache"});function Ks(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var E_=N.object({type:N.literal("description"),elementDescriptor:N.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),T_=N.object({x:N.number(),y:N.number()}),v_=N.object({type:N.literal("coordinates"),pixels:T_}).openapi({ref:"CoordinatesTarget"});function yn(r){return r.type==="description"}function Ir(r){return r.type==="coordinates"}var wt=N.discriminatedUnion("type",[E_,v_]).openapi({ref:"ElementTarget"});function Ad(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function of(r){return en.safeParse(r).success}import{v4 as ve}from"uuid";import*as S from"zod";import{extendZodWithOpenApi as L_}from"zod-openapi";import{z as de}from"zod";import{extendZodWithOpenApi as A_}from"zod-openapi";import{z as na}from"zod";import af from"zod";var ra=af.object({updatedAt:af.coerce.date().optional()});var oa=na.object({result:na.boolean(),traceId:na.string()}).array(),ia=na.object({type:na.literal("GCS_TRACES"),traces:oa}),bn=ra.extend({memory:ia.optional()});A_(de);var sf=de.object({thoughts:de.string(),result:de.boolean(),relevantElements:de.array(de.number()).optional(),updatedMemory:oa.optional()}),Qt=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Qt||{});var w_=de.object({type:de.literal("ELEMENT_NAME"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),value:de.string()}).openapi({ref:"ElementNameAssertion"}),C_=de.object({type:de.literal("ELEMENT_STYLE"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),property:de.string(),value:de.string()}).openapi({ref:"ElementStyleAssertion"}),R_=de.object({type:de.literal("ELEMENT_CONTENT"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),value:de.string()}).openapi({ref:"ElementContentAssertion"}),x_=de.object({type:de.literal("ELEMENT_ATTRIBUTE"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),attr:de.string(),value:de.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Or=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Or||{});var M_=de.object({type:de.literal("ELEMENT_EXISTENCE"),negated:de.boolean().optional(),condition:de.nativeEnum(Or).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Ys=de.discriminatedUnion("type",[R_,x_,M_,w_,C_]).openapi({ref:"ManualElementAssertion"});var __=de.object({type:de.literal("CONTENT"),negated:de.boolean().optional(),value:de.string()}).openapi({ref:"PageContentAssertion"}),lf=de.discriminatedUnion("type",[__]).openapi({ref:"ManualPageAssertion"});import Ot from"zod";var wd=Ot.discriminatedUnion("type",[Ot.object({type:Ot.literal("SUBSTRING"),url:Ot.string()}),Ot.object({type:Ot.literal("GLOB"),glob:Ot.string()}),Ot.object({type:Ot.literal("REGEX"),regex:Ot.string()}),Ot.object({type:Ot.literal("DOMAIN"),domain:Ot.string()})]),aa=Ot.object({urlMatcher:wd,method:Ot.string().optional()});import{z as le}from"zod";var P_=le.object({type:le.literal("json"),content:le.string().describe("The JSON content to send in the request body")}),I_=le.object({type:le.literal("form-urlencoded"),content:le.record(le.string(),le.string()).describe("The form fields to send in the request body")}),O_=le.discriminatedUnion("type",[P_,I_]),Qn=le.object({url:le.string(),method:le.union([le.literal("GET"),le.literal("POST"),le.literal("PUT"),le.literal("DELETE"),le.literal("PATCH")]),headers:le.record(le.string(),le.string()).optional(),params:le.record(le.string(),le.string()).optional(),body:O_.optional(),timeout:le.number().int().optional().describe("Max seconds to wait for the request to complete")}),cf=le.object({url:le.string(),headers:le.record(le.string(),le.string()).optional(),query:le.string(),variables:le.string().optional(),timeout:le.number().int().optional().describe("Max seconds to wait for the request to complete")}),Xs=le.object({code:le.string(),fragment:le.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:le.union([le.literal("NODE"),le.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:le.number().int().max(60).optional().describe("Max seconds for the code to complete")});var nt=(Y=>(Y.AI_EXTRACT="AI_EXTRACT",Y.AI_ASSERTION="AI_ASSERTION",Y.AUTH_LOAD="AUTH_LOAD",Y.AUTH_SAVE="AUTH_SAVE",Y.BLUR="BLUR",Y.CAPTCHA="CAPTCHA",Y.CLICK="CLICK",Y.COOKIE="COOKIE",Y.COPY="COPY",Y.DIALOG="DIALOG",Y.DRAG="DRAG",Y.ELEMENT_CHECK="ELEMENT_CHECK",Y.FILE_UPLOAD="FILE_UPLOAD",Y.FOCUS="FOCUS",Y.GO_BACK="GO_BACK",Y.GO_FORWARD="GO_FORWARD",Y.HOVER="HOVER",Y.JAVASCRIPT="JAVASCRIPT",Y.LOCAL_STORAGE="LOCAL_STORAGE",Y.MOUSE_DRAG="MOUSE_DRAG",Y.NAVIGATE="NAVIGATE",Y.NEW_TAB="NEW_TAB",Y.PAGE_CHECK="PAGE_CHECK",Y.PASTE="PASTE",Y.PRESS="PRESS",Y.KEY_DOWN="KEY_DOWN",Y.KEY_UP="KEY_UP",Y.REFRESH="REFRESH",Y.REQUEST="REQUEST",Y.GRAPHQL_REQUEST="GRAPHQL_REQUEST",Y.SCROLL_DOWN="SCROLL_DOWN",Y.SCROLL_UP="SCROLL_UP",Y.SCROLL_LEFT="SCROLL_LEFT",Y.SCROLL_RIGHT="SCROLL_RIGHT",Y.SELECT_OPTION="SELECT_OPTION",Y.SWITCH_TAB="TAB",Y.TYPE="TYPE",Y.VISUAL_DIFF="VISUAL_DIFF",Y.WAIT="WAIT",Y.WAIT_FOR_URL="WAIT_FOR_URL",Y.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",Y.AWAIT_LISTENER="AWAIT_LISTENER",Y.RECORD_REQUESTS="RECORD_REQUESTS",Y.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",Y.SET_HEADER="SET_HEADER",Y.MOCK_ROUTE="MOCK_ROUTE",Y.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",Y.OFFLINE_MODE="OFFLINE_MODE",Y.SUCCESS="SUCCESS",Y))(nt||{});L_(S);var X=S.object({thoughts:S.string().optional(),id:S.string().uuid().describe("unique identifier to this step, used for step cache")}),Zt=S.object({useSelector:S.boolean().optional(),force:S.boolean().optional(),disableCache:S.boolean().optional().describe("disable element caching for this step"),iframeUrl:S.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),er=ra.extend({target:Sn}).optional().openapi({ref:"SingleTargetCache"});function uf(r){return er.safeParse(r).success}var Js=S.object({loadTimeout:S.number().int().max(60).optional().describe("Max seconds for the page to load")}),df=X.merge(Js).merge(S.object({type:S.literal("NAVIGATE"),url:S.string()})).openapi({ref:"NavigateCommand"}),Qs=Zt.merge(S.object({cache:er})),Zn=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_UP"),deltaY:S.number().optional()}))).openapi({ref:"ScrollUpCommand"}),eo=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_DOWN"),deltaY:S.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ho=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_LEFT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Go=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_RIGHT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollRightCommand"}),rj=S.discriminatedUnion("type",[Zn,eo,Ho,Go]).openapi({ref:"AllScrollCommands"}),N_=X.merge(S.object({type:S.literal("DIALOG"),action:S.union([S.literal("ACCEPT"),S.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),mf=X.merge(S.object({type:S.literal("WAIT"),delay:S.number()})).openapi({ref:"WaitCommand"}),D_=S.object({caseInsensitive:S.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:S.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:S.number().int().optional().describe("Max seconds to wait for the URL to match")}),pf=X.extend({type:S.literal("WAIT_FOR_URL"),matcher:wd}).merge(D_).openapi({ref:"WaitUrlCommand"}),gf=X.merge(Js).merge(S.object({type:S.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),hf=X.merge(S.object({type:S.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),ff=X.merge(S.object({type:S.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),k_=X.extend({type:S.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),U_=X.extend({type:S.literal("AUTH_LOAD"),storageState:S.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Rd=X.merge(Zt).extend({type:S.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Sf=X.extend({type:S.literal("COPY"),value:S.string()}).openapi({ref:"CopyCommand"}),yf=X.extend({type:S.literal("PASTE")}).openapi({ref:"PasteCommand"}),bf=X.merge(Xs).extend({type:S.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Vo=X.merge(Zt).extend({type:S.literal("CLICK"),target:wt,doubleClick:S.boolean().optional(),rightClick:S.boolean().optional(),waitForDownload:S.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:S.number().optional(),downloadTimeoutMs:S.number().optional(),cache:er,relativePosition:S.object({x:S.number(),y:S.number()}).optional()}).openapi({ref:"ClickCommand"}),Ef=ra.extend({fromTarget:Sn.optional(),toTarget:Sn.optional()}),Wo=X.merge(Zt).merge(S.object({type:S.literal("DRAG"),fromTarget:wt,toTarget:wt,steps:S.number().optional(),hoverSeconds:S.number().optional().describe("Seconds to hover the object before dropping"),cache:Ef.optional()})).openapi({ref:"DragCommand"}),jo=X.merge(Zt).merge(S.object({type:S.literal("MOUSE_DRAG"),target:wt.optional(),deltaX:S.string().describe("pixels to move horizontally, can be template"),deltaY:S.string().describe("pixels to move vertically, can be template"),steps:S.number().optional(),cache:er})).openapi({ref:"MouseDragCommand"}),$o=X.merge(Zt).merge(S.object({type:S.literal("HOVER"),target:wt,cache:er})).openapi({ref:"HoverCommand"}),sa=X.merge(Zt).merge(S.object({type:S.literal("FOCUS"),target:wt,cache:er})).openapi({ref:"FocusCommand"}),la=X.merge(Zt).extend({type:S.literal("BLUR"),target:wt.optional(),cache:er}).openapi({ref:"BlurCommand"}),F_=S.object({type:S.literal("URL"),url:S.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),B_=S.object({type:S.literal("USER_FILE"),name:S.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),z_=X.extend({type:S.literal("FILE_UPLOAD"),fileSource:S.discriminatedUnion("type",[F_,B_]),filename:S.string().optional()}).openapi({ref:"FileUploadCommand"}),Tf=S.discriminatedUnion("type",[S.object({type:S.literal("VALUE"),value:S.string()}),S.object({type:S.literal("LABEL"),label:S.string()}),S.object({type:S.literal("INDEX"),index:S.coerce.string()})]),qo=X.merge(Zt).extend({type:S.literal("SELECT_OPTION"),target:wt,cache:er,choice:Tf.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),xd=S.union([S.literal("MULTIMODAL"),S.literal("VISION_ONLY")]),ca=X.merge(S.object({type:S.literal("AI_ASSERTION"),assertion:S.string(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional(),contextChoice:xd.optional(),timeout:S.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:bn.optional()})).openapi({ref:"AIAssertionCommand"}),Lt=5,Ko=600,Yo=X.merge(Zt).extend({type:S.literal("ELEMENT_CHECK"),target:wt,assertion:Ys,cache:er.or(bn).optional(),timeout:S.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),vf=X.extend({type:S.literal("PAGE_CHECK"),assertion:lf,iframeUrl:S.string().optional().describe("url or url regex for the iframe"),timeout:S.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Af=X.merge(S.object({type:S.literal("AI_EXTRACT"),goal:S.string(),schema:S.string().optional(),envKey:S.string().optional(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional()})).openapi({ref:"AIExtractCommand"}),H_=S.object({clearContent:S.boolean().optional(),forceClearContent:S.boolean().optional(),delay:S.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:S.boolean().optional(),pressEnter:S.boolean().optional(),relativePosition:S.object({x:S.number(),y:S.number()}).optional()}),wf=25,Xo=X.merge(Zt).merge(H_).extend({type:S.literal("TYPE"),target:wt.optional(),value:S.string(),cache:er}).openapi({ref:"TypeCommand"}),Cf=X.merge(S.object({type:S.literal("PRESS"),value:S.string(),repeat:S.number().optional(),convertMeta:S.boolean().optional(),delayMs:S.number().optional()})).openapi({ref:"PressCommand"}),Rf=X.merge(S.object({type:S.literal("KEY_DOWN"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyDownCommand"}),xf=X.merge(S.object({type:S.literal("KEY_UP"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyUpCommand"}),G_=S.object({type:S.literal("SUBSTRING"),substring:S.string()}),V_=S.object({type:S.literal("REGEX"),pattern:S.string()}),W_=S.object({type:S.literal("INDEX"),index:S.coerce.string()}),j_=S.discriminatedUnion("type",[G_,V_,W_]),$_=X.merge(Js).merge(S.object({type:S.literal("TAB"),action:j_})).openapi({ref:"TabCommand"}),Mf=X.merge(Js).merge(S.object({type:S.literal("NEW_TAB"),url:S.string()})).openapi({ref:"NewTabCommand"}),q_=X.merge(S.object({type:S.literal("COOKIE"),value:S.string()})).openapi({ref:"CookieCommand"}),_f=X.merge(S.object({type:S.literal("LOCAL_STORAGE"),key:S.string(),value:S.string()})).openapi({ref:"LocalStorageCommand"}),Pf=X.extend({type:S.literal("REQUEST")}).merge(Qn).openapi({ref:"RequestCommand"}),Zs=S.object({status:S.number().optional(),headers:S.record(S.string(),S.string()),json:S.unknown().optional(),text:S.string().optional(),cookies:S.record(S.string(),S.unknown()).array().optional(),request:S.object({url:S.string(),method:S.string(),headers:S.record(S.string(),S.string()),json:S.unknown().optional()})}),If=X.extend({type:S.literal("GRAPHQL_REQUEST")}).merge(cf).openapi({ref:"GraphQLRequestCommand"}),Of=X.merge(S.object({type:S.literal("SUCCESS"),condition:ca.optional()})).openapi({ref:"SuccessCommand"}),Lf=X.merge(S.object({type:S.literal("FAILURE")})).openapi({ref:"FailureCommand"}),K_=S.object({data:S.string().describe("location at which to find a jpg"),width:S.number(),height:S.number()}),ua=X.merge(Zt).merge(S.object({type:S.literal("VISUAL_DIFF"),threshold:S.number().optional().describe("default 0.1"),target:wt.optional(),screenshot:K_.optional(),cache:er})).openapi({ref:"VisualDiffCommand"}),Y_=X.merge(S.object({type:S.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:aa,key:S.string()})).openapi({ref:"RegisterRequestListenerCommand"}),X_=X.merge(S.object({type:S.literal("AWAIT_LISTENER"),key:S.string(),timeout:S.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),J_=X.merge(S.object({type:S.literal("RECORD_REQUESTS"),requestMatcher:aa,key:S.string()})).openapi({ref:"RecordRequestsCommand"}),Q_=X.merge(S.object({type:S.literal("GET_RECORDED_REQUESTS"),key:S.string()})).openapi({ref:"GetRecordedRequestsCommand"}),Z_=X.merge(S.object({type:S.literal("SET_HEADER"),name:S.string(),value:S.string(),requestMatcher:aa.optional()})).openapi({ref:"SetHeaderCommand"}),eP=X.merge(S.object({type:S.literal("MOCK_ROUTE"),requestMatcher:aa,responseGenerator:S.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:S.boolean().optional().describe("Whether to fetch the real response and pass it to the response generator. If enabled, the original response will be available as `response` in the code."),key:S.string().optional().describe("Key to reference this mock. This only needs to be set if you plan to remove the mock later in the test.")}).openapi({ref:"MockRouteCommandOptions"})),tP=X.merge(S.object({type:S.literal("REMOVE_ROUTE_MOCK"),key:S.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),rP=X.merge(S.object({type:S.literal("OFFLINE_MODE"),enable:S.boolean()})).openapi({ref:"OfflineModeCommand"}),nP=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],nj=[...nP,"DRAG"],oP=S.discriminatedUnion("type",[Vo,Xo,Cf,Rf,xf,qo,df,eo,Zn,ca,hf,$o,mf]),iP=S.discriminatedUnion("type",[...oP.options,Wo]),aP=S.discriminatedUnion("type",[...iP.options]),Nf=S.discriminatedUnion("type",[...aP.options,Of]),Md=S.discriminatedUnion("type",[Of,Vo,Xo,Cf,Rf,xf,qo,df,eo,Zn,ca,hf,$o,mf,bf,Yo,vf,Mf,pf,Af,Sf,ff,_f,Wo,jo,yf,gf,Pf,If]),sP=S.discriminatedUnion("type",[Af,U_,k_,Rd,q_,Sf,N_,Yo,z_,ff,bf,_f,jo,Mf,vf,yf,gf,Pf,If,Ho,Go,$_,ua,sa,la,pf,Y_,X_,J_,Q_,Z_,eP,tP,rP]),Jo=S.discriminatedUnion("type",[...Nf.options,...sP.options]).openapi({ref:"Command"}),el=S.discriminatedUnion("type",[...Nf.options,Lf]),oj=S.discriminatedUnion("type",[...Md.options,Lf]);function tn(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:ve(),type:r};break;case"AUTH_LOAD":{e={id:ve(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:ve(),type:r,goal:""};break;case"DIALOG":e={id:ve(),type:r,action:"DISMISS"};break;case"DRAG":e={id:ve(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ve(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ve(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ve(),type:r,delay:1};break;case"BLUR":e={id:ve(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ve(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:ve(),type:r,value:""};break;case"SELECT_OPTION":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:ve(),type:r,url:""};case"TAB":e={id:ve(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ve(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ve(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ve(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:ve(),type:r,code:""};break;case"AI_ASSERTION":e={id:ve(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:ve(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:ve(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:ve(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ve(),type:r,key:""};break}case"SET_HEADER":{e={id:ve(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:ve(),type:r};break}case"OFFLINE_MODE":{e={id:ve(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Df(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as lP}from"zod";var cj=lP.discriminatedUnion("type",[la,Rd,Vo,Wo,sa,$o,jo,Zn,eo,Ho,Go,qo,Xo,ua,Yo]);import{z as cP}from"zod";import{z as Tn}from"zod";function da(r){return Tn.object({key:Tn.string(),testId:Tn.string().optional(),moduleId:Tn.string().optional(),organizationId:Tn.string(),value:r})}function ma(r){return da(r).extend({uniqueKey:Tn.string()})}function tl(r){return Tn.record(Tn.string(),ma(r))}var Nt={type:!0,cache:!0},Qo=cP.discriminatedUnion("type",[ca.pick(Nt),la.pick(Nt),Vo.pick(Nt),Wo.pick(Nt),Yo.pick(Nt),sa.pick(Nt),$o.pick(Nt),jo.pick(Nt),Zn.pick(Nt),eo.pick(Nt),Ho.pick(Nt),Go.pick(Nt),qo.pick(Nt),Xo.pick(Nt),ua.pick(Nt)]),_d=Object.values(nt).filter(r=>Qo.options.some(e=>e.shape.type.safeParse(r).success));Jo.options.forEach(r=>{if("target"in r.shape&&!_d.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function Pd(r){return _d.includes(r.type)}var kf=da(Qo),Uf=ma(Qo),Sj=tl(Qo);import{v4 as S2}from"uuid";import{z as T}from"zod";var Bf=Symbol("Let zodToJsonSchema decide on which parser to use");var Ff={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},zf=r=>typeof r=="string"?{...Ff,name:r}:{...Ff,...r};var Hf=r=>{let e=zf(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function Id(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function fe(r,e,t,n,o){r[e]=t,Id(r,e,n,o)}var rl=(r,e)=>{let t=0;for(;t<r.length&&t<e.length&&r[t]===e[t];t++);return[(r.length-t).toString(),...e.slice(t)].join("/")};import{ZodFirstPartyTypeKind as ge}from"zod";function ze(r){if(r.target!=="openAi")return{};let e=[...r.basePath,r.definitionPath,r.openAiAnyTypeName];return r.flags.hasReferencedOpenAiAnyType=!0,{$ref:r.$refStrategy==="relative"?rl(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as uP}from"zod";function Gf(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==uP.ZodAny&&(t.items=J(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&fe(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&fe(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(fe(t,"minItems",r.exactLength.value,r.exactLength.message,e),fe(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function Vf(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?fe(t,"minimum",n.value,n.message,e):fe(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),fe(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?fe(t,"maximum",n.value,n.message,e):fe(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),fe(t,"maximum",n.value,n.message,e));break;case"multipleOf":fe(t,"multipleOf",n.value,n.message,e);break}return t}function Wf(){return{type:"boolean"}}function nl(r,e){return J(r.type._def,e)}var jf=(r,e)=>J(r.innerType._def,e);function Od(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Od(r,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return dP(r,e)}}var dP=(r,e)=>{let t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(let n of r.checks)switch(n.kind){case"min":fe(t,"minimum",n.value,n.message,e);break;case"max":fe(t,"maximum",n.value,n.message,e);break}return t};function $f(r,e){return{...J(r.innerType._def,e),default:r.defaultValue()}}function qf(r,e){return e.effectStrategy==="input"?J(r.schema._def,e):ze(e)}function Kf(r){return{type:"string",enum:Array.from(r.values)}}var mP=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function Yf(r,e){let t=[J(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),J(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(mP(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function Xf(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as pa}from"zod";var Ld,br={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Ld===void 0&&(Ld=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Ld),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function ol(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":fe(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":fe(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Er(t,"email",n.message,e);break;case"format:idn-email":Er(t,"idn-email",n.message,e);break;case"pattern:zod":Dt(t,br.email,n.message,e);break}break;case"url":Er(t,"uri",n.message,e);break;case"uuid":Er(t,"uuid",n.message,e);break;case"regex":Dt(t,n.regex,n.message,e);break;case"cuid":Dt(t,br.cuid,n.message,e);break;case"cuid2":Dt(t,br.cuid2,n.message,e);break;case"startsWith":Dt(t,RegExp(`^${Nd(n.value,e)}`),n.message,e);break;case"endsWith":Dt(t,RegExp(`${Nd(n.value,e)}$`),n.message,e);break;case"datetime":Er(t,"date-time",n.message,e);break;case"date":Er(t,"date",n.message,e);break;case"time":Er(t,"time",n.message,e);break;case"duration":Er(t,"duration",n.message,e);break;case"length":fe(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),fe(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Dt(t,RegExp(Nd(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Er(t,"ipv4",n.message,e),n.version!=="v4"&&Er(t,"ipv6",n.message,e);break}case"base64url":Dt(t,br.base64url,n.message,e);break;case"jwt":Dt(t,br.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Dt(t,br.ipv4Cidr,n.message,e),n.version!=="v4"&&Dt(t,br.ipv6Cidr,n.message,e);break}case"emoji":Dt(t,br.emoji(),n.message,e);break;case"ulid":{Dt(t,br.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Er(t,"binary",n.message,e);break}case"contentEncoding:base64":{fe(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Dt(t,br.base64,n.message,e);break}}break}case"nanoid":Dt(t,br.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Nd(r,e){return e.patternStrategy==="escape"?gP(r):r}var pP=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function gP(r){let e="";for(let t=0;t<r.length;t++)pP.has(r[t])||(e+="\\"),e+=r[t];return e}function Er(r,e,t,n){r.format||r.anyOf?.some(o=>o.format)?(r.anyOf||(r.anyOf=[]),r.format&&(r.anyOf.push({format:r.format,...r.errorMessage&&n.errorMessages&&{errorMessage:{format:r.errorMessage.format}}}),delete r.format,r.errorMessage&&(delete r.errorMessage.format,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.anyOf.push({format:e,...t&&n.errorMessages&&{errorMessage:{format:t}}})):fe(r,"format",e,t,n)}function Dt(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:Jf(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):fe(r,"pattern",Jf(e,n),t,n)}function Jf(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(t.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(t.m){if(n[c]==="^"){o+=`(^|(?<=[\r
|
|
2
|
+
var y_=Object.defineProperty;var We=(r,e)=>()=>(r&&(e=r(r=0)),e);var b_=(r,e)=>{for(var t in e)y_(r,t,{get:e[t],enumerable:!0})};var iT,aT=We(()=>{"use strict";iT=typeof globalThis=="object"?globalThis:global});var sT=We(()=>{"use strict";aT()});var lT=We(()=>{"use strict";sT()});var dn,nm=We(()=>{"use strict";dn="1.9.0"});function gD(r){var e=new Set([r]),t=new Set,n=r.match(cT);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(cT);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 cT,uT,dT=We(()=>{"use strict";nm();cT=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;uT=gD(dn)});function vi(r,e,t,n){var o;n===void 0&&(n=!1);var i=Qa[Ja]=(o=Qa[Ja])!==null&&o!==void 0?o:{version:dn};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!==dn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+dn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+dn+"."),!0}function pn(r){var e,t,n=(e=Qa[Ja])===null||e===void 0?void 0:e.version;if(!(!n||!uT(n)))return(t=Qa[Ja])===null||t===void 0?void 0:t[r]}function Ai(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+dn+".");var t=Qa[Ja];t&&delete t[r]}var hD,Ja,Qa,Za=We(()=>{"use strict";lT();nm();dT();hD=dn.split(".")[0],Ja=Symbol.for("opentelemetry.js.api."+hD),Qa=iT});function es(r,e,t){var n=pn("diag");if(n)return t.unshift(e),n[r].apply(n,SD([],fD(t),!1))}var fD,SD,pT,mT=We(()=>{"use strict";Za();fD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},SD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},pT=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 es("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return es("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return es("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return es("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return es("verbose",this._namespace,e)},r}()});var Be,uc=We(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(Be||(Be={}))});function gT(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 hT=We(()=>{"use strict";uc()});var yD,bD,ED,Wr,ts=We(()=>{"use strict";mT();hT();uc();Za();yD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},bD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},ED="diag",Wr=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=pn("diag");if(s)return s[o].apply(s,bD([],yD(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=pn("diag"),d=gT((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 vi("diag",d,t,!0)};t.setLogger=n,t.disable=function(){Ai(ED,t)},t.createComponentLogger=function(o){return new pT(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 fT,ST=We(()=>{"use strict";fT=Symbol("BaggageEntryMetadata")});function om(r){return typeof r!="string"&&(TD.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:fT,toString:function(){return r}}}var TD,yT=We(()=>{"use strict";ts();ST();TD=Wr.instance()});function im(r){return Symbol.for(r)}var vD,am,sm=We(()=>{"use strict";vD=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}(),am=new vD});function um(){return cm}var Eo,AD,dc,wD,CD,RD,xD,lm,MD,_D,PD,cm,ID,OD,LD,ND,DD,kD,UD,dm=We(()=>{"use strict";Eo=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)}}(),AD=function(){function r(){}return r.prototype.createGauge=function(e,t){return OD},r.prototype.createHistogram=function(e,t){return LD},r.prototype.createCounter=function(e,t){return ID},r.prototype.createUpDownCounter=function(e,t){return ND},r.prototype.createObservableGauge=function(e,t){return kD},r.prototype.createObservableCounter=function(e,t){return DD},r.prototype.createObservableUpDownCounter=function(e,t){return UD},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),dc=function(){function r(){}return r}(),wD=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(dc),CD=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(dc),RD=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(dc),xD=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(dc),lm=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),MD=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(lm),_D=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(lm),PD=function(r){Eo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(lm),cm=new AD,ID=new wD,OD=new RD,LD=new xD,ND=new CD,DD=new MD,kD=new _D,UD=new PD});var Kt,bT=We(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Kt||(Kt={}))});var FD,BD,ET,TT=We(()=>{"use strict";sm();FD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},ET=function(){function r(){}return r.prototype.active=function(){return am},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,BD([n],FD(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var zD,HD,pm,GD,vT,AT=We(()=>{"use strict";TT();Za();ts();zD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},HD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},pm="context",GD=new ET,vT=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return vi(pm,e,Wr.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,HD([e,t,n],zD(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return pn(pm)||GD},r.prototype.disable=function(){this._getContextManager().disable(),Ai(pm,Wr.instance())},r}()});var wi,wT=We(()=>{"use strict";AT();wi=vT.getInstance()});var V,CT=We(()=>{"use strict";ts();V=Wr.instance()});var VD,RT,xT=We(()=>{"use strict";dm();VD=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return cm},r}(),RT=new VD});var mm,MT,_T=We(()=>{"use strict";xT();Za();ts();mm="metrics",MT=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return vi(mm,e,Wr.instance())},r.prototype.getMeterProvider=function(){return pn(mm)||RT},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){Ai(mm,Wr.instance())},r}()});var pc,PT=We(()=>{"use strict";_T();pc=MT.getInstance()});var De=We(()=>{"use strict";yT();sm();uc();dm();bT();wT();CT();PT()});import{Argument as Zh,Command as gW,Option as hW}from"@commander-js/extra-typings";import uF from"appium";import{z as Rd}from"zod";var CW=Rd.object({input:Rd.string(),agentConfigVersion:Rd.string().optional()});import{z as ct}from"zod";var MW=ct.object({srcs:ct.array(ct.string()),urls:ct.array(ct.string()),desiredSrc:ct.string().optional(),desiredUrl:ct.string().optional()}),tf=ct.object({srcRegex:ct.string().optional(),urlRegex:ct.string().optional()}),rf=ct.object({x:ct.number(),y:ct.number(),correlation:ct.number()}),_W=ct.object({searchImageBase64String:ct.string(),pageImageBase64String:ct.string(),id:ct.string().uuid(),timeoutMs:ct.number().max(1e4).min(0).optional()});import{z as _}from"zod";import*as N from"zod";import{extendZodWithOpenApi as E_}from"zod-openapi";E_(N);var bn=(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))(bn||{}),T_=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(),on=N.object({type:N.literal("GCS_TRACES"),traces:aa}),It=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(It||{}),nf=N.object({attributes:N.record(N.string(),N.string()).optional(),text:N.string().optional(),position:N.object({x1:N.number(),y1:N.number(),x2:N.number(),y2:N.number(),tolerance:N.nativeEnum(It)}).optional(),shape:N.object({width:N.number(),height:N.number(),tolerance:N.nativeEnum(It)}).optional(),boundingBox:N.object({x:N.number(),y:N.number(),width:N.number(),height:N.number()}).optional()}),v_=N.object({selectors:N.string().array(),requirements:nf.optional()}),En=N.object({id:N.number().int(),dataMomenticId:N.number().int().optional(),selector:N.string().optional(),hybridSelector:N.object({textContent:N.string().nullish(),attributes:N.record(N.string(),N.string().optional()),tagName:N.string(),expandShadowRoot:N.boolean().optional(),classNames:N.string().array(),nthChild:N.number()}).array().optional(),generatedSelectors:N.string().array().optional(),requirements:nf.optional(),additionalElements:v_.array().optional(),role:N.string().optional(),name:N.string().optional(),numChildren:N.number().optional(),content:N.string().optional(),pathFromRoot:N.string().optional(),serializedHtml:N.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:N.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:N.string().url().optional(),boundingBox:N.object({x:N.number().optional(),y:N.number().optional(),width:N.number(),height:N.number()}).describe("css pixel bounding box").optional(),frameCache:T_.optional(),inputDescription:N.string().optional().describe("the description that generated this cache"),targetSource:N.nativeEnum(bn).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:on.optional()}).openapi({ref:"ElementTargetCache"});function Qs(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var A_=N.object({type:N.literal("description"),elementDescriptor:N.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),w_=N.object({x:N.number(),y:N.number()}),C_=N.object({type:N.literal("coordinates"),pixels:w_}).openapi({ref:"CoordinatesTarget"});function Tn(r){return r.type==="description"}function Lr(r){return r.type==="coordinates"}var wt=N.discriminatedUnion("type",[A_,C_]).openapi({ref:"ElementTarget"});function xd(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function of(r){return on.safeParse(r).success}import{v4 as ve}from"uuid";import*as S from"zod";import{extendZodWithOpenApi as k_}from"zod-openapi";import{z as de}from"zod";import{extendZodWithOpenApi as R_}from"zod-openapi";import{z as la}from"zod";import af from"zod";var sa=af.object({updatedAt:af.coerce.date().optional()});var ca=la.object({result:la.boolean(),traceId:la.string()}).array(),ua=la.object({type:la.literal("GCS_TRACES"),traces:ca}),vn=sa.extend({memory:ua.optional()});R_(de);var sf=de.object({thoughts:de.string(),result:de.boolean(),relevantElements:de.array(de.number()).optional(),updatedMemory:ca.optional()}),Zt=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Zt||{});var x_=de.object({type:de.literal("ELEMENT_NAME"),negated:de.boolean().optional(),operation:de.nativeEnum(Zt),value:de.string()}).openapi({ref:"ElementNameAssertion"}),M_=de.object({type:de.literal("ELEMENT_STYLE"),negated:de.boolean().optional(),operation:de.nativeEnum(Zt),property:de.string(),value:de.string()}).openapi({ref:"ElementStyleAssertion"}),__=de.object({type:de.literal("ELEMENT_CONTENT"),negated:de.boolean().optional(),operation:de.nativeEnum(Zt),value:de.string()}).openapi({ref:"ElementContentAssertion"}),P_=de.object({type:de.literal("ELEMENT_ATTRIBUTE"),negated:de.boolean().optional(),operation:de.nativeEnum(Zt),attr:de.string(),value:de.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Nr=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Nr||{});var I_=de.object({type:de.literal("ELEMENT_EXISTENCE"),negated:de.boolean().optional(),condition:de.nativeEnum(Nr).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Zs=de.discriminatedUnion("type",[__,P_,I_,x_,M_]).openapi({ref:"ManualElementAssertion"});var O_=de.object({type:de.literal("CONTENT"),negated:de.boolean().optional(),value:de.string()}).openapi({ref:"PageContentAssertion"}),lf=de.discriminatedUnion("type",[O_]).openapi({ref:"ManualPageAssertion"});import Ot from"zod";var Md=Ot.discriminatedUnion("type",[Ot.object({type:Ot.literal("SUBSTRING"),url:Ot.string()}),Ot.object({type:Ot.literal("GLOB"),glob:Ot.string()}),Ot.object({type:Ot.literal("REGEX"),regex:Ot.string()}),Ot.object({type:Ot.literal("DOMAIN"),domain:Ot.string()})]),da=Ot.object({urlMatcher:Md,method:Ot.string().optional()});import{z as le}from"zod";var L_=le.object({type:le.literal("json"),content:le.string().describe("The JSON content to send in the request body")}),N_=le.object({type:le.literal("form-urlencoded"),content:le.record(le.string(),le.string()).describe("The form fields to send in the request body")}),D_=le.discriminatedUnion("type",[L_,N_]),ro=le.object({url:le.string(),method:le.union([le.literal("GET"),le.literal("POST"),le.literal("PUT"),le.literal("DELETE"),le.literal("PATCH")]),headers:le.record(le.string(),le.string()).optional(),params:le.record(le.string(),le.string()).optional(),body:D_.optional(),timeout:le.number().int().optional().describe("Max seconds to wait for the request to complete")}),cf=le.object({url:le.string(),headers:le.record(le.string(),le.string()).optional(),query:le.string(),variables:le.string().optional(),timeout:le.number().int().optional().describe("Max seconds to wait for the request to complete")}),el=le.object({code:le.string(),fragment:le.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:le.union([le.literal("NODE"),le.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:le.number().int().max(60).optional().describe("Max seconds for the code to complete")});var nt=(Y=>(Y.AI_EXTRACT="AI_EXTRACT",Y.AI_ASSERTION="AI_ASSERTION",Y.AUTH_LOAD="AUTH_LOAD",Y.AUTH_SAVE="AUTH_SAVE",Y.BLUR="BLUR",Y.CAPTCHA="CAPTCHA",Y.CLICK="CLICK",Y.COOKIE="COOKIE",Y.COPY="COPY",Y.DIALOG="DIALOG",Y.DRAG="DRAG",Y.ELEMENT_CHECK="ELEMENT_CHECK",Y.FILE_UPLOAD="FILE_UPLOAD",Y.FOCUS="FOCUS",Y.GO_BACK="GO_BACK",Y.GO_FORWARD="GO_FORWARD",Y.HOVER="HOVER",Y.JAVASCRIPT="JAVASCRIPT",Y.LOCAL_STORAGE="LOCAL_STORAGE",Y.MOUSE_DRAG="MOUSE_DRAG",Y.NAVIGATE="NAVIGATE",Y.NEW_TAB="NEW_TAB",Y.PAGE_CHECK="PAGE_CHECK",Y.PASTE="PASTE",Y.PRESS="PRESS",Y.KEY_DOWN="KEY_DOWN",Y.KEY_UP="KEY_UP",Y.REFRESH="REFRESH",Y.REQUEST="REQUEST",Y.GRAPHQL_REQUEST="GRAPHQL_REQUEST",Y.SCROLL_DOWN="SCROLL_DOWN",Y.SCROLL_UP="SCROLL_UP",Y.SCROLL_LEFT="SCROLL_LEFT",Y.SCROLL_RIGHT="SCROLL_RIGHT",Y.SELECT_OPTION="SELECT_OPTION",Y.SWITCH_TAB="TAB",Y.TYPE="TYPE",Y.VISUAL_DIFF="VISUAL_DIFF",Y.WAIT="WAIT",Y.WAIT_FOR_URL="WAIT_FOR_URL",Y.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",Y.AWAIT_LISTENER="AWAIT_LISTENER",Y.RECORD_REQUESTS="RECORD_REQUESTS",Y.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",Y.SET_HEADER="SET_HEADER",Y.MOCK_ROUTE="MOCK_ROUTE",Y.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",Y.OFFLINE_MODE="OFFLINE_MODE",Y.SUCCESS="SUCCESS",Y))(nt||{});k_(S);var X=S.object({thoughts:S.string().optional(),id:S.string().uuid().describe("unique identifier to this step, used for step cache")}),er=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"}),tr=sa.extend({target:En}).optional().openapi({ref:"SingleTargetCache"});function uf(r){return tr.safeParse(r).success}var tl=S.object({loadTimeout:S.number().int().max(60).optional().describe("Max seconds for the page to load")}),df=X.merge(tl).merge(S.object({type:S.literal("NAVIGATE"),url:S.string()})).openapi({ref:"NavigateCommand"}),rl=er.merge(S.object({cache:tr})),no=X.merge(rl.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_UP"),deltaY:S.number().optional()}))).openapi({ref:"ScrollUpCommand"}),oo=X.merge(rl.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_DOWN"),deltaY:S.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Wo=X.merge(rl.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_LEFT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),jo=X.merge(rl.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_RIGHT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollRightCommand"}),sj=S.discriminatedUnion("type",[no,oo,Wo,jo]).openapi({ref:"AllScrollCommands"}),U_=X.merge(S.object({type:S.literal("DIALOG"),action:S.union([S.literal("ACCEPT"),S.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),pf=X.merge(S.object({type:S.literal("WAIT"),delay:S.number()})).openapi({ref:"WaitCommand"}),F_=S.object({caseInsensitive:S.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:S.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:S.number().int().optional().describe("Max seconds to wait for the URL to match")}),mf=X.extend({type:S.literal("WAIT_FOR_URL"),matcher:Md}).merge(F_).openapi({ref:"WaitUrlCommand"}),gf=X.merge(tl).merge(S.object({type:S.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),hf=X.merge(S.object({type:S.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),ff=X.merge(S.object({type:S.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),B_=X.extend({type:S.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),z_=X.extend({type:S.literal("AUTH_LOAD"),storageState:S.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Pd=X.merge(er).extend({type:S.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Sf=X.extend({type:S.literal("COPY"),value:S.string()}).openapi({ref:"CopyCommand"}),yf=X.extend({type:S.literal("PASTE")}).openapi({ref:"PasteCommand"}),bf=X.merge(el).extend({type:S.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),$o=X.merge(er).extend({type:S.literal("CLICK"),target:wt,doubleClick:S.boolean().optional(),rightClick:S.boolean().optional(),waitForDownload:S.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:S.number().optional(),downloadTimeoutMs:S.number().optional(),cache:tr,relativePosition:S.object({x:S.number(),y:S.number()}).optional()}).openapi({ref:"ClickCommand"}),Ef=sa.extend({fromTarget:En.optional(),toTarget:En.optional()}),qo=X.merge(er).merge(S.object({type:S.literal("DRAG"),fromTarget:wt,toTarget:wt,steps:S.number().optional(),hoverSeconds:S.number().optional().describe("Seconds to hover the object before dropping"),cache:Ef.optional()})).openapi({ref:"DragCommand"}),Ko=X.merge(er).merge(S.object({type:S.literal("MOUSE_DRAG"),target:wt.optional(),deltaX:S.string().describe("pixels to move horizontally, can be template"),deltaY:S.string().describe("pixels to move vertically, can be template"),steps:S.number().optional(),cache:tr})).openapi({ref:"MouseDragCommand"}),Yo=X.merge(er).merge(S.object({type:S.literal("HOVER"),target:wt,cache:tr})).openapi({ref:"HoverCommand"}),pa=X.merge(er).merge(S.object({type:S.literal("FOCUS"),target:wt,cache:tr})).openapi({ref:"FocusCommand"}),ma=X.merge(er).extend({type:S.literal("BLUR"),target:wt.optional(),cache:tr}).openapi({ref:"BlurCommand"}),H_=S.object({type:S.literal("URL"),url:S.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),G_=S.object({type:S.literal("USER_FILE"),name:S.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),V_=X.extend({type:S.literal("FILE_UPLOAD"),fileSource:S.discriminatedUnion("type",[H_,G_]),filename:S.string().optional()}).openapi({ref:"FileUploadCommand"}),Tf=S.discriminatedUnion("type",[S.object({type:S.literal("VALUE"),value:S.string()}),S.object({type:S.literal("LABEL"),label:S.string()}),S.object({type:S.literal("INDEX"),index:S.coerce.string()})]),Xo=X.merge(er).extend({type:S.literal("SELECT_OPTION"),target:wt,cache:tr,choice:Tf.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Id=S.union([S.literal("MULTIMODAL"),S.literal("VISION_ONLY")]),ga=X.merge(S.object({type:S.literal("AI_ASSERTION"),assertion:S.string(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional(),contextChoice:Id.optional(),timeout:S.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:vn.optional()})).openapi({ref:"AIAssertionCommand"}),Lt=5,Jo=600,Qo=X.merge(er).extend({type:S.literal("ELEMENT_CHECK"),target:wt,assertion:Zs,cache:tr.or(vn).optional(),timeout:S.number().int().min(0).max(Jo).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),vf=X.extend({type:S.literal("PAGE_CHECK"),assertion:lf,iframeUrl:S.string().optional().describe("url or url regex for the iframe"),timeout:S.number().int().min(0).max(Jo).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Af=X.merge(S.object({type:S.literal("AI_EXTRACT"),goal:S.string(),schema:S.string().optional(),envKey:S.string().optional(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional()})).openapi({ref:"AIExtractCommand"}),W_=S.object({clearContent:S.boolean().optional(),forceClearContent:S.boolean().optional(),delay:S.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:S.boolean().optional(),pressEnter:S.boolean().optional(),relativePosition:S.object({x:S.number(),y:S.number()}).optional()}),wf=25,Zo=X.merge(er).merge(W_).extend({type:S.literal("TYPE"),target:wt.optional(),value:S.string(),cache:tr}).openapi({ref:"TypeCommand"}),Cf=X.merge(S.object({type:S.literal("PRESS"),value:S.string(),repeat:S.number().optional(),convertMeta:S.boolean().optional(),delayMs:S.number().optional()})).openapi({ref:"PressCommand"}),Rf=X.merge(S.object({type:S.literal("KEY_DOWN"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyDownCommand"}),xf=X.merge(S.object({type:S.literal("KEY_UP"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyUpCommand"}),j_=S.object({type:S.literal("SUBSTRING"),substring:S.string()}),$_=S.object({type:S.literal("REGEX"),pattern:S.string()}),q_=S.object({type:S.literal("INDEX"),index:S.coerce.string()}),K_=S.discriminatedUnion("type",[j_,$_,q_]),Y_=X.merge(tl).merge(S.object({type:S.literal("TAB"),action:K_})).openapi({ref:"TabCommand"}),Mf=X.merge(tl).merge(S.object({type:S.literal("NEW_TAB"),url:S.string()})).openapi({ref:"NewTabCommand"}),X_=X.merge(S.object({type:S.literal("COOKIE"),value:S.string()})).openapi({ref:"CookieCommand"}),_f=X.merge(S.object({type:S.literal("LOCAL_STORAGE"),key:S.string(),value:S.string()})).openapi({ref:"LocalStorageCommand"}),Pf=X.extend({type:S.literal("REQUEST")}).merge(ro).openapi({ref:"RequestCommand"}),nl=S.object({status:S.number().optional(),headers:S.record(S.string(),S.string()),json:S.unknown().optional(),text:S.string().optional(),cookies:S.record(S.string(),S.unknown()).array().optional(),request:S.object({url:S.string(),method:S.string(),headers:S.record(S.string(),S.string()),json:S.unknown().optional()})}),If=X.extend({type:S.literal("GRAPHQL_REQUEST")}).merge(cf).openapi({ref:"GraphQLRequestCommand"}),Of=X.merge(S.object({type:S.literal("SUCCESS"),condition:ga.optional()})).openapi({ref:"SuccessCommand"}),Lf=X.merge(S.object({type:S.literal("FAILURE")})).openapi({ref:"FailureCommand"}),J_=S.object({data:S.string().describe("location at which to find a jpg"),width:S.number(),height:S.number()}),ha=X.merge(er).merge(S.object({type:S.literal("VISUAL_DIFF"),threshold:S.number().optional().describe("default 0.1"),target:wt.optional(),screenshot:J_.optional(),cache:tr})).openapi({ref:"VisualDiffCommand"}),Q_=X.merge(S.object({type:S.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:da,key:S.string()})).openapi({ref:"RegisterRequestListenerCommand"}),Z_=X.merge(S.object({type:S.literal("AWAIT_LISTENER"),key:S.string(),timeout:S.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),eP=X.merge(S.object({type:S.literal("RECORD_REQUESTS"),requestMatcher:da,key:S.string()})).openapi({ref:"RecordRequestsCommand"}),tP=X.merge(S.object({type:S.literal("GET_RECORDED_REQUESTS"),key:S.string()})).openapi({ref:"GetRecordedRequestsCommand"}),rP=X.merge(S.object({type:S.literal("SET_HEADER"),name:S.string(),value:S.string(),requestMatcher:da.optional()})).openapi({ref:"SetHeaderCommand"}),nP=X.merge(S.object({type:S.literal("MOCK_ROUTE"),requestMatcher:da,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"})),oP=X.merge(S.object({type:S.literal("REMOVE_ROUTE_MOCK"),key:S.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),iP=X.merge(S.object({type:S.literal("OFFLINE_MODE"),enable:S.boolean()})).openapi({ref:"OfflineModeCommand"}),aP=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],lj=[...aP,"DRAG"],sP=S.discriminatedUnion("type",[$o,Zo,Cf,Rf,xf,Xo,df,oo,no,ga,hf,Yo,pf]),lP=S.discriminatedUnion("type",[...sP.options,qo]),cP=S.discriminatedUnion("type",[...lP.options]),Nf=S.discriminatedUnion("type",[...cP.options,Of]),Od=S.discriminatedUnion("type",[Of,$o,Zo,Cf,Rf,xf,Xo,df,oo,no,ga,hf,Yo,pf,bf,Qo,vf,Mf,mf,Af,Sf,ff,_f,qo,Ko,yf,gf,Pf,If]),uP=S.discriminatedUnion("type",[Af,z_,B_,Pd,X_,Sf,U_,Qo,V_,ff,bf,_f,Ko,Mf,vf,yf,gf,Pf,If,Wo,jo,Y_,ha,pa,ma,mf,Q_,Z_,eP,tP,rP,nP,oP,iP]),ei=S.discriminatedUnion("type",[...Nf.options,...uP.options]).openapi({ref:"Command"}),ol=S.discriminatedUnion("type",[...Nf.options,Lf]),cj=S.discriminatedUnion("type",[...Od.options,Lf]);function an(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:ve(),type:r};break;case"AUTH_LOAD":{e={id:ve(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:ve(),type:r,goal:""};break;case"DIALOG":e={id:ve(),type:r,action:"DISMISS"};break;case"DRAG":e={id:ve(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ve(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ve(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ve(),type:r,delay:1};break;case"BLUR":e={id:ve(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ve(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:ve(),type:r,value:""};break;case"SELECT_OPTION":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:ve(),type:r,url:""};case"TAB":e={id:ve(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ve(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ve(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ve(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:ve(),type:r,code:""};break;case"AI_ASSERTION":e={id:ve(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:ve(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:ve(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:ve(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ve(),type:r,key:""};break}case"SET_HEADER":{e={id:ve(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:ve(),type:r};break}case"OFFLINE_MODE":{e={id:ve(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Df(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as dP}from"zod";var gj=dP.discriminatedUnion("type",[ma,Pd,$o,qo,pa,Yo,Ko,no,oo,Wo,jo,Xo,Zo,ha,Qo]);import{z as pP}from"zod";import{z as wn}from"zod";function fa(r){return wn.object({key:wn.string(),testId:wn.string().optional(),moduleId:wn.string().optional(),organizationId:wn.string(),value:r})}function Sa(r){return fa(r).extend({uniqueKey:wn.string()})}function il(r){return wn.record(wn.string(),Sa(r))}var Nt={type:!0,cache:!0},ti=pP.discriminatedUnion("type",[ga.pick(Nt),ma.pick(Nt),$o.pick(Nt),qo.pick(Nt),Qo.pick(Nt),pa.pick(Nt),Yo.pick(Nt),Ko.pick(Nt),no.pick(Nt),oo.pick(Nt),Wo.pick(Nt),jo.pick(Nt),Xo.pick(Nt),Zo.pick(Nt),ha.pick(Nt)]),Ld=Object.values(nt).filter(r=>ti.options.some(e=>e.shape.type.safeParse(r).success));ei.options.forEach(r=>{if("target"in r.shape&&!Ld.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function Nd(r){return Ld.includes(r.type)}var kf=fa(ti),Uf=Sa(ti),vj=il(ti);import{v4 as v2}from"uuid";import{z as T}from"zod";var Bf=Symbol("Let zodToJsonSchema decide on which parser to use");var Ff={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},zf=r=>typeof r=="string"?{...Ff,name:r}:{...Ff,...r};var Hf=r=>{let e=zf(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function Dd(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function Se(r,e,t,n,o){r[e]=t,Dd(r,e,n,o)}var al=(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 he}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"?al(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as mP}from"zod";function Gf(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==mP.ZodAny&&(t.items=J(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&Se(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&Se(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(Se(t,"minItems",r.exactLength.value,r.exactLength.message,e),Se(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function Vf(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?Se(t,"minimum",n.value,n.message,e):Se(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),Se(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?Se(t,"maximum",n.value,n.message,e):Se(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),Se(t,"maximum",n.value,n.message,e));break;case"multipleOf":Se(t,"multipleOf",n.value,n.message,e);break}return t}function Wf(){return{type:"boolean"}}function sl(r,e){return J(r.type._def,e)}var jf=(r,e)=>J(r.innerType._def,e);function kd(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>kd(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 gP(r,e)}}var gP=(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":Se(t,"minimum",n.value,n.message,e);break;case"max":Se(t,"maximum",n.value,n.message,e);break}return t};function $f(r,e){return{...J(r.innerType._def,e),default:r.defaultValue()}}function qf(r,e){return e.effectStrategy==="input"?J(r.schema._def,e):ze(e)}function Kf(r){return{type:"string",enum:Array.from(r.values)}}var hP=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function Yf(r,e){let t=[J(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),J(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(hP(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function Xf(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as ya}from"zod";var Ud,Tr={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:()=>(Ud===void 0&&(Ud=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Ud),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 ll(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":Se(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":Se(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":vr(t,"email",n.message,e);break;case"format:idn-email":vr(t,"idn-email",n.message,e);break;case"pattern:zod":Dt(t,Tr.email,n.message,e);break}break;case"url":vr(t,"uri",n.message,e);break;case"uuid":vr(t,"uuid",n.message,e);break;case"regex":Dt(t,n.regex,n.message,e);break;case"cuid":Dt(t,Tr.cuid,n.message,e);break;case"cuid2":Dt(t,Tr.cuid2,n.message,e);break;case"startsWith":Dt(t,RegExp(`^${Fd(n.value,e)}`),n.message,e);break;case"endsWith":Dt(t,RegExp(`${Fd(n.value,e)}$`),n.message,e);break;case"datetime":vr(t,"date-time",n.message,e);break;case"date":vr(t,"date",n.message,e);break;case"time":vr(t,"time",n.message,e);break;case"duration":vr(t,"duration",n.message,e);break;case"length":Se(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),Se(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Dt(t,RegExp(Fd(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&vr(t,"ipv4",n.message,e),n.version!=="v4"&&vr(t,"ipv6",n.message,e);break}case"base64url":Dt(t,Tr.base64url,n.message,e);break;case"jwt":Dt(t,Tr.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Dt(t,Tr.ipv4Cidr,n.message,e),n.version!=="v4"&&Dt(t,Tr.ipv6Cidr,n.message,e);break}case"emoji":Dt(t,Tr.emoji(),n.message,e);break;case"ulid":{Dt(t,Tr.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{vr(t,"binary",n.message,e);break}case"contentEncoding:base64":{Se(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Dt(t,Tr.base64,n.message,e);break}}break}case"nanoid":Dt(t,Tr.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Fd(r,e){return e.patternStrategy==="escape"?SP(r):r}var fP=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function SP(r){let e="";for(let t=0;t<r.length;t++)fP.has(r[t])||(e+="\\"),e+=r[t];return e}function vr(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}}})):Se(r,"format",e,t,n)}function Dt(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:Jf(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):Se(r,"pattern",Jf(e,n),t,n)}function Jf(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(t.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(t.m){if(n[c]==="^"){o+=`(^|(?<=[\r
|
|
3
3
|
]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
|
|
4
4
|
]))`;continue}}if(t.s&&n[c]==="."){o+=a?`${n[c]}\r
|
|
5
5
|
`:`[${n[c]}\r
|
|
6
|
-
]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),r.source}return o}function il(r,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&r.keyType?._def.typeName===pa.ZodEnum)return{type:"object",required:r.keyType._def.values,properties:r.keyType._def.values.reduce((n,o)=>({...n,[o]:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??ze(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(r.keyType?._def.typeName===pa.ZodString&&r.keyType._def.checks?.length){let{type:n,...o}=ol(r.keyType._def,e);return{...t,propertyNames:o}}else{if(r.keyType?._def.typeName===pa.ZodEnum)return{...t,propertyNames:{enum:r.keyType._def.values}};if(r.keyType?._def.typeName===pa.ZodBranded&&r.keyType._def.type._def.typeName===pa.ZodString&&r.keyType._def.type._def.checks?.length){let{type:n,...o}=nl(r.keyType._def,e);return{...t,propertyNames:o}}}return t}function Qf(r,e){if(e.mapStrategy==="record")return il(r,e);let t=J(r.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||ze(e),n=J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||ze(e);return{type:"array",maxItems:125,items:{type:"array",items:[t,n],minItems:2,maxItems:2}}}function Zf(r){let e=r.values,n=Object.keys(r.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function eS(r){return r.target==="openAi"?void 0:{not:ze({...r,currentPath:[...r.currentPath,"not"]})}}function tS(r){return r.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var ga={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function nS(r,e){if(e.target==="openApi3")return rS(r,e);let t=r.options instanceof Map?Array.from(r.options.values()):r.options;if(t.every(n=>n._def.typeName in ga&&(!n._def.checks||!n._def.checks.length))){let n=t.reduce((o,i)=>{let a=ga[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(t.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=t.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===t.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:t.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(t.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return rS(r,e)}var rS=(r,e)=>{let t=(r.options instanceof Map?Array.from(r.options.values()):r.options).map((n,o)=>J(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return t.length?{anyOf:t}:void 0};function oS(r,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(r.innerType._def.typeName)&&(!r.innerType._def.checks||!r.innerType._def.checks.length))return e.target==="openApi3"?{type:ga[r.innerType._def.typeName],nullable:!0}:{type:[ga[r.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=J(r.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function iS(r,e){let t={type:"number"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"int":t.type="integer",Id(t,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?fe(t,"minimum",n.value,n.message,e):fe(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),fe(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?fe(t,"maximum",n.value,n.message,e):fe(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),fe(t,"maximum",n.value,n.message,e));break;case"multipleOf":fe(t,"multipleOf",n.value,n.message,e);break}return t}function aS(r,e){let t=e.target==="openAi",n={type:"object",properties:{}},o=[],i=r.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=fP(c);l&&t&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=J(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=hP(r,e);return a!==void 0&&(n.additionalProperties=a),n}function hP(r,e){if(r.catchall._def.typeName!=="ZodNever")return J(r.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(r.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function fP(r){try{return r.isOptional()}catch{return!0}}var sS=(r,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return J(r.innerType._def,e);let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:ze(e)},t]}:ze(e)};var lS=(r,e)=>{if(e.pipeStrategy==="input")return J(r.in._def,e);if(e.pipeStrategy==="output")return J(r.out._def,e);let t=J(r.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=J(r.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,n].filter(o=>o!==void 0)}};function cS(r,e){return J(r.type._def,e)}function uS(r,e){let n={type:"array",uniqueItems:!0,items:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return r.minSize&&fe(n,"minItems",r.minSize.value,r.minSize.message,e),r.maxSize&&fe(n,"maxItems",r.maxSize.value,r.maxSize.message,e),n}function dS(r,e){return r.rest?{type:"array",minItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[]),additionalItems:J(r.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:r.items.length,maxItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[])}}function mS(r){return{not:ze(r)}}function pS(r){return ze(r)}var gS=(r,e)=>J(r.innerType._def,e);var hS=(r,e,t)=>{switch(e){case ge.ZodString:return ol(r,t);case ge.ZodNumber:return iS(r,t);case ge.ZodObject:return aS(r,t);case ge.ZodBigInt:return Vf(r,t);case ge.ZodBoolean:return Wf();case ge.ZodDate:return Od(r,t);case ge.ZodUndefined:return mS(t);case ge.ZodNull:return tS(t);case ge.ZodArray:return Gf(r,t);case ge.ZodUnion:case ge.ZodDiscriminatedUnion:return nS(r,t);case ge.ZodIntersection:return Yf(r,t);case ge.ZodTuple:return dS(r,t);case ge.ZodRecord:return il(r,t);case ge.ZodLiteral:return Xf(r,t);case ge.ZodEnum:return Kf(r);case ge.ZodNativeEnum:return Zf(r);case ge.ZodNullable:return oS(r,t);case ge.ZodOptional:return sS(r,t);case ge.ZodMap:return Qf(r,t);case ge.ZodSet:return uS(r,t);case ge.ZodLazy:return()=>r.getter()._def;case ge.ZodPromise:return cS(r,t);case ge.ZodNaN:case ge.ZodNever:return eS(t);case ge.ZodEffects:return qf(r,t);case ge.ZodAny:return ze(t);case ge.ZodUnknown:return pS(t);case ge.ZodDefault:return $f(r,t);case ge.ZodBranded:return nl(r,t);case ge.ZodReadonly:return gS(r,t);case ge.ZodCatch:return jf(r,t);case ge.ZodPipeline:return lS(r,t);case ge.ZodFunction:case ge.ZodVoid:case ge.ZodSymbol:return;default:return(n=>{})(e)}};function J(r,e,t=!1){let n=e.seen.get(r);if(e.override){let s=e.override?.(r,e,n,t);if(s!==Bf)return s}if(n&&!t){let s=SP(n,e);if(s!==void 0)return s}let o={def:r,path:e.currentPath,jsonSchema:void 0};e.seen.set(r,o);let i=hS(r,r.typeName,e),a=typeof i=="function"?J(i(),e):i;if(a&&yP(r,e,a),e.postProcess){let s=e.postProcess(a,r,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var SP=(r,e)=>{switch(e.$refStrategy){case"root":return{$ref:r.path.join("/")};case"relative":return{$ref:rl(e.currentPath,r.path)};case"none":case"seen":return r.path.length<e.currentPath.length&&r.path.every((t,n)=>e.currentPath[n]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),ze(e)):e.$refStrategy==="seen"?ze(e):void 0}},yP=(r,e,t)=>(r.description&&(t.description=r.description,e.markdownDescription&&(t.markdownDescription=r.description)),t);var ha=(r,e)=>{let t=Hf(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:J(u._def,{...t,currentPath:[...t.basePath,t.definitionPath,l]},!0)??ze(t)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=J(r._def,o===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,o]},!1)??ze(t),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),t.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[t.openAiAnyTypeName]||(n[t.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:t.$refStrategy==="relative"?"1":[...t.basePath,t.definitionPath,t.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[t.definitionPath]:n}:i:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,o].join("/"),[t.definitionPath]:{...n,[o]:i}};return t.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as Lr}from"zod";import{extendZodWithOpenApi as bP}from"zod-openapi";bP(Lr);var Re=(m=>(m.AI_PROVIDER="AIProviderError",m.USER_INFRA="UserInfrastructureError",m.ACTION_FAILURE="ActionFailureError",m.ASSERTION_FAILURE="AssertionFailureError",m.CONFIG_ERROR="UserConfigurationError",m.SETUP_FAILURE="SetupFailureError",m.TEARDOWN_FAILURE="TeardownFailureError",m.WEB_AGENT_PLATFORM="InternalWebAgentError",m.UNKNOWN_PLATFORM="InternalPlatformError",m.JOB_TIMEOUT="JobTimeoutError",m.CONCURRENCY_ERROR="ConcurrencyError",m.UNKNOWN="UnknownError",m))(Re||{});var Dd=Lr.object({reason:Lr.nativeEnum(Re),previousStepsDescription:Lr.array(Lr.string()).optional(),summary:Lr.string(),rootCause:Lr.string().optional()}).openapi({ref:"TestResultClassification"}),al=Lr.object({errorMessage:Lr.string(),errorStack:Lr.string().optional(),classification:Dd.optional()}).openapi({ref:"TestFailureDetails"});var sl=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var fa=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};var x=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(Re))if(t.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?t:`${e}: ${t}`,n?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message}}},vn=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}},An=class extends Error{constructor(e,t={}){super(e,t),this.name="NoMatchingElementError"}},Nr=class extends Error{decisions;cacheMissReason;constructor(e,t,n,o={}){super(e,o),this.decisions=t,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
|
|
6
|
+
]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),r.source}return o}function cl(r,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&r.keyType?._def.typeName===ya.ZodEnum)return{type:"object",required:r.keyType._def.values,properties:r.keyType._def.values.reduce((n,o)=>({...n,[o]:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??ze(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(r.keyType?._def.typeName===ya.ZodString&&r.keyType._def.checks?.length){let{type:n,...o}=ll(r.keyType._def,e);return{...t,propertyNames:o}}else{if(r.keyType?._def.typeName===ya.ZodEnum)return{...t,propertyNames:{enum:r.keyType._def.values}};if(r.keyType?._def.typeName===ya.ZodBranded&&r.keyType._def.type._def.typeName===ya.ZodString&&r.keyType._def.type._def.checks?.length){let{type:n,...o}=sl(r.keyType._def,e);return{...t,propertyNames:o}}}return t}function Qf(r,e){if(e.mapStrategy==="record")return cl(r,e);let t=J(r.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||ze(e),n=J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||ze(e);return{type:"array",maxItems:125,items:{type:"array",items:[t,n],minItems:2,maxItems:2}}}function Zf(r){let e=r.values,n=Object.keys(r.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function eS(r){return r.target==="openAi"?void 0:{not:ze({...r,currentPath:[...r.currentPath,"not"]})}}function tS(r){return r.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var ba={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function nS(r,e){if(e.target==="openApi3")return rS(r,e);let t=r.options instanceof Map?Array.from(r.options.values()):r.options;if(t.every(n=>n._def.typeName in ba&&(!n._def.checks||!n._def.checks.length))){let n=t.reduce((o,i)=>{let a=ba[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(t.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=t.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===t.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:t.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(t.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return rS(r,e)}var rS=(r,e)=>{let t=(r.options instanceof Map?Array.from(r.options.values()):r.options).map((n,o)=>J(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return t.length?{anyOf:t}:void 0};function oS(r,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(r.innerType._def.typeName)&&(!r.innerType._def.checks||!r.innerType._def.checks.length))return e.target==="openApi3"?{type:ba[r.innerType._def.typeName],nullable:!0}:{type:[ba[r.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=J(r.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function iS(r,e){let t={type:"number"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"int":t.type="integer",Dd(t,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?Se(t,"minimum",n.value,n.message,e):Se(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),Se(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?Se(t,"maximum",n.value,n.message,e):Se(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),Se(t,"maximum",n.value,n.message,e));break;case"multipleOf":Se(t,"multipleOf",n.value,n.message,e);break}return t}function aS(r,e){let t=e.target==="openAi",n={type:"object",properties:{}},o=[],i=r.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=bP(c);l&&t&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=J(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=yP(r,e);return a!==void 0&&(n.additionalProperties=a),n}function yP(r,e){if(r.catchall._def.typeName!=="ZodNever")return J(r.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(r.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function bP(r){try{return r.isOptional()}catch{return!0}}var sS=(r,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return J(r.innerType._def,e);let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:ze(e)},t]}:ze(e)};var lS=(r,e)=>{if(e.pipeStrategy==="input")return J(r.in._def,e);if(e.pipeStrategy==="output")return J(r.out._def,e);let t=J(r.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=J(r.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,n].filter(o=>o!==void 0)}};function cS(r,e){return J(r.type._def,e)}function uS(r,e){let n={type:"array",uniqueItems:!0,items:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return r.minSize&&Se(n,"minItems",r.minSize.value,r.minSize.message,e),r.maxSize&&Se(n,"maxItems",r.maxSize.value,r.maxSize.message,e),n}function dS(r,e){return r.rest?{type:"array",minItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[]),additionalItems:J(r.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:r.items.length,maxItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[])}}function pS(r){return{not:ze(r)}}function mS(r){return ze(r)}var gS=(r,e)=>J(r.innerType._def,e);var hS=(r,e,t)=>{switch(e){case he.ZodString:return ll(r,t);case he.ZodNumber:return iS(r,t);case he.ZodObject:return aS(r,t);case he.ZodBigInt:return Vf(r,t);case he.ZodBoolean:return Wf();case he.ZodDate:return kd(r,t);case he.ZodUndefined:return pS(t);case he.ZodNull:return tS(t);case he.ZodArray:return Gf(r,t);case he.ZodUnion:case he.ZodDiscriminatedUnion:return nS(r,t);case he.ZodIntersection:return Yf(r,t);case he.ZodTuple:return dS(r,t);case he.ZodRecord:return cl(r,t);case he.ZodLiteral:return Xf(r,t);case he.ZodEnum:return Kf(r);case he.ZodNativeEnum:return Zf(r);case he.ZodNullable:return oS(r,t);case he.ZodOptional:return sS(r,t);case he.ZodMap:return Qf(r,t);case he.ZodSet:return uS(r,t);case he.ZodLazy:return()=>r.getter()._def;case he.ZodPromise:return cS(r,t);case he.ZodNaN:case he.ZodNever:return eS(t);case he.ZodEffects:return qf(r,t);case he.ZodAny:return ze(t);case he.ZodUnknown:return mS(t);case he.ZodDefault:return $f(r,t);case he.ZodBranded:return sl(r,t);case he.ZodReadonly:return gS(r,t);case he.ZodCatch:return jf(r,t);case he.ZodPipeline:return lS(r,t);case he.ZodFunction:case he.ZodVoid:case he.ZodSymbol:return;default:return(n=>{})(e)}};function J(r,e,t=!1){let n=e.seen.get(r);if(e.override){let s=e.override?.(r,e,n,t);if(s!==Bf)return s}if(n&&!t){let s=EP(n,e);if(s!==void 0)return s}let o={def:r,path:e.currentPath,jsonSchema:void 0};e.seen.set(r,o);let i=hS(r,r.typeName,e),a=typeof i=="function"?J(i(),e):i;if(a&&TP(r,e,a),e.postProcess){let s=e.postProcess(a,r,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var EP=(r,e)=>{switch(e.$refStrategy){case"root":return{$ref:r.path.join("/")};case"relative":return{$ref:al(e.currentPath,r.path)};case"none":case"seen":return r.path.length<e.currentPath.length&&r.path.every((t,n)=>e.currentPath[n]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),ze(e)):e.$refStrategy==="seen"?ze(e):void 0}},TP=(r,e,t)=>(r.description&&(t.description=r.description,e.markdownDescription&&(t.markdownDescription=r.description)),t);var Ea=(r,e)=>{let t=Hf(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:J(u._def,{...t,currentPath:[...t.basePath,t.definitionPath,l]},!0)??ze(t)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=J(r._def,o===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,o]},!1)??ze(t),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),t.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[t.openAiAnyTypeName]||(n[t.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:t.$refStrategy==="relative"?"1":[...t.basePath,t.definitionPath,t.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[t.definitionPath]:n}:i:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,o].join("/"),[t.definitionPath]:{...n,[o]:i}};return t.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as Dr}from"zod";import{extendZodWithOpenApi as vP}from"zod-openapi";vP(Dr);var Re=(p=>(p.AI_PROVIDER="AIProviderError",p.USER_INFRA="UserInfrastructureError",p.ACTION_FAILURE="ActionFailureError",p.ASSERTION_FAILURE="AssertionFailureError",p.CONFIG_ERROR="UserConfigurationError",p.SETUP_FAILURE="SetupFailureError",p.TEARDOWN_FAILURE="TeardownFailureError",p.WEB_AGENT_PLATFORM="InternalWebAgentError",p.UNKNOWN_PLATFORM="InternalPlatformError",p.JOB_TIMEOUT="JobTimeoutError",p.CONCURRENCY_ERROR="ConcurrencyError",p.UNKNOWN="UnknownError",p))(Re||{});var Bd=Dr.object({reason:Dr.nativeEnum(Re),previousStepsDescription:Dr.array(Dr.string()).optional(),summary:Dr.string(),rootCause:Dr.string().optional()}).openapi({ref:"TestResultClassification"}),ul=Dr.object({errorMessage:Dr.string(),errorStack:Dr.string().optional(),classification:Bd.optional()}).openapi({ref:"TestFailureDetails"});var dl=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var Ta=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};var x=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(Re))if(t.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?t:`${e}: ${t}`,n?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message}}},Cn=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}},Rn=class extends Error{constructor(e,t={}){super(e,t),this.name="NoMatchingElementError"}},kr=class extends Error{decisions;cacheMissReason;constructor(e,t,n,o={}){super(e,o),this.decisions=t,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
|
|
7
7
|
Decisions:
|
|
8
8
|
${this.decisions.map(e=>e.toString()).join(`
|
|
9
|
-
`)}`}};function fS(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function kd(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}var Dr=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},ll=class extends Dr{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},cl=class extends Dr{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function Ud(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}var Fd="Element to be clicked has no bounding box";function SS(r){return r instanceof Error?r.message.startsWith(Fd):!1}function Bd(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}function zd(r){return r instanceof Error?r.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||r.message.includes("Could not resolve backend node"):!1}var Sa=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};function ul(r){return r instanceof Error?r.message:String(r)}var EP={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST."};Md.options.forEach(r=>{let e=r.shape.type.value;if(e!=="SUCCESS"&&!EP[e])throw new Error(`Command type ${e} is missing a description`)});var yS=T.object({type:T.literal("CLICK"),description:T.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:T.boolean().or(T.null()),rightClick:T.boolean().or(T.null())}),bS=T.object({type:T.literal("TYPE"),description:T.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:T.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:T.boolean().or(T.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:T.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),ES=T.object({type:T.literal("GO_BACK")}),TP=T.object({type:T.literal("GO_FORWARD")}),vP=T.object({type:T.literal("LOCAL_STORAGE"),key:T.string().describe("The localStorage key to set or get."),value:T.string().describe("The value to store in localStorage. If reading, this can be empty.")}),TS=T.object({type:T.literal("PRESS"),keys:T.array(T.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),vS=T.object({type:T.literal("SELECT_OPTION"),description:T.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:T.discriminatedUnion("type",[T.object({type:T.literal("VALUE"),value:T.string()}),T.object({type:T.literal("LABEL"),label:T.string()}),T.object({type:T.literal("INDEX"),index:T.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),AS=T.object({type:T.literal("NAVIGATE"),url:T.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),wS=T.object({type:T.literal("SCROLL"),y:T.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),CS=T.object({type:T.literal("WAIT"),timeout:T.number().describe("The number of seconds to wait.")}),RS=T.object({type:T.literal("AI_ASSERTION"),assertion:T.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:T.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),xS=T.object({type:T.literal("HOVER"),description:T.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),AP=T.object({type:T.literal("COPY"),value:T.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),wP=T.object({type:T.literal("PASTE")}),CP=T.object({type:T.literal("REFRESH")}),RP=T.object({type:T.literal("REQUEST"),url:T.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:T.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:T.record(T.string(),T.string()).or(T.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:T.string().or(T.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),xP=T.object({type:T.literal("GRAPHQL_REQUEST"),url:T.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:T.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:T.string().or(T.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),MS=T.object({type:T.literal("DRAG"),fromDescription:T.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:T.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:T.number().positive().or(T.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),MP=T.object({type:T.literal("MOUSE_DRAG"),description:T.string().or(T.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:T.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:T.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),_P=T.object({type:T.literal("JAVASCRIPT"),code:T.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:T.union([T.literal("NODE"),T.literal("BROWSER")]).or(T.null()).describe("Execution environment. Default is NODE."),timeout:T.number().or(T.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),PP=T.object({type:T.literal("AI_EXTRACT"),goal:T.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:T.string().or(T.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:T.string().or(T.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:T.string().or(T.null()).describe("URL or URL regex for the iframe to extract data from.")}),IP=T.object({type:T.literal("ELEMENT_CHECK"),description:T.string().describe("Description of the element to check."),assertionType:T.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:T.string().or(T.null()).describe("The value to check against (required for CONTENT assertions)."),negated:T.boolean().or(T.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),OP=T.object({type:T.literal("PAGE_CHECK"),value:T.string().describe("The text content to check for on the page."),negated:T.boolean().or(T.null()).describe("If true, checks that the content is NOT present."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),LP=T.object({type:T.literal("NEW_TAB"),url:T.string().describe("The URL to open in the new tab.")}),NP=T.object({type:T.literal("WAIT_FOR_URL"),matcher:T.discriminatedUnion("type",[T.object({type:T.literal("SUBSTRING"),url:T.string()}),T.object({type:T.literal("GLOB"),glob:T.string()}),T.object({type:T.literal("REGEX"),regex:T.string()}),T.object({type:T.literal("DOMAIN"),domain:T.string()})]).describe("How to match the URL."),caseInsensitive:T.boolean().or(T.null()),negated:T.boolean().or(T.null()).describe("Wait for the URL to NOT match instead."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the URL.")}),Hd=T.object({type:T.literal("SUCCESS")}),Gd=T.object({type:T.literal("FAILURE")}),_S=T.discriminatedUnion("type",[yS,bS,TS,vS,AS,wS,CS,RS,xS,ES]),DP=T.discriminatedUnion("type",[..._S.options,MS]),ml=T.discriminatedUnion("type",[yS,bS,TS,vS,AS,wS,CS,RS,xS,ES,MS,_P,IP,OP,LP,NP,PP,AP,TP,vP,MP,wP,CP,RP,xP]),R2=ha(ml),x2=T.discriminatedUnion("type",[...ml.options,Hd,Gd]),M2=ha(T.discriminatedUnion("type",[..._S.options,Hd,Gd])),_2=ha(T.discriminatedUnion("type",[...DP.options,Hd,Gd])),P2=T.object({command:T.unknown(),thoughts:T.string()});import{z as Vd}from"zod";import{extendZodWithOpenApi as FP}from"zod-openapi";import{z as PS}from"zod";import{extendZodWithOpenApi as kP}from"zod-openapi";import{z as wn}from"zod";var tr=wn.object({index:wn.number().optional().describe("global index within a test (in-order traversal)"),id:wn.string(),skipped:wn.boolean().optional(),comment:wn.string().optional(),envKey:wn.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:wn.boolean().optional(),retries:wn.number().optional()});kP(PS);var UP=tr.extend({type:PS.literal("PRESET_ACTION")}),rr=UP.extend({command:Jo}).openapi({ref:"PresetAction"});FP(Vd);var to=tr.extend({type:Vd.literal("AI_ACTION"),text:Vd.string(),steps:rr.array().optional()}).openapi({ref:"AIAction"});import{z as kt}from"zod";import{z as pl}from"zod";import{extendZodWithOpenApi as BP}from"zod-openapi";BP(pl);var Zo=tr.extend({type:pl.literal("AI_ACTION_DYNAMIC"),text:pl.string(),retries:pl.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as IS}from"zod";var Wd=tr.extend({type:IS.literal("CONDITIONAL"),skipped:IS.boolean().optional()});import{z as Se}from"zod";var zP=Se.object({cacheKey:Se.string(),cacheExpiryMs:Se.number()}),jd=tr.extend({id:Se.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Se.record(Se.string()).optional(),cacheConfig:zP.optional()}),rn=jd.extend({type:Se.literal("MODULE"),moduleId:Se.string().uuid()}),HP=Se.union([rn.pick({type:!0,moduleId:!0}),Se.record(Se.unknown())]),GP=Se.object({type:Se.literal("URL_REGEX"),regex:Se.string()}),VP=Se.object({type:Se.literal("PAGE_CHECK"),substring:Se.string()}),$d=Se.object({cacheInvalidation:Se.discriminatedUnion("type",[VP,GP]).optional()}),nr=Se.object({moduleId:Se.string().uuid(),name:Se.string(),description:Se.string().nullish(),enabled:Se.boolean().nullish(),parameters:Se.string().array().nullish(),defaultParameters:Se.record(Se.string(),Se.string()).nullish(),parameterEnums:Se.record(Se.string(),Se.string().array()).nullish(),defaultCacheKey:Se.string().nullish(),defaultCacheTtl:Se.number().nullish(),defaultCacheAllInvocations:Se.boolean().nullish(),autoAuth:Se.boolean().nullish(),advanced:$d.nullish()});import{z as or}from"zod";var OS=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(OS||{});var WP=or.discriminatedUnion("type",[or.object({type:or.literal("NAVIGATE_URL"),url:or.string().url()}),or.object({type:or.literal("GO_TO_SECTION_START")})]),jP=or.object({trigger:or.nativeEnum(OS).optional(),attempts:or.number().int().optional(),restartBehavior:WP}),ya=tr.extend({type:or.literal("SECTION"),description:or.string().describe("user provided goal of what the section should accomplish"),plan:or.string().array().optional(),autohealingConfig:jP.optional()});var LS=nr.merge(jd).extend({type:kt.literal("RESOLVED_MODULE"),steps:kt.lazy(()=>ut.array())}),qd=nr.extend({steps:kt.lazy(()=>ut.array())}),Kd=ya.extend({steps:kt.lazy(()=>Ut.array())}),$P=ya.extend({steps:kt.lazy(()=>ut.array())}),ei=Wd.extend({blocks:kt.object({assertion:kt.lazy(()=>rr),steps:kt.lazy(()=>Ut.array())}).array(),elseSteps:kt.lazy(()=>Ut.array().optional())}),qP=Wd.extend({blocks:kt.object({assertion:kt.lazy(()=>rr),steps:kt.lazy(()=>ut.array())}).array(),elseSteps:kt.lazy(()=>ut.array().optional())}),Ut=kt.discriminatedUnion("type",[rr,to,Zo,rn,ei,Kd]),ut=kt.discriminatedUnion("type",[rr,to,Zo,LS,qP,$P]);import{z as ir}from"zod";var KP=ir.object({steps:Ut.array(),beforeSteps:Ut.array().nullish(),afterSteps:Ut.array().nullish()}),ro=ir.object({steps:ut.array(),beforeSteps:ut.array().nullish(),afterSteps:ut.array().nullish()}),no=ir.object({steps:ir.record(ir.string(),ir.unknown()).array(),beforeSteps:ir.record(ir.string(),ir.unknown()).array().nullish(),afterSteps:ir.record(ir.string(),ir.unknown()).array().nullish()});var Cn="1.0.22",oo="0.0.2";import{z as Ct}from"zod";import{z as io}from"zod";var YP=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,nn=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ti=io.string().min(1).max(255).superRefine((r,e)=>{try{ba(r)}catch(t){return e.addIssue({code:io.ZodIssueCode.custom,message:t.message,fatal:!0}),io.NEVER}});function ba(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(YP))throw new Error("Name cannot be a UUID. Please choose a different name.")}var gl=io.preprocess(r=>r===null?"":r,io.union([io.string().url(),io.literal("")])).optional();var XP=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],JP=Ct.object({id:Ct.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:ti.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:Ct.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(r=>[r.id,r.name,r.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),QP=Ct.object({selector:JP,inputs:Ct.record(Ct.string()).or(Ct.null())}),$K=Ct.object({type:Ct.literal("PRESET_ACTION"),action:ml,envKey:Ct.string().or(Ct.null()).describe(`key in the environment to save the result of this step to. Only use this for ${XP.join(" or ")} steps.`)}),qK=Ct.object({type:Ct.literal("MODULE"),module:QP}),KK=Ct.object({type:Ct.literal("AI_ACTION_DYNAMIC"),text:Ct.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")});var NS=_.object({phrase:_.string()}),Yd=_.object({thoughts:_.string().optional(),result:_.union([_.literal("NOT_FOUND"),_.string(),_.number(),_.array(_.unknown()),_.record(_.unknown(),_.unknown()),_.unknown()])}),_Y=_.object({text:_.string()}),ZP=_.boolean().or(_.nativeEnum(It)).transform(r=>!(!r||r==="irrelevant")),DS=_.object({attributes:_.array(_.string()).nullish(),text:ZP.nullish(),position:_.nativeEnum(It).nullish(),shape:_.nativeEnum(It).nullish()}),eI=_.object({id:_.number().int(),requirements:DS}),tI=eI.array(),kS=_.object({thoughts:_.string(),review:_.string().optional(),id:_.number().int(),updatedMemory:ta.optional(),requirements:DS.nullish().transform(r=>{if(r!==null)return r}),additionalElements:tI.nullish().transform(r=>{if(r!==null)return r})});var Xd=(p=>(p.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",p.FEW_WORDS="FEW_WORDS",p.STYLE_TAG="STYLE_TAG",p.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",p.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",p.NONE="NONE",p.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",p.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",p.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",p.PREFER_ASSERTION="PREFER_ASSERTION",p.HTML_ELEMENTS="HTML_ELEMENTS",p.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",p.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",p))(Xd||{}),US=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(US||{});var FS=_.object({thoughts:_.string(),category:_.nativeEnum(Xd)}),BS=_.object({thoughts:_.string(),category:_.nativeEnum(US)}),zS=_.object({anyUntestedSteps:_.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:_.object({error:_.string(),solutionFound:_.object({description:_.string(),passedSuccessfully:_.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:_.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:_.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),HS=_.object({summary:_.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:_.array(_.object({error:_.string(),workAround:_.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:_.array(_.string()).default([]).describe("Steps added/discussed but not validated.")}),rI=_.discriminatedUnion("op",[_.object({op:_.literal("replace"),path:_.string(),value:_.string()}),_.object({op:_.literal("add"),path:_.string(),value:_.string()}),_.object({op:_.literal("remove"),path:_.string()})]),PY=_.object({thoughts:_.string(),patches:rI.array()}),nI=[_.literal("add"),_.literal("replace"),_.literal("remove")],oI=_.object({op:_.union(nI),path:_.string(),value:ut.optional()}),GS=_.object({patches:oI.array(),thoughts:_.string()}),VS=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(VS||{}),WS=_.object({thoughts:_.string(),scenario:_.nativeEnum(VS),instructions:_.string().nullish()}),jS=_.object({reasoning:_.string(),scenario:_.string(),patch:_.null().optional()}),IY=_.object({thoughts:_.string(),evaluation:_.number().min(0).max(10)}),OY=_.object({observations:_.string(),reasoning:_.string(),command:el});var Jd=_.object({summary:_.string(),reasoning:_.string(),evaluation:_.discriminatedUnion("type",[_.object({type:_.literal("DONE")}),_.object({type:_.literal("RIGHT_TRACK")}),_.object({type:_.literal("WRONG_TRACK"),feedback:_.string()}),_.object({type:_.literal("IMPOSSIBLE")})])}),iI=_.object({startId:_.number().int(),endId:_.number().int()}),$S=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))($S||{}),qS=_.object({categoryThoughts:_.string(),category:_.nativeEnum($S),relevantSections:iI.array()}),on=_.boolean().nullish().transform(r=>r??!1),KS=_.object({thoughts:_.string().optional(),isPageReady:on,descriptionLabels:_.object({usesTextContent:on,usesAppearance:on,usesPosition:on,usesRelativeElements:on,usesSingleQuotes:on,isAmbiguous:on,targetDoesNotExist:on,usesIcon:on}).optional()});import{z as O}from"zod";import*as ie from"zod";var FY=ie.object({thoughts:ie.string().optional().describe("only provided if a description was provided"),target:Sn.optional().describe("only provided if a description was provided"),pageState:ie.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ie.object({label:ie.string(),value:ie.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ie.object({data:ie.string(),height:ie.number().int(),width:ie.number().int()}).optional().describe("only provided if returnScreenshot is true")}),YS=ie.union([ie.literal("ELEMENT_CHECK"),ie.literal("NEGATED_CHECK"),ie.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ie.literal("SELECT_OPTION"),ie.literal("TYPE")]);function Ea(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="EXISTS"&&r.assertion.negated)return"NEGATED_CHECK";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="VISIBLE"&&r.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(r.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Ta=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Ta||{}),ri=ie.object({matched:ie.boolean(),reason:ie.string().optional().describe("Human understandable description"),logs:ie.string().array().optional().describe("Logs for debugging")}),aI=ri.extend({type:ie.literal("USER_SELECTOR")}),sI=ri.extend({type:ie.literal("CSS_SELECTOR"),selectors:ie.string().array()}),lI=ri.extend({type:ie.literal("HYBRID_SELECTOR")}),cI=ri.extend({type:ie.literal("HTML_DISTANCE"),distance:ie.number().optional(),closestElement:ie.string().optional(),savedElement:ie.string().optional()}),uI=ri.extend({type:ie.literal("TEMPLATE_MATCHING"),elementImageUrl:ie.string().url()}),dI=ri.extend({type:ie.literal("AUTO_FRAME"),logs:ie.string().array().optional()}),XS=ie.discriminatedUnion("type",[aI,sI,lI,cI,uI,dI]);import{z as Ra}from"zod";import{z as vI}from"zod";import*as q from"zod";import{extendZodWithOpenApi as gI}from"zod-openapi";import{cloneDeep as tX}from"lodash-es";import nX from"truncate-json";import*as lo from"zod";import{extendZodWithOpenApi as pI}from"zod-openapi";import{z as Rt}from"zod";import{z as te}from"zod";import{z as Qd}from"zod";var kr=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(kr||{});var hl=Qd.object({width:Qd.number().min(200).max(1e4),height:Qd.number().min(200).max(1e4)}),JS={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},HY=Object.keys(JS);var Rn=JS["Desktop Large"],QS="en-us",ZS="America/Los_Angeles";var fl={latitude:37.7749,longitude:-122.4194};var Sl=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(Sl||{});var Zd=te.object({autoFollowNewTabs:te.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:te.union([te.boolean(),te.literal("inputs-only")]).optional(),ignoreHrefForCaching:te.boolean().optional(),disableSecondaryCacheResolution:te.boolean().optional(),hybridSelectorMode:te.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:te.union([te.boolean(),te.literal("always")]).optional(),visualActions:te.boolean().optional(),autoExpandIframes:te.boolean().optional(),disableHtmlSnapshots:te.boolean().optional(),defaultBrowserType:te.nativeEnum(kr).optional(),importantAttributes:te.string().array().optional(),importantClasses:te.string().array().optional(),importantStyles:te.string().array().optional()});var ey=1e4,ty=6e4,mI=te.object({server:te.string(),username:te.string().optional(),password:te.string().optional()}),ao=Zd.extend({pageLoadTimeoutMs:te.number().optional().refine(r=>r===void 0||r<=ty&&r>=-1,{message:`Page load timeout must be between 0 and ${ty/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:te.number().optional().refine(r=>r===void 0||r<=ey&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${ey/1e3} seconds`}),localChromeExtensionPaths:te.string().array().optional(),extraHeaders:te.record(te.string(),te.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:te.record(te.string(),te.record(te.string(),te.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:te.string().optional(),disableGpu:te.boolean().optional(),disableBrowserMonitoring:te.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:te.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:te.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:te.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:te.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:te.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:mI.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:te.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:te.nativeEnum(Sl).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var em="BASE_URL";var so="ENV_NAME",ni="TEST_NAME",XY={[em]:"https://www.google.com"},ry=Rt.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),ny=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.string().describe("variable value"))}),oy=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value")),browser:ao.optional()});var JY=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value"))});pI(lo);var tm=lo.object({env:lo.record(lo.unknown())}).openapi({ref:"TestContextSnapshot"});var Ke=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ke||{}),rm=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(rm||{});gI(q);var nm=q.object({beforeUrl:q.string().optional(),afterUrl:q.string().optional(),message:q.string().optional(),beforeSnapshot:q.string().optional(),afterSnapshot:q.string().optional(),startedAt:q.coerce.date(),finishedAt:q.coerce.date()}),hI=nm.extend({viewport:q.object({height:q.number(),width:q.number()}).nullish(),status:q.nativeEnum(rm),message:q.string().optional(),elementInteracted:q.string().optional()}),co=nm.extend({status:q.nativeEnum(Ke),message:q.string().optional(),data:q.unknown().optional(),beforeTestContext:tm.optional(),afterTestContext:tm.optional(),failureReason:q.nativeEnum(Re).optional(),details:q.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),iy=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(iy||{}),yl=co.merge(rr).extend({results:hI.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:q.lazy(()=>pt.array()).optional(),failureRecoveryStatus:q.object({type:q.nativeEnum(iy),message:q.string()}).optional()}),fI=co.merge(to).extend({results:q.lazy(()=>yl.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),SI=co.merge(Zo).extend({results:q.lazy(()=>yl.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),yI=co.merge(rn).extend({moduleName:q.string().optional(),results:q.lazy(()=>pt.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),bI=co.merge(ei).extend({assertionResult:yl.optional(),results:q.lazy(()=>pt.array()).describe("results for the block actually executed"),previousAttempts:q.lazy(()=>pt.array()).optional()}),EI=co.merge(ya).extend({results:q.lazy(()=>pt.array()),healingAttempts:q.lazy(()=>pt.array().array()).optional(),previousAttempts:q.lazy(()=>pt.array()).optional()}),pt=q.discriminatedUnion("type",[fI,SI,yl,yI,bI,EI]),bX=co.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),TI=nm.extend({index:q.number().optional(),userFacingStepReference:q.string().optional(),description:q.string(),pageState:q.string().optional(),elementInteracted:q.string().optional(),startedAt:q.coerce.date().or(q.string()).optional().catch(void 0),finishedAt:q.coerce.date().or(q.string()).optional().catch(void 0)}),bl=TI.extend({beforeScreenshot:q.string().optional(),afterScreenshot:q.string().optional()});var om=vI.object({results:pt.array().describe("main results"),beforeResults:pt.array().optional(),afterResults:pt.array().optional()}),va=om.partial();import{z as H}from"zod";import{extendZodWithOpenApi as _I}from"zod-openapi";var oi=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(oi||{});import{isValidCron as AI}from"cron-validator";import{z as ce}from"zod";var ay=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var sy=1e4,wI=ao.extend({browserType:ce.nativeEnum(kr).optional(),slowMoMs:ce.number().optional().refine(r=>r===void 0||r<=sy&&r>=-1,{message:`Slow motion must be between 0 and ${sy} milliseconds`}),basicAuthorization:ce.object({username:ce.string().optional(),password:ce.string().optional()}).optional(),geolocation:ce.object({latitude:ce.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:ce.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:ce.boolean().optional(),locale:ce.string().optional(),timezone:ce.enum(ay).optional(),colorScheme:ce.enum(["light","dark"]).optional()});var Aa=ce.object({useMemory:ce.boolean().optional(),failureRecovery:ce.boolean().optional().describe("undefined means inherit org settings")}),CI=Aa.extend({disableAICaching:ce.boolean().optional(),failureRecoveryInstructions:ce.string().optional()}),RI=ce.object({viewport:hl.optional()}),wa=RI.merge(CI).merge(wI),ii=ce.object({cron:ce.string().refine(r=>AI(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:ce.boolean().default(!1),env:ce.string().optional(),timeZone:ce.string().default("America/Los_Angeles"),jobKey:ce.string().optional()}),ai=ce.object({onSuccess:ce.boolean().default(!1),failureMessage:ce.string().optional(),onFailure:ce.boolean().default(!0),successMessage:ce.string().optional()}),xI=ce.object({name:ce.string(),required:ce.boolean().optional(),defaultValue:ce.string().describe("this is not optional because we need a value when the editor is first loaded")}),El=xI.array(),MI=ce.object({name:ce.string(),value:ce.string()}),ly=MI.array(),Tl=ce.object({name:ce.string(),default:ce.boolean().optional(),fixtures:ry.array().optional()});_I(H);var ar={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},xe=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(xe||{}),vl=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(vl||{});var ot=H.string().pipe(H.coerce.date()).or(H.date()),Ca=H.object({id:H.string(),runKey:H.string(),organizationId:H.string(),executionType:H.nativeEnum(oi).optional().default("WEB"),createdAt:ot,createdBy:H.string(),flake:H.boolean().nullish(),scheduledAt:ot.or(H.null()),startedAt:ot.or(H.null()),updatedAt:ot.nullish(),finishedAt:ot.or(H.null()),resolvedBaseUrl:H.string().nullish(),environmentName:H.string().nullish(),gitBranchName:H.string().nullish(),githubRepository:H.string().nullish(),gitlabProjectPath:H.string().nullish(),labels:H.array(H.string()).optional(),gitOriginUrl:H.string().nullish(),gitCommitSha:H.string().nullish(),gitCommitShaShort:H.string().nullish(),gitCommitAuthorName:H.string().nullish(),cliVersion:H.string().nullish(),section:H.nativeEnum(vl).nullish(),status:H.nativeEnum(xe),trigger:H.nativeEnum(ar),attempts:H.number(),runAttempts:H.array(H.object({id:H.string(),status:H.nativeEnum(xe),startedAt:ot.or(H.null()),finishedAt:ot.or(H.null())})).optional(),videos:H.array(H.string()).optional(),failureReason:H.nativeEnum(Re).nullish(),failureDetails:al.nullish(),failureRecoveryDetails:H.object({attempts:H.number()}).nullish(),pipelineId:H.string().nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),quarantined:H.boolean().nullish().default(!1),quarantinedReason:H.string().nullish(),localTestId:H.string().nullish(),testId:H.string().nullish(),testName:H.string().nullish(),description:H.string().nullish(),test:H.object({name:H.string(),id:H.string()}).nullish().default(null),suiteId:H.string().nullish()}).openapi({ref:"RunMetadata"}),PI={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Al=Ca.pick({...PI,test:!0}),cy=Ca.omit({failureReason:!0,failureDetails:!0,test:!0}),im=Ca.extend({stepsSnapshot:H.array(H.record(H.unknown())).nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),test:H.object({name:H.string(),id:H.string(),description:H.string().nullish(),baseUrl:H.string().nullish(),advanced:wa.nullish()}).nullish()}).merge(om);var II=Ra.object({id:Ra.string().uuid(),startedAt:ot.or(Ra.null()),finishedAt:ot.or(Ra.null()),status:Ra.nativeEnum(xe)}).merge(va),jX=II.array();import{z as it}from"zod";var OI=it.object({id:it.string(),status:it.nativeEnum(xe),trigger:it.nativeEnum(ar),createdAt:ot,startedAt:ot.nullish(),finishedAt:ot.nullish(),gitCommitSha:it.string().nullish(),gitCommitShaShort:it.string().nullish(),gitCommitTimestamp:ot.nullish(),gitBranchName:it.string().nullish(),gitOriginUrl:it.string().nullish(),gitCommitMessage:it.string().nullish(),gitCommitAuthorName:it.string().nullish(),githubRepository:it.string().nullish(),gitlabProjectPath:it.string().nullish(),pipelineId:it.string().nullish(),cliVersion:it.string().nullish(),labels:it.string().array().optional(),suite:it.object({id:it.string(),name:it.string()}).nullish(),runs:it.object({status:it.nativeEnum(xe)}).array()}).openapi({ref:"RunGroup"}),uy=OI.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Al.array()});import{z as gt}from"zod";var LI=gt.object({type:gt.literal("TARGETING"),name:gt.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:XS.array(),pageState:gt.string().optional(),targetSource:gt.nativeEnum(fn).optional(),targetUpdateTime:gt.string().optional()}),NI=gt.object({type:gt.literal("AI_LOCATION"),matched:gt.boolean(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional(),thoughts:gt.string().optional()}),DI=gt.object({type:gt.literal("ASSERTION"),relevantElementsSerialized:gt.string().array().optional(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional()}),kI=gt.discriminatedUnion("type",[LI,NI,DI]);import{z as Qe}from"zod";var UI=Qe.object({id:Qe.string(),name:Qe.string()}),i5=UI.merge(Qe.object({createdAt:ot,createdBy:Qe.string(),schedule:ii,notification:ai,environment:Qe.object({name:Qe.string()}).nullish(),beforeTests:Qe.object({id:Qe.string()}).array().nullish(),afterTests:Qe.object({id:Qe.string()}).array().nullish()})),dy=Qe.object({id:Qe.string().uuid(),orgId:Qe.string(),createdAt:ot,startedAt:ot.or(Qe.null()),finishedAt:ot.or(Qe.null()),status:Qe.nativeEnum(xe),trigger:Qe.nativeEnum(ar),suite:Qe.object({id:Qe.string(),name:Qe.string()}).nullish(),runs:Ca.array()}),a5=dy.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),my=dy.extend({runs:Al.array()});import{z as sr}from"zod";import{cloneDeep as c5}from"lodash-es";import{z as Ae}from"zod";var h5=Ae.object({thoughts:Ae.string(),subGoals:Ae.object({instruction:Ae.string()}).array()}),f5=Ae.object({thoughts:Ae.string(),newPlanMarkdown:Ae.string()}),S5=Ae.object({thoughts:Ae.string(),correct:Ae.boolean(),failedActionIndex:Ae.number().optional()}),FI=Ae.object({type:Ae.literal("PLANNING"),beforePlan:Ae.string(),goalDecision:Ae.string(),thoughts:Ae.string()}),BI=Ae.object({type:Ae.literal("RUNNING"),stepDisplayName:Ae.string(),status:Ae.nativeEnum(Ke),results:pt.array()}),zI=Ae.object({type:Ae.literal("REVISING"),beforePlan:Ae.string(),afterPlan:Ae.string(),errString:Ae.string(),diffs:Ae.string(),thoughts:Ae.string()}),HI=Ae.object({type:Ae.literal("SYSTEM"),message:Ae.string()}),GI=Ae.discriminatedUnion("type",[FI,BI,zI,HI]),py=GI.array();var v5=sr.object({id:sr.string(),scheduledAt:sr.coerce.date().nullable(),startedAt:sr.coerce.date().nullable(),finishedAt:sr.coerce.date().nullable(),status:sr.nativeEnum(xe),history:py.nullable(),testPlan:sr.object({id:sr.string(),name:sr.string()}).nullable(),test:sr.object({id:sr.string(),name:sr.string()}).nullable()});import{z as Ft}from"zod";var am=Ft.object({content:Ft.string(),ids:Ft.string().array(),tokenLength:Ft.number()}),VI=Ft.object({chunks:am.array()}),B5=Ft.object({ids:Ft.string().array(),score:Ft.number(),tokenLength:Ft.number()}),z5=VI.extend({description:Ft.string().describe("Input to pass to RAG engine"),tokenLimit:Ft.number()}),gy=Ft.object({ids:Ft.number().array()}),hy=Ft.object({indices:Ft.number().array()});var at=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),clientMode:O.enum(["interactive","runner"]).optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),K5=at.extend({chunks:am.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number(),callId:O.string().optional()}),WI=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),fy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:YS.optional().catch(void 0),memory:O.discriminatedUnion("type",[en,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Sy=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),yy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),jI=O.literal("NEGATED_CHECK"),by=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:xd.optional(),memory:O.discriminatedUnion("type",[ia,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional(),source:jI.optional()}),Ey=O.object({command:Jo}),Ty=O.object({message:O.string()}),vy=O.object({messagesAndToolCalls:O.array(O.string())}),Ay=O.object({messagesAndToolCalls:O.array(O.string()).describe("Chat history to condense for summarization")}),sm=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:WI.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),wy=O.object({results:bl.array(),errorMessage:O.string(),errorStack:O.string().optional()}),Cy=O.object({results:bl.array(),goal:O.string(),errorMessage:O.string()}),Ry=O.object({failedResults:bl.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string(),customInstructions:O.string().optional(),testDescription:O.string().optional()}),Y5=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()}),xy=O.object({type:O.string(),browserContext:O.string(),currentStep:O.string(),screenshot:O.string()}),My=O.object({description:O.string(),browserState:O.string(),screenshot:O.string()});import{z as xa}from"zod";var Q5=xa.object({goal:xa.string()}),_y=xa.object({keywords:xa.array(xa.string())});import{z as lm}from"zod";var wl=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(wl||{}),t3=lm.nativeEnum(wl),$I=lm.enum(["v1","v2","v3"]),r3=$I.or(lm.string().describe("for people with special configurations"));var Py={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};import{z as Z}from"zod";import{v4 as ci}from"uuid";import me from"zod";import{v4 as l3}from"uuid";import{z as B}from"zod";import*as F from"zod";var Iy=F.discriminatedUnion("type",[F.object({type:F.literal("SCREEN")}),F.object({type:F.literal("OPEN_APP")}),F.object({type:F.literal("OPEN_WEBVIEW")})]),uo=F.object({type:F.literal("description"),description:F.string()}),Oy=F.object({type:F.literal("CUSTOM_COORDINATES"),startX:F.number().describe("Starting X coordinate in pixels"),startY:F.number().describe("Starting Y coordinate in pixels"),deltaPixels:F.number().describe("Number of pixels to scroll in the specified direction")}),cm=F.discriminatedUnion("type",[...Iy.options,F.object({type:F.literal("CUSTOM"),target:uo}),Oy]);var qI=F.object({type:F.literal("coordinates"),xPercent:F.number(),yPercent:F.number()}),Cl=F.discriminatedUnion("type",[uo,qI]),Ly=F.object({requiredText:F.string().optional(),requiredAttributes:F.record(F.string(),F.string()).optional(),requiredBounds:F.boolean().optional(),position:F.object({x1:F.number(),y1:F.number(),x2:F.number(),y2:F.number(),tolerance:F.nativeEnum(It),preciseTolerance:F.boolean().optional()}).optional(),shape:F.object({width:F.number(),height:F.number(),tolerance:F.nativeEnum(It),preciseTolerance:F.boolean().optional()}).optional()}),KI=F.object({xPath:F.string(),requirements:Ly.optional()}),YI=F.object({type:F.literal("CUSTOM"),target:uo,cache:F.lazy(()=>Ny).optional()}),XI=F.object({pixelDelta:F.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:F.union([Iy,YI,Oy]),direction:F.enum(["up","down"])}),Ny=F.object({type:F.literal("NATIVE"),bounds:F.number().array(),resolvedDescription:F.string(),xPath:F.string(),elementOnlySerializedXml:F.string(),scrollDetails:XI.optional(),requirements:Ly.optional(),requiredRelatedElements:KI.array().optional(),memory:en.optional()}),JI=F.object({type:F.literal("WEBVIEW"),resolvedDescription:F.string(),xPath:F.string(),browserCache:Sn.optional(),memory:en.optional()}),si=F.union([Ny,JI]);var an=(M=>(M.AI_CHECK="AI_CHECK",M.TAP="TAP",M.TYPE="TYPE",M.PRESS="PRESS",M.PRESS_KEYBOARD="PRESS_KEYBOARD",M.OPEN_APP="OPEN_APP",M.KILL_APP="KILL_APP",M.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",M.SWIPE="SWIPE",M.SCROLL_TO="SCROLL_TO",M.SCREEN_CHECK="SCREEN_CHECK",M.ELEMENT_CHECK="ELEMENT_CHECK",M.DRAG_AND_DROP="DRAG_AND_DROP",M.JAVASCRIPT="JAVASCRIPT",M.REQUEST="REQUEST",M.WAIT="WAIT",M.ADD_FILE="ADD_FILE",M.INSTALL_APP="INSTALL_APP",M.UNINSTALL_APP="UNINSTALL_APP",M.TOGGLE_SETTINGS="TOGGLE_SETTINGS",M.ADB="ADB",M.STATE="STATE",M))(an||{}),Ma=(c=>(c.BACK="BACK",c.HOME="HOME",c.APP_SWITCHER="APP_SWITCHER",c.POWER="POWER",c.SEARCH="SEARCH",c.VOLUME_UP="VOLUME_UP",c.VOLUME_DOWN="VOLUME_DOWN",c.VOLUME_MUTE="VOLUME_MUTE",c))(Ma||{}),dm=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(dm||{}),Rl=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(Rl||{}),Dy=B.object({updatedAt:B.coerce.date().optional()}),Ye=B.object({id:B.string().uuid(),disableCache:B.boolean().optional()}),QI=Ye.extend({type:B.literal("STATE")}),ZI=Ye.extend({type:B.literal("KILL_APP")}),xn=Dy.extend({target:si}),xl=Dy.extend({fromTarget:si,toTarget:si}),mm=Ye.extend({type:B.literal("AI_CHECK"),assertion:B.string(),timeoutSecs:B.number().optional(),cache:bn.optional()}),pm=Ye.extend({type:B.literal("TAP"),target:Cl,cache:xn.optional(),longPress:B.boolean().optional(),longPressDurationMs:B.number().optional(),doubleTap:B.boolean().optional(),doubleTapDelayMs:B.number().optional(),relativePosition:B.object({x:B.number(),y:B.number()}).optional()}),gm=Ye.extend({type:B.literal("TYPE"),target:Cl.optional(),cache:xn.optional(),keyPressDelayMs:B.number().optional(),text:B.string(),clearContent:B.boolean().optional(),forceClearContent:B.boolean().optional()});var eO=Ye.extend({type:B.literal("PRESS"),key:B.nativeEnum(Ma),longPress:B.boolean().optional()}),tO=Ye.extend({type:B.literal("PRESS_KEYBOARD"),key:B.nativeEnum(dm)}),rO=Ye.extend({type:B.literal("OPEN_APP"),packageName:B.string(),activityName:B.string().optional(),intentExtras:B.string().optional()}),nO=Ye.extend({type:B.literal("OPEN_NOTIFICATION_DRAWER")}),hm=Ye.extend({type:B.literal("SWIPE"),direction:B.enum(["up","down","left","right"]),scrollableElement:cm,cache:xn.optional(),viewportPercent:B.number().optional(),durationMs:B.number().optional()}),fm=Ye.extend({type:B.literal("SCROLL_TO"),target:uo,direction:B.enum(["down","up"]),scrollableElement:cm,scrollStepPercent:B.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:xn.optional()});var oO=B.object({type:B.literal("CONTENT"),negated:B.boolean().optional(),value:B.string()}),iO=Ye.extend({type:B.literal("SCREEN_CHECK"),assertion:oO,timeout:B.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}),Sm=Ye.extend({type:B.literal("ELEMENT_CHECK"),target:Cl,cache:xn.optional(),assertion:Ys,timeout:B.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}),ym=Ye.extend({type:B.literal("DRAG_AND_DROP"),fromTarget:uo,toTarget:uo,cache:xl.optional(),hoverDuration:B.number().optional(),dragDuration:B.number().optional()}),aO=Ye.extend({type:B.literal("JAVASCRIPT"),code:B.string(),timeout:B.number().int().max(60).optional().describe("Max seconds for the code to complete")}),sO=Ye.extend({type:B.literal("REQUEST")}).merge(Qn),lO=Ye.extend({type:B.literal("WAIT"),timeoutSecs:B.number()}),cO=Ye.extend({type:B.literal("ADB"),command:B.string(),jsonArgs:B.string().optional()}),uO=Ye.extend({type:B.literal("ADD_FILE"),file:B.string(),storageLocation:B.string()}),dO=B.string().trim(),mO=Ye.extend({type:B.literal("INSTALL_APP"),uri:dO}),pO=Ye.extend({type:B.literal("UNINSTALL_APP"),packageName:B.string()}),gO=Ye.extend({type:B.literal("TOGGLE_SETTINGS"),settingsType:B.nativeEnum(Rl)}),ky=B.discriminatedUnion("type",[mm,pm,gm,eO,rO,nO,tO,hm,fm,iO,Sm,ym,aO,sO,lO,uO,mO,pO,gO,ZI,cO,QI]);var li=r=>{switch(r.type){case"description":return r.description;case"coordinates":return`${r.xPercent}%, ${r.yPercent}%`}};var hO=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],Fy=me.object({type:me.enum(hO).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:me.string().or(me.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),fO=me.object({type:me.literal("TAP"),description:me.string().describe("Description of the element to tap."),longPress:me.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),doubleTap:me.boolean().describe("Whether to tap twice in quick succession."),relativePosition:me.null().or(me.object({x:me.number(),y:me.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
|
|
9
|
+
`)}`}};function fS(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function zd(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}var Ur=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},pl=class extends Ur{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},ml=class extends Ur{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function Hd(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}var Gd="Element to be clicked has no bounding box";function SS(r){return r instanceof Error?r.message.startsWith(Gd):!1}function Vd(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}function Wd(r){return r instanceof Error?r.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||r.message.includes("Could not resolve backend node"):!1}var va=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};function gl(r){return r instanceof Error?r.message:String(r)}var AP={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST."};Od.options.forEach(r=>{let e=r.shape.type.value;if(e!=="SUCCESS"&&!AP[e])throw new Error(`Command type ${e} is missing a description`)});var yS=T.object({type:T.literal("CLICK"),description:T.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:T.boolean().or(T.null()),rightClick:T.boolean().or(T.null())}),bS=T.object({type:T.literal("TYPE"),description:T.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:T.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:T.boolean().or(T.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:T.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),ES=T.object({type:T.literal("GO_BACK")}),wP=T.object({type:T.literal("GO_FORWARD")}),CP=T.object({type:T.literal("LOCAL_STORAGE"),key:T.string().describe("The localStorage key to set or get."),value:T.string().describe("The value to store in localStorage. If reading, this can be empty.")}),TS=T.object({type:T.literal("PRESS"),keys:T.array(T.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),vS=T.object({type:T.literal("SELECT_OPTION"),description:T.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:T.discriminatedUnion("type",[T.object({type:T.literal("VALUE"),value:T.string()}),T.object({type:T.literal("LABEL"),label:T.string()}),T.object({type:T.literal("INDEX"),index:T.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),AS=T.object({type:T.literal("NAVIGATE"),url:T.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),wS=T.object({type:T.literal("SCROLL"),y:T.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),CS=T.object({type:T.literal("WAIT"),timeout:T.number().describe("The number of seconds to wait.")}),RS=T.object({type:T.literal("AI_ASSERTION"),assertion:T.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:T.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),xS=T.object({type:T.literal("HOVER"),description:T.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),RP=T.object({type:T.literal("COPY"),value:T.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),xP=T.object({type:T.literal("PASTE")}),MP=T.object({type:T.literal("REFRESH")}),_P=T.object({type:T.literal("REQUEST"),url:T.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:T.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:T.record(T.string(),T.string()).or(T.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:T.string().or(T.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),PP=T.object({type:T.literal("GRAPHQL_REQUEST"),url:T.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:T.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:T.string().or(T.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),MS=T.object({type:T.literal("DRAG"),fromDescription:T.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:T.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:T.number().positive().or(T.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),IP=T.object({type:T.literal("MOUSE_DRAG"),description:T.string().or(T.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:T.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:T.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),OP=T.object({type:T.literal("JAVASCRIPT"),code:T.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:T.union([T.literal("NODE"),T.literal("BROWSER")]).or(T.null()).describe("Execution environment. Default is NODE."),timeout:T.number().or(T.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),LP=T.object({type:T.literal("AI_EXTRACT"),goal:T.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:T.string().or(T.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:T.string().or(T.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:T.string().or(T.null()).describe("URL or URL regex for the iframe to extract data from.")}),NP=T.object({type:T.literal("ELEMENT_CHECK"),description:T.string().describe("Description of the element to check."),assertionType:T.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:T.string().or(T.null()).describe("The value to check against (required for CONTENT assertions)."),negated:T.boolean().or(T.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),DP=T.object({type:T.literal("PAGE_CHECK"),value:T.string().describe("The text content to check for on the page."),negated:T.boolean().or(T.null()).describe("If true, checks that the content is NOT present."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),kP=T.object({type:T.literal("NEW_TAB"),url:T.string().describe("The URL to open in the new tab.")}),UP=T.object({type:T.literal("WAIT_FOR_URL"),matcher:T.discriminatedUnion("type",[T.object({type:T.literal("SUBSTRING"),url:T.string()}),T.object({type:T.literal("GLOB"),glob:T.string()}),T.object({type:T.literal("REGEX"),regex:T.string()}),T.object({type:T.literal("DOMAIN"),domain:T.string()})]).describe("How to match the URL."),caseInsensitive:T.boolean().or(T.null()),negated:T.boolean().or(T.null()).describe("Wait for the URL to NOT match instead."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the URL.")}),jd=T.object({type:T.literal("SUCCESS")}),$d=T.object({type:T.literal("FAILURE")}),_S=T.discriminatedUnion("type",[yS,bS,TS,vS,AS,wS,CS,RS,xS,ES]),FP=T.discriminatedUnion("type",[..._S.options,MS]),fl=T.discriminatedUnion("type",[yS,bS,TS,vS,AS,wS,CS,RS,xS,ES,MS,OP,NP,DP,kP,UP,LP,RP,wP,CP,IP,xP,MP,_P,PP]),I2=Ea(fl),O2=T.discriminatedUnion("type",[...fl.options,jd,$d]),L2=Ea(T.discriminatedUnion("type",[..._S.options,jd,$d])),N2=Ea(T.discriminatedUnion("type",[...FP.options,jd,$d])),D2=T.object({command:T.unknown(),thoughts:T.string()});import{z as qd}from"zod";import{extendZodWithOpenApi as HP}from"zod-openapi";import{z as PS}from"zod";import{extendZodWithOpenApi as BP}from"zod-openapi";import{z as xn}from"zod";var rr=xn.object({index:xn.number().optional().describe("global index within a test (in-order traversal)"),id:xn.string(),skipped:xn.boolean().optional(),comment:xn.string().optional(),envKey:xn.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:xn.boolean().optional(),retries:xn.number().optional()});BP(PS);var zP=rr.extend({type:PS.literal("PRESET_ACTION")}),nr=zP.extend({command:ei}).openapi({ref:"PresetAction"});HP(qd);var io=rr.extend({type:qd.literal("AI_ACTION"),text:qd.string(),steps:nr.array().optional()}).openapi({ref:"AIAction"});import{z as kt}from"zod";import{z as Sl}from"zod";import{extendZodWithOpenApi as GP}from"zod-openapi";GP(Sl);var ri=rr.extend({type:Sl.literal("AI_ACTION_DYNAMIC"),text:Sl.string(),retries:Sl.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as IS}from"zod";var Kd=rr.extend({type:IS.literal("CONDITIONAL"),skipped:IS.boolean().optional()});import{z as ye}from"zod";var VP=ye.object({cacheKey:ye.string(),cacheExpiryMs:ye.number()}),Yd=rr.extend({id:ye.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:ye.record(ye.string()).optional(),cacheConfig:VP.optional()}),sn=Yd.extend({type:ye.literal("MODULE"),moduleId:ye.string().uuid()}),WP=ye.union([sn.pick({type:!0,moduleId:!0}),ye.record(ye.unknown())]),jP=ye.object({type:ye.literal("URL_REGEX"),regex:ye.string()}),$P=ye.object({type:ye.literal("PAGE_CHECK"),substring:ye.string()}),Xd=ye.object({cacheInvalidation:ye.discriminatedUnion("type",[$P,jP]).optional()}),or=ye.object({moduleId:ye.string().uuid(),name:ye.string(),description:ye.string().nullish(),enabled:ye.boolean().nullish(),parameters:ye.string().array().nullish(),defaultParameters:ye.record(ye.string(),ye.string()).nullish(),parameterEnums:ye.record(ye.string(),ye.string().array()).nullish(),defaultCacheKey:ye.string().nullish(),defaultCacheTtl:ye.number().nullish(),defaultCacheAllInvocations:ye.boolean().nullish(),autoAuth:ye.boolean().nullish(),advanced:Xd.nullish()});import{z as ir}from"zod";var OS=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(OS||{});var qP=ir.discriminatedUnion("type",[ir.object({type:ir.literal("NAVIGATE_URL"),url:ir.string().url()}),ir.object({type:ir.literal("GO_TO_SECTION_START")})]),KP=ir.object({trigger:ir.nativeEnum(OS).optional(),attempts:ir.number().int().optional(),restartBehavior:qP}),Aa=rr.extend({type:ir.literal("SECTION"),description:ir.string().describe("user provided goal of what the section should accomplish"),plan:ir.string().array().optional(),autohealingConfig:KP.optional()});var LS=or.merge(Yd).extend({type:kt.literal("RESOLVED_MODULE"),steps:kt.lazy(()=>ut.array())}),Jd=or.extend({steps:kt.lazy(()=>ut.array())}),Qd=Aa.extend({steps:kt.lazy(()=>Ut.array())}),YP=Aa.extend({steps:kt.lazy(()=>ut.array())}),ni=Kd.extend({blocks:kt.object({assertion:kt.lazy(()=>nr),steps:kt.lazy(()=>Ut.array())}).array(),elseSteps:kt.lazy(()=>Ut.array().optional())}),XP=Kd.extend({blocks:kt.object({assertion:kt.lazy(()=>nr),steps:kt.lazy(()=>ut.array())}).array(),elseSteps:kt.lazy(()=>ut.array().optional())}),Ut=kt.discriminatedUnion("type",[nr,io,ri,sn,ni,Qd]),ut=kt.discriminatedUnion("type",[nr,io,ri,LS,XP,YP]);import{z as ar}from"zod";var JP=ar.object({steps:Ut.array(),beforeSteps:Ut.array().nullish(),afterSteps:Ut.array().nullish()}),ao=ar.object({steps:ut.array(),beforeSteps:ut.array().nullish(),afterSteps:ut.array().nullish()}),so=ar.object({steps:ar.record(ar.string(),ar.unknown()).array(),beforeSteps:ar.record(ar.string(),ar.unknown()).array().nullish(),afterSteps:ar.record(ar.string(),ar.unknown()).array().nullish()});var Mn="1.0.22",lo="0.0.2";import{z as Ct}from"zod";import{z as co}from"zod";var QP=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Fr=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var _n=co.string().min(1).max(255).superRefine((r,e)=>{try{wa(r)}catch(t){return e.addIssue({code:co.ZodIssueCode.custom,message:t.message,fatal:!0}),co.NEVER}});function wa(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(QP))throw new Error("Name cannot be a UUID. Please choose a different name.")}var yl=co.preprocess(r=>r===null?"":r,co.union([co.string().url(),co.literal("")])).optional();var ZP=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],eI=Ct.object({id:Ct.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:_n.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:Ct.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(r=>[r.id,r.name,r.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),tI=Ct.object({selector:eI,inputs:Ct.record(Ct.string()).or(Ct.null())}),JK=Ct.object({type:Ct.literal("PRESET_ACTION"),action:fl,envKey:Ct.string().or(Ct.null()).describe(`key in the environment to save the result of this step to. Only use this for ${ZP.join(" or ")} steps.`)}),QK=Ct.object({type:Ct.literal("MODULE"),module:tI}),ZK=Ct.object({type:Ct.literal("AI_ACTION_DYNAMIC"),text:Ct.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")});var NS=_.object({phrase:_.string()}),Zd=_.object({thoughts:_.string().optional(),result:_.union([_.literal("NOT_FOUND"),_.string(),_.number(),_.array(_.unknown()),_.record(_.unknown(),_.unknown()),_.unknown()])}),NY=_.object({text:_.string()}),rI=_.boolean().or(_.nativeEnum(It)).transform(r=>!(!r||r==="irrelevant")),DS=_.object({attributes:_.array(_.string()).nullish(),text:rI.nullish(),position:_.nativeEnum(It).nullish(),shape:_.nativeEnum(It).nullish()}),nI=_.object({id:_.number().int(),requirements:DS}),oI=nI.array(),kS=_.object({thoughts:_.string(),review:_.string().optional(),id:_.number().int(),updatedMemory:aa.optional(),requirements:DS.nullish().transform(r=>{if(r!==null)return r}),additionalElements:oI.nullish().transform(r=>{if(r!==null)return r})});var ep=(m=>(m.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",m.FEW_WORDS="FEW_WORDS",m.STYLE_TAG="STYLE_TAG",m.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",m.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",m.NONE="NONE",m.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",m.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",m.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",m.PREFER_ASSERTION="PREFER_ASSERTION",m.HTML_ELEMENTS="HTML_ELEMENTS",m.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",m.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",m))(ep||{}),US=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(US||{});var FS=_.object({thoughts:_.string(),category:_.nativeEnum(ep)}),BS=_.object({thoughts:_.string(),category:_.nativeEnum(US)}),zS=_.object({anyUntestedSteps:_.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:_.object({error:_.string(),solutionFound:_.object({description:_.string(),passedSuccessfully:_.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:_.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:_.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),HS=_.object({summary:_.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:_.array(_.object({error:_.string(),workAround:_.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:_.array(_.string()).default([]).describe("Steps added/discussed but not validated.")}),iI=_.discriminatedUnion("op",[_.object({op:_.literal("replace"),path:_.string(),value:_.string()}),_.object({op:_.literal("add"),path:_.string(),value:_.string()}),_.object({op:_.literal("remove"),path:_.string()})]),DY=_.object({thoughts:_.string(),patches:iI.array()}),aI=[_.literal("add"),_.literal("replace"),_.literal("remove")],sI=_.object({op:_.union(aI),path:_.string(),value:ut.optional()}),GS=_.object({patches:sI.array(),thoughts:_.string()}),VS=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(VS||{}),WS=_.object({thoughts:_.string(),scenario:_.nativeEnum(VS),instructions:_.string().nullish()}),jS=_.object({reasoning:_.string(),scenario:_.string(),patch:_.null().optional()}),kY=_.object({thoughts:_.string(),evaluation:_.number().min(0).max(10)}),UY=_.object({observations:_.string(),reasoning:_.string(),command:ol});var tp=_.object({summary:_.string(),reasoning:_.string(),evaluation:_.discriminatedUnion("type",[_.object({type:_.literal("DONE")}),_.object({type:_.literal("RIGHT_TRACK")}),_.object({type:_.literal("WRONG_TRACK"),feedback:_.string()}),_.object({type:_.literal("IMPOSSIBLE")})])}),lI=_.object({startId:_.number().int(),endId:_.number().int()}),$S=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))($S||{}),qS=_.object({categoryThoughts:_.string(),category:_.nativeEnum($S),relevantSections:lI.array()}),ln=_.boolean().nullish().transform(r=>r??!1),KS=_.object({thoughts:_.string().optional(),isPageReady:ln,descriptionLabels:_.object({usesTextContent:ln,usesAppearance:ln,usesPosition:ln,usesRelativeElements:ln,usesSingleQuotes:ln,isAmbiguous:ln,targetDoesNotExist:ln,usesIcon:ln}).optional()});import{z as O}from"zod";import*as ae from"zod";var VY=ae.object({thoughts:ae.string().optional().describe("only provided if a description was provided"),target:En.optional().describe("only provided if a description was provided"),pageState:ae.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ae.object({label:ae.string(),value:ae.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ae.object({data:ae.string(),height:ae.number().int(),width:ae.number().int()}).optional().describe("only provided if returnScreenshot is true")}),YS=ae.union([ae.literal("ELEMENT_CHECK"),ae.literal("NEGATED_CHECK"),ae.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ae.literal("SELECT_OPTION"),ae.literal("TYPE")]);function Ca(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="EXISTS"&&r.assertion.negated)return"NEGATED_CHECK";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="VISIBLE"&&r.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(r.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Ra=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Ra||{}),oi=ae.object({matched:ae.boolean(),reason:ae.string().optional().describe("Human understandable description"),logs:ae.string().array().optional().describe("Logs for debugging")}),cI=oi.extend({type:ae.literal("USER_SELECTOR")}),uI=oi.extend({type:ae.literal("CSS_SELECTOR"),selectors:ae.string().array()}),dI=oi.extend({type:ae.literal("HYBRID_SELECTOR")}),pI=oi.extend({type:ae.literal("HTML_DISTANCE"),distance:ae.number().optional(),closestElement:ae.string().optional(),savedElement:ae.string().optional()}),mI=oi.extend({type:ae.literal("TEMPLATE_MATCHING"),elementImageUrl:ae.string().url()}),gI=oi.extend({type:ae.literal("AUTO_FRAME"),logs:ae.string().array().optional()}),XS=ae.discriminatedUnion("type",[cI,uI,dI,pI,mI,gI]);import{z as Ia}from"zod";import{z as CI}from"zod";import*as q from"zod";import{extendZodWithOpenApi as SI}from"zod-openapi";import{cloneDeep as aX}from"lodash-es";import lX from"truncate-json";import*as mo from"zod";import{extendZodWithOpenApi as fI}from"zod-openapi";import{z as Rt}from"zod";import{z as re}from"zod";import{z as rp}from"zod";var Br=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(Br||{});var bl=rp.object({width:rp.number().min(200).max(1e4),height:rp.number().min(200).max(1e4)}),JS={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},$Y=Object.keys(JS);var Pn=JS["Desktop Large"],QS="en-us",ZS="America/Los_Angeles";var El={latitude:37.7749,longitude:-122.4194};var Tl=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(Tl||{});var np=re.object({autoFollowNewTabs:re.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:re.union([re.boolean(),re.literal("inputs-only")]).optional(),ignoreHrefForCaching:re.boolean().optional(),disableSecondaryCacheResolution:re.boolean().optional(),hybridSelectorMode:re.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:re.union([re.boolean(),re.literal("always")]).optional(),visualActions:re.boolean().optional(),autoExpandIframes:re.boolean().optional(),disableHtmlSnapshots:re.boolean().optional(),defaultBrowserType:re.nativeEnum(Br).optional(),importantAttributes:re.string().array().optional(),importantClasses:re.string().array().optional(),importantStyles:re.string().array().optional()});var ey=1e4,ty=6e4,hI=re.object({server:re.string(),username:re.string().optional(),password:re.string().optional()}),uo=np.extend({pageLoadTimeoutMs:re.number().optional().refine(r=>r===void 0||r<=ty&&r>=-1,{message:`Page load timeout must be between 0 and ${ty/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:re.number().optional().refine(r=>r===void 0||r<=ey&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${ey/1e3} seconds`}),localChromeExtensionPaths:re.string().array().optional(),extraHeaders:re.record(re.string(),re.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:re.record(re.string(),re.record(re.string(),re.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:re.string().optional(),disableGpu:re.boolean().optional(),disableBrowserMonitoring:re.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:re.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:re.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:re.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:re.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:re.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:hI.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:re.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:re.nativeEnum(Tl).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var op="BASE_URL";var po="ENV_NAME",ii="TEST_NAME",tX={[op]:"https://www.google.com"},ry=Rt.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),ny=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.string().describe("variable value"))}),oy=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value")),browser:uo.optional()});var rX=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value"))});fI(mo);var ip=mo.object({env:mo.record(mo.unknown())}).openapi({ref:"TestContextSnapshot"});var Ke=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ke||{}),ap=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(ap||{});SI(q);var sp=q.object({beforeUrl:q.string().optional(),afterUrl:q.string().optional(),message:q.string().optional(),beforeSnapshot:q.string().optional(),afterSnapshot:q.string().optional(),startedAt:q.coerce.date(),finishedAt:q.coerce.date()}),yI=sp.extend({viewport:q.object({height:q.number(),width:q.number()}).nullish(),status:q.nativeEnum(ap),message:q.string().optional(),elementInteracted:q.string().optional()}),go=sp.extend({status:q.nativeEnum(Ke),message:q.string().optional(),data:q.unknown().optional(),beforeTestContext:ip.optional(),afterTestContext:ip.optional(),failureReason:q.nativeEnum(Re).optional(),details:q.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),iy=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(iy||{}),vl=go.merge(nr).extend({results:yI.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:q.lazy(()=>mt.array()).optional(),failureRecoveryStatus:q.object({type:q.nativeEnum(iy),message:q.string()}).optional()}),bI=go.merge(io).extend({results:q.lazy(()=>vl.array()),previousAttempts:q.lazy(()=>mt.array()).optional()}),EI=go.merge(ri).extend({results:q.lazy(()=>vl.array()),previousAttempts:q.lazy(()=>mt.array()).optional()}),TI=go.merge(sn).extend({moduleName:q.string().optional(),results:q.lazy(()=>mt.array()),previousAttempts:q.lazy(()=>mt.array()).optional()}),vI=go.merge(ni).extend({assertionResult:vl.optional(),results:q.lazy(()=>mt.array()).describe("results for the block actually executed"),previousAttempts:q.lazy(()=>mt.array()).optional()}),AI=go.merge(Aa).extend({results:q.lazy(()=>mt.array()),healingAttempts:q.lazy(()=>mt.array().array()).optional(),previousAttempts:q.lazy(()=>mt.array()).optional()}),mt=q.discriminatedUnion("type",[bI,EI,vl,TI,vI,AI]),wX=go.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),wI=sp.extend({index:q.number().optional(),userFacingStepReference:q.string().optional(),description:q.string(),pageState:q.string().optional(),elementInteracted:q.string().optional(),startedAt:q.coerce.date().or(q.string()).optional().catch(void 0),finishedAt:q.coerce.date().or(q.string()).optional().catch(void 0)}),Al=wI.extend({beforeScreenshot:q.string().optional(),afterScreenshot:q.string().optional()});var lp=CI.object({results:mt.array().describe("main results"),beforeResults:mt.array().optional(),afterResults:mt.array().optional()}),xa=lp.partial();import{z as H}from"zod";import{extendZodWithOpenApi as OI}from"zod-openapi";var ai=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(ai||{});import{isValidCron as RI}from"cron-validator";import{z as ce}from"zod";var ay=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var sy=1e4,xI=uo.extend({browserType:ce.nativeEnum(Br).optional(),slowMoMs:ce.number().optional().refine(r=>r===void 0||r<=sy&&r>=-1,{message:`Slow motion must be between 0 and ${sy} milliseconds`}),basicAuthorization:ce.object({username:ce.string().optional(),password:ce.string().optional()}).optional(),geolocation:ce.object({latitude:ce.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:ce.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:ce.boolean().optional(),locale:ce.string().optional(),timezone:ce.enum(ay).optional(),colorScheme:ce.enum(["light","dark"]).optional()});var Ma=ce.object({useMemory:ce.boolean().optional(),failureRecovery:ce.boolean().optional().describe("undefined means inherit org settings")}),MI=Ma.extend({disableAICaching:ce.boolean().optional(),failureRecoveryInstructions:ce.string().optional()}),_I=ce.object({viewport:bl.optional()}),_a=_I.merge(MI).merge(xI),si=ce.object({cron:ce.string().refine(r=>RI(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:ce.boolean().default(!1),env:ce.string().optional(),timeZone:ce.string().default("America/Los_Angeles"),jobKey:ce.string().optional()}),li=ce.object({onSuccess:ce.boolean().default(!1),failureMessage:ce.string().optional(),onFailure:ce.boolean().default(!0),successMessage:ce.string().optional()}),PI=ce.object({name:ce.string(),required:ce.boolean().optional(),defaultValue:ce.string().describe("this is not optional because we need a value when the editor is first loaded")}),wl=PI.array(),II=ce.object({name:ce.string(),value:ce.string()}),ly=II.array(),Cl=ce.object({name:ce.string(),default:ce.boolean().optional(),fixtures:ry.array().optional()});OI(H);var sr={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},xe=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(xe||{}),Rl=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(Rl||{});var ot=H.string().pipe(H.coerce.date()).or(H.date()),Pa=H.object({id:H.string(),runKey:H.string(),organizationId:H.string(),executionType:H.nativeEnum(ai).optional().default("WEB"),createdAt:ot,createdBy:H.string(),flake:H.boolean().nullish(),scheduledAt:ot.or(H.null()),startedAt:ot.or(H.null()),updatedAt:ot.nullish(),finishedAt:ot.or(H.null()),resolvedBaseUrl:H.string().nullish(),environmentName:H.string().nullish(),gitBranchName:H.string().nullish(),githubRepository:H.string().nullish(),gitlabProjectPath:H.string().nullish(),labels:H.array(H.string()).optional(),gitOriginUrl:H.string().nullish(),gitCommitSha:H.string().nullish(),gitCommitShaShort:H.string().nullish(),gitCommitAuthorName:H.string().nullish(),cliVersion:H.string().nullish(),section:H.nativeEnum(Rl).nullish(),status:H.nativeEnum(xe),trigger:H.nativeEnum(sr),attempts:H.number(),runAttempts:H.array(H.object({id:H.string(),status:H.nativeEnum(xe),startedAt:ot.or(H.null()),finishedAt:ot.or(H.null())})).optional(),videos:H.array(H.string()).optional(),failureReason:H.nativeEnum(Re).nullish(),failureDetails:ul.nullish(),failureRecoveryDetails:H.object({attempts:H.number()}).nullish(),pipelineId:H.string().nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),quarantined:H.boolean().nullish().default(!1),quarantinedReason:H.string().nullish(),localTestId:H.string().nullish(),testId:H.string().nullish(),testName:H.string().nullish(),description:H.string().nullish(),test:H.object({name:H.string(),id:H.string()}).nullish().default(null),suiteId:H.string().nullish()}).openapi({ref:"RunMetadata"}),LI={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},xl=Pa.pick({...LI,test:!0}),cy=Pa.omit({failureReason:!0,failureDetails:!0,test:!0}),cp=Pa.extend({stepsSnapshot:H.array(H.record(H.unknown())).nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),test:H.object({name:H.string(),id:H.string(),description:H.string().nullish(),baseUrl:H.string().nullish(),advanced:_a.nullish()}).nullish()}).merge(lp);var NI=Ia.object({id:Ia.string().uuid(),startedAt:ot.or(Ia.null()),finishedAt:ot.or(Ia.null()),status:Ia.nativeEnum(xe)}).merge(xa),XX=NI.array();import{z as it}from"zod";var DI=it.object({id:it.string(),status:it.nativeEnum(xe),trigger:it.nativeEnum(sr),createdAt:ot,startedAt:ot.nullish(),finishedAt:ot.nullish(),gitCommitSha:it.string().nullish(),gitCommitShaShort:it.string().nullish(),gitCommitTimestamp:ot.nullish(),gitBranchName:it.string().nullish(),gitOriginUrl:it.string().nullish(),gitCommitMessage:it.string().nullish(),gitCommitAuthorName:it.string().nullish(),githubRepository:it.string().nullish(),gitlabProjectPath:it.string().nullish(),pipelineId:it.string().nullish(),cliVersion:it.string().nullish(),labels:it.string().array().optional(),suite:it.object({id:it.string(),name:it.string()}).nullish(),runs:it.object({status:it.nativeEnum(xe)}).array()}).openapi({ref:"RunGroup"}),uy=DI.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:xl.array()});import{z as gt}from"zod";var kI=gt.object({type:gt.literal("TARGETING"),name:gt.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:XS.array(),pageState:gt.string().optional(),targetSource:gt.nativeEnum(bn).optional(),targetUpdateTime:gt.string().optional()}),UI=gt.object({type:gt.literal("AI_LOCATION"),matched:gt.boolean(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional(),thoughts:gt.string().optional()}),FI=gt.object({type:gt.literal("ASSERTION"),relevantElementsSerialized:gt.string().array().optional(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional()}),BI=gt.discriminatedUnion("type",[kI,UI,FI]);import{z as Qe}from"zod";var zI=Qe.object({id:Qe.string(),name:Qe.string()}),u5=zI.merge(Qe.object({createdAt:ot,createdBy:Qe.string(),schedule:si,notification:li,environment:Qe.object({name:Qe.string()}).nullish(),beforeTests:Qe.object({id:Qe.string()}).array().nullish(),afterTests:Qe.object({id:Qe.string()}).array().nullish()})),dy=Qe.object({id:Qe.string().uuid(),orgId:Qe.string(),createdAt:ot,startedAt:ot.or(Qe.null()),finishedAt:ot.or(Qe.null()),status:Qe.nativeEnum(xe),trigger:Qe.nativeEnum(sr),suite:Qe.object({id:Qe.string(),name:Qe.string()}).nullish(),runs:Pa.array()}),d5=dy.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),py=dy.extend({runs:xl.array()});import{z as lr}from"zod";import{cloneDeep as g5}from"lodash-es";import{z as Ae}from"zod";var E5=Ae.object({thoughts:Ae.string(),subGoals:Ae.object({instruction:Ae.string()}).array()}),T5=Ae.object({thoughts:Ae.string(),newPlanMarkdown:Ae.string()}),v5=Ae.object({thoughts:Ae.string(),correct:Ae.boolean(),failedActionIndex:Ae.number().optional()}),HI=Ae.object({type:Ae.literal("PLANNING"),beforePlan:Ae.string(),goalDecision:Ae.string(),thoughts:Ae.string()}),GI=Ae.object({type:Ae.literal("RUNNING"),stepDisplayName:Ae.string(),status:Ae.nativeEnum(Ke),results:mt.array()}),VI=Ae.object({type:Ae.literal("REVISING"),beforePlan:Ae.string(),afterPlan:Ae.string(),errString:Ae.string(),diffs:Ae.string(),thoughts:Ae.string()}),WI=Ae.object({type:Ae.literal("SYSTEM"),message:Ae.string()}),jI=Ae.discriminatedUnion("type",[HI,GI,VI,WI]),my=jI.array();var x5=lr.object({id:lr.string(),scheduledAt:lr.coerce.date().nullable(),startedAt:lr.coerce.date().nullable(),finishedAt:lr.coerce.date().nullable(),status:lr.nativeEnum(xe),history:my.nullable(),testPlan:lr.object({id:lr.string(),name:lr.string()}).nullable(),test:lr.object({id:lr.string(),name:lr.string()}).nullable()});import{z as Ft}from"zod";var up=Ft.object({content:Ft.string(),ids:Ft.string().array(),tokenLength:Ft.number()}),$I=Ft.object({chunks:up.array()}),W5=Ft.object({ids:Ft.string().array(),score:Ft.number(),tokenLength:Ft.number()}),j5=$I.extend({description:Ft.string().describe("Input to pass to RAG engine"),tokenLimit:Ft.number()}),gy=Ft.object({ids:Ft.number().array()}),hy=Ft.object({indices:Ft.number().array()});var at=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),clientMode:O.enum(["interactive","runner"]).optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),Z5=at.extend({chunks:up.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number(),callId:O.string().optional()}),qI=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),fy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:YS.optional().catch(void 0),memory:O.discriminatedUnion("type",[on,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Sy=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),yy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),KI=O.literal("NEGATED_CHECK"),by=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:Id.optional(),memory:O.discriminatedUnion("type",[ua,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional(),source:KI.optional()}),Ey=O.object({command:ei}),Ty=O.object({message:O.string()}),vy=O.object({messagesAndToolCalls:O.array(O.string())}),Ay=O.object({messagesAndToolCalls:O.array(O.string()).describe("Chat history to condense for summarization")}),dp=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:qI.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),wy=O.object({results:Al.array(),errorMessage:O.string(),errorStack:O.string().optional()}),Cy=O.object({results:Al.array(),goal:O.string(),errorMessage:O.string()}),Ry=O.object({failedResults:Al.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string(),customInstructions:O.string().optional(),testDescription:O.string().optional()}),e3=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()}),xy=O.object({type:O.string(),browserContext:O.string(),currentStep:O.string(),screenshot:O.string()}),My=O.object({description:O.string(),browserState:O.string(),screenshot:O.string()});import{z as Oa}from"zod";var n3=Oa.object({goal:Oa.string()}),_y=Oa.object({keywords:Oa.array(Oa.string())});import{z as pp}from"zod";var Ml=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(Ml||{}),a3=pp.nativeEnum(Ml),YI=pp.enum(["v1","v2","v3"]),s3=YI.or(pp.string().describe("for people with special configurations"));var Py={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};import{z as ee}from"zod";import{v4 as di}from"uuid";import pe from"zod";import{v4 as m3}from"uuid";import{z as B}from"zod";import*as F from"zod";var Iy=F.discriminatedUnion("type",[F.object({type:F.literal("SCREEN")}),F.object({type:F.literal("OPEN_APP")}),F.object({type:F.literal("OPEN_WEBVIEW")})]),ho=F.object({type:F.literal("description"),description:F.string()}),Oy=F.object({type:F.literal("CUSTOM_COORDINATES"),startX:F.number().describe("Starting X coordinate in pixels"),startY:F.number().describe("Starting Y coordinate in pixels"),deltaPixels:F.number().describe("Number of pixels to scroll in the specified direction")}),mp=F.discriminatedUnion("type",[...Iy.options,F.object({type:F.literal("CUSTOM"),target:ho}),Oy]);var XI=F.object({type:F.literal("coordinates"),xPercent:F.number(),yPercent:F.number()}),_l=F.discriminatedUnion("type",[ho,XI]),Ly=F.object({requiredText:F.string().optional(),requiredAttributes:F.record(F.string(),F.string()).optional(),requiredBounds:F.boolean().optional(),position:F.object({x1:F.number(),y1:F.number(),x2:F.number(),y2:F.number(),tolerance:F.nativeEnum(It),preciseTolerance:F.boolean().optional()}).optional(),shape:F.object({width:F.number(),height:F.number(),tolerance:F.nativeEnum(It),preciseTolerance:F.boolean().optional()}).optional()}),JI=F.object({xPath:F.string(),requirements:Ly.optional()}),QI=F.object({type:F.literal("CUSTOM"),target:ho,cache:F.lazy(()=>Ny).optional()}),ZI=F.object({pixelDelta:F.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:F.union([Iy,QI,Oy]),direction:F.enum(["up","down"])}),Ny=F.object({type:F.literal("NATIVE"),bounds:F.number().array(),resolvedDescription:F.string(),xPath:F.string(),elementOnlySerializedXml:F.string(),scrollDetails:ZI.optional(),requirements:Ly.optional(),requiredRelatedElements:JI.array().optional(),memory:on.optional()}),eO=F.object({type:F.literal("WEBVIEW"),resolvedDescription:F.string(),xPath:F.string(),browserCache:En.optional(),memory:on.optional()}),ci=F.union([Ny,eO]);var cn=(M=>(M.AI_CHECK="AI_CHECK",M.TAP="TAP",M.TYPE="TYPE",M.PRESS="PRESS",M.PRESS_KEYBOARD="PRESS_KEYBOARD",M.OPEN_APP="OPEN_APP",M.KILL_APP="KILL_APP",M.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",M.SWIPE="SWIPE",M.SCROLL_TO="SCROLL_TO",M.SCREEN_CHECK="SCREEN_CHECK",M.ELEMENT_CHECK="ELEMENT_CHECK",M.DRAG_AND_DROP="DRAG_AND_DROP",M.JAVASCRIPT="JAVASCRIPT",M.REQUEST="REQUEST",M.WAIT="WAIT",M.ADD_FILE="ADD_FILE",M.INSTALL_APP="INSTALL_APP",M.UNINSTALL_APP="UNINSTALL_APP",M.TOGGLE_SETTINGS="TOGGLE_SETTINGS",M.ADB="ADB",M.STATE="STATE",M))(cn||{}),La=(c=>(c.BACK="BACK",c.HOME="HOME",c.APP_SWITCHER="APP_SWITCHER",c.POWER="POWER",c.SEARCH="SEARCH",c.VOLUME_UP="VOLUME_UP",c.VOLUME_DOWN="VOLUME_DOWN",c.VOLUME_MUTE="VOLUME_MUTE",c))(La||{}),hp=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(hp||{}),Pl=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(Pl||{}),Dy=B.object({updatedAt:B.coerce.date().optional()}),Ye=B.object({id:B.string().uuid(),disableCache:B.boolean().optional()}),tO=Ye.extend({type:B.literal("STATE")}),rO=Ye.extend({type:B.literal("KILL_APP")}),In=Dy.extend({target:ci}),Il=Dy.extend({fromTarget:ci,toTarget:ci}),fp=Ye.extend({type:B.literal("AI_CHECK"),assertion:B.string(),timeoutSecs:B.number().optional(),cache:vn.optional()}),Sp=Ye.extend({type:B.literal("TAP"),target:_l,cache:In.optional(),longPress:B.boolean().optional(),longPressDurationMs:B.number().optional(),doubleTap:B.boolean().optional(),doubleTapDelayMs:B.number().optional(),relativePosition:B.object({x:B.number(),y:B.number()}).optional()}),yp=Ye.extend({type:B.literal("TYPE"),target:_l.optional(),cache:In.optional(),keyPressDelayMs:B.number().optional(),text:B.string(),clearContent:B.boolean().optional(),forceClearContent:B.boolean().optional()});var nO=Ye.extend({type:B.literal("PRESS"),key:B.nativeEnum(La),longPress:B.boolean().optional()}),oO=Ye.extend({type:B.literal("PRESS_KEYBOARD"),key:B.nativeEnum(hp)}),iO=Ye.extend({type:B.literal("OPEN_APP"),packageName:B.string(),activityName:B.string().optional(),intentExtras:B.string().optional()}),aO=Ye.extend({type:B.literal("OPEN_NOTIFICATION_DRAWER")}),bp=Ye.extend({type:B.literal("SWIPE"),direction:B.enum(["up","down","left","right"]),scrollableElement:mp,cache:In.optional(),viewportPercent:B.number().optional(),durationMs:B.number().optional()}),Ep=Ye.extend({type:B.literal("SCROLL_TO"),target:ho,direction:B.enum(["down","up"]),scrollableElement:mp,scrollStepPercent:B.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:In.optional()});var sO=B.object({type:B.literal("CONTENT"),negated:B.boolean().optional(),value:B.string()}),lO=Ye.extend({type:B.literal("SCREEN_CHECK"),assertion:sO,timeout:B.number().int().min(0).max(Jo).optional().describe("max seconds to wait for the assertion to be true")}),Tp=Ye.extend({type:B.literal("ELEMENT_CHECK"),target:_l,cache:In.optional(),assertion:Zs,timeout:B.number().int().min(0).max(Jo).optional().describe("max seconds to wait for the assertion to be true")}),vp=Ye.extend({type:B.literal("DRAG_AND_DROP"),fromTarget:ho,toTarget:ho,cache:Il.optional(),hoverDuration:B.number().optional(),dragDuration:B.number().optional()}),cO=Ye.extend({type:B.literal("JAVASCRIPT"),code:B.string(),timeout:B.number().int().max(60).optional().describe("Max seconds for the code to complete")}),uO=Ye.extend({type:B.literal("REQUEST")}).merge(ro),dO=Ye.extend({type:B.literal("WAIT"),timeoutSecs:B.number()}),pO=Ye.extend({type:B.literal("ADB"),command:B.string(),jsonArgs:B.string().optional()}),mO=Ye.extend({type:B.literal("ADD_FILE"),file:B.string(),storageLocation:B.string()}),gO=B.string().trim(),hO=Ye.extend({type:B.literal("INSTALL_APP"),uri:gO}),fO=Ye.extend({type:B.literal("UNINSTALL_APP"),packageName:B.string()}),SO=Ye.extend({type:B.literal("TOGGLE_SETTINGS"),settingsType:B.nativeEnum(Pl)}),ky=B.discriminatedUnion("type",[fp,Sp,yp,nO,iO,aO,oO,bp,Ep,lO,Tp,vp,cO,uO,dO,mO,hO,fO,SO,rO,pO,tO]);var ui=r=>{switch(r.type){case"description":return r.description;case"coordinates":return`${r.xPercent}%, ${r.yPercent}%`}};var yO=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],Fy=pe.object({type:pe.enum(yO).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:pe.string().or(pe.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),bO=pe.object({type:pe.literal("TAP"),description:pe.string().describe("Description of the element to tap."),longPress:pe.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),doubleTap:pe.boolean().describe("Whether to tap twice in quick succession."),relativePosition:pe.null().or(pe.object({x:pe.number(),y:pe.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
|
|
10
10
|
Tap on an element on the screen.
|
|
11
|
-
`),
|
|
11
|
+
`),EO=pe.object({type:pe.literal("PRESS"),key:pe.nativeEnum(La)}).describe(`
|
|
12
12
|
Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher).
|
|
13
|
-
`),
|
|
13
|
+
`),TO=pe.object({type:pe.literal("AI_CHECK"),assertion:pe.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:pe.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe(`
|
|
14
14
|
Use AI to verify a statement about the current state of the emulator or wait until a statement is true.
|
|
15
|
-
`),
|
|
15
|
+
`),vO=pe.object({type:pe.literal("TYPE"),text:pe.string().describe("Exact type to text, which will be passed to appium's driver.keys() method."),keyPressDelayMs:pe.number().or(pe.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:pe.boolean().or(pe.null()).describe("Clear the content of the input before typing. Do not set to true if the input is already empty.")}),AO=pe.object({type:pe.literal("SWIPE"),direction:pe.enum(["up","down","left","right"]).describe("Direction to swipe within the container. Swiping up will scroll down, and vice versa."),container:Fy,viewportPercent:pe.number().min(.1).max(1).nullish().describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Defaults to 0.8 when omitted."),durationMs:pe.number().int().positive().nullish().describe("Optional swipe duration in milliseconds. Leave null for default.")}).describe(`
|
|
16
16
|
Swipe in a direction within a container (screen/app/webview).
|
|
17
|
-
`),
|
|
17
|
+
`),wO=pe.object({type:pe.literal("SCROLL_TO"),targetDescription:pe.string().describe("Description of the element or text to scroll to inside the container. Scrolling up will bring you up in the page, and vice versa."),direction:pe.enum(["down","up"]).describe("Direction to scroll while searching for the target."),container:Fy,scrollStepPercent:pe.number().min(.1).max(1).nullish().describe("How much of the container height to scroll at each step (0.1 - 1). Defaults to 0.8 when omitted.")}).describe(`
|
|
18
18
|
Scroll within a container until the described target is visible. Scrolling up or down will scroll until it finds it or can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If a scroll fails, we do not restore the position automatically.
|
|
19
|
-
`),bm=me.discriminatedUnion("type",[fO,SO,yO,bO,EO,TO]),Uy=r=>{switch(r.type){case"SCREEN":return{type:"SCREEN"};case"OPEN_APP":return{type:"OPEN_APP"};case"OPEN_WEBVIEW":return{type:"OPEN_WEBVIEW"};case"CUSTOM":if(!r.description)throw new sl("Description is required when container type is CUSTOM.");return{type:"CUSTOM",target:{type:"description",description:r.description}};default:{let e=r;throw new Error("Unreachable")}}},By=r=>{let e=bm.parse(r);switch(e.type){case"TAP":return{id:ci(),type:"TAP",target:{type:"description",description:e.description},longPress:e.longPress??void 0,doubleTap:e.doubleTap??void 0,relativePosition:e.relativePosition??void 0};case"PRESS":return{id:ci(),...e};case"AI_CHECK":return{id:ci(),...e};case"TYPE":return{id:ci(),type:"TYPE",text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0};case"SWIPE":return{id:ci(),type:"SWIPE",direction:e.direction,scrollableElement:Uy(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case"SCROLL_TO":return{id:ci(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:Uy(e.container),scrollStepPercent:e.scrollStepPercent??void 0};default:{let t=e;throw new Error("Unreachable")}}},C3={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true."};var R3=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","AI_CHECK"];import vO from"zod";var mo={type:!0,cache:!0},Mn=vO.discriminatedUnion("type",[mm.pick(mo),Sm.pick(mo),pm.pick(mo),gm.pick(mo),hm.pick(mo),fm.pick(mo),ym.pick(mo)]),AO=Object.values(an).filter(r=>Mn.options.some(e=>e.shape.type.safeParse(r).success));function Ml(r){return AO.includes(r.type)}var zy=da(Mn),Hy=ma(Mn),O3=tl(Mn);import Gy from"zod";var _l=(t=>(t.US_WEST_1="us-west1",t.EU_NORTH_1="eu-north1",t))(_l||{}),Pl=(e=>(e.LOCAL="local",e))(Pl||{}),Vy=Gy.nativeEnum(_l).or(Gy.nativeEnum(Pl)),_a=(t=>(t.ANDROID_14="14",t.ANDROID_15="15",t))(_a||{});var Wy="14";import{cloneDeep as Pa}from"lodash-es";import jy from"truncate-json";var wO="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",CO=[so,ni],$y=[so,ni],ui=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,n={}){return new r({testName:e,envName:t,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[so],o=e.env[ni],i={};for(let[s,c]of Object.entries(e.env))$y.includes(s)||(t??{})[s]===void 0&&(i[s]=c);return new r({dynamicVariables:i,envName:n,testName:o,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Pa(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){CO.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[so]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Pa(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>$y.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,wO]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=jy(JSON.stringify(o),1e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=jy(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=Pa(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(so,e.envName),e.testName&&this.setMomenticSystemVariable(ni,e.testName)}getDynamicVariablesCopy(){return Pa(this.env)}getVariablesFromEnvironmentCopy(){return Pa(this.varsFromMomenticEnvironment)}};import Ze from"zod";import{z as vr}from"zod";import{z as He}from"zod";var Tr=He.object({id:He.string(),name:ti,baseUrl:gl,description:He.string().optional().nullish(),schemaVersion:He.string(),advanced:wa,retries:He.number(),envs:He.array(Tl).nullish(),parameters:El.nullish(),disabled:He.boolean().optional(),labels:He.array(He.string()).optional().catch([])}),W3=He.enum(["INHERIT","ENABLED","DISABLED"]);var RO=wa.extend({failureRecovery:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var j3=Tr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:RO}),$3=Tr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),xO=He.object({labels:He.array(He.string()).optional(),outputs:ly.nullish()}),di=Tr.merge(xO),MO=He.object({createdAt:He.coerce.date(),updatedAt:He.coerce.date(),updatedBy:He.string().nullable(),schedule:ii,notification:ai,createdBy:He.string(),organizationId:He.string(),folderId:He.string().nullable().optional()}),_O=Tr.merge(MO),q3=_O.merge(ro),Il=Tr.merge(ro),K3=Tr.merge(no);var PO="test",IO="module",OO="mobile-test",LO="mobile-module";var De=(o=>(o.TEST=`momentic/${PO}`,o.MODULE=`momentic/${IO}`,o.MOBILE_TEST=`momentic/${OO}`,o.MOBILE_MODULE=`momentic/${LO}`,o))(De||{}),t4=Tr.merge(no),qy=nr.extend({steps:vr.array(vr.record(vr.string(),vr.unknown())),schemaVersion:vr.string()}),r4=qy.extend({fileType:vr.literal(De.MODULE)}),n4=vr.object({test:vr.string().describe("YAML for the test, including metadata and steps"),modules:vr.record(vr.string(),vr.string()).describe("Map of module name to YAML for the module")});function mi(r){if(r===void 0)return"__undefined__";if(r===null)return null;if(typeof r!="object")return r;if(Array.isArray(r))return r.map(mi);let e={};for(let[t,n]of Object.entries(r))e[t]=mi(n);return e}import yt from"zod";var Bt=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(Bt||{}),Ia=yt.object({id:yt.string().uuid(),envKey:yt.string().optional(),skipped:yt.boolean().optional(),retries:yt.number().optional()}),Oa=Ia.extend({type:yt.literal("MOBILE_PRESET_STEP"),command:ky,keyPressDelayMs:yt.number().optional()}),Ol=yt.object({moduleId:yt.string(),inputs:yt.record(yt.string(),yt.string()).optional()}),La=Ia.merge(Ol.extend({type:yt.literal("MOBILE_MODULE_STEP")})),s4=Ol.extend({steps:yt.lazy(()=>Vt.array())}),Na=Ia.extend({type:yt.literal("MOBILE_AI_ACTION_STEP"),text:yt.string()}),Vt=yt.discriminatedUnion("type",[Oa,La,Na]);var Em=Ze.object({parameterNames:Ze.string().array(),defaultParameters:Ze.record(Ze.string(),Ze.string()).optional(),parameterEnums:Ze.record(Ze.string(),Ze.string().array()).optional()}),Ky=Ze.object({moduleId:Ze.string().uuid(),name:Ze.string(),description:Ze.string().nullish(),parameters:Em.optional(),enabled:Ze.boolean().nullish(),schemaVersion:Ze.string()}),Da=Ky.omit({name:!0}),Ll=Da.extend({steps:Ze.array(Ze.record(Ze.string(),Ze.unknown()))}),Yy=Ze.object({fileType:Ze.literal(De.MOBILE_MODULE)}).merge(Ll),Xy=Ky.omit({schemaVersion:!0}).extend({steps:Ze.array(Vt)});import Oe from"zod";import ka from"zod";var sn=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(sn||{}),Tm=Ol.extend({steps:ka.lazy(()=>pi.array()),description:ka.string().optional(),name:ka.string().describe("name of the module"),parameters:Em.optional()}),NO=Ia.merge(Tm).extend({type:ka.literal("RESOLVED_MOBILE_MODULE")}),pi=ka.discriminatedUnion("type",[NO,Oa,Na]);function Jy(r){return Object.values(sn).includes(r)||Object.values(Bt).includes(r)}var DO=Oe.object({disableMomenticAccessibilityTree:Oe.boolean().optional(),autoGrantPermissions:Oe.boolean().optional()}),vm=DO.extend({region:Vy.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Oe.object({androidVersion:Oe.nativeEnum(_a).optional()}).optional(),localEmulatorSettings:Oe.object({avdId:Oe.string()}).optional(),geolocation:Oe.object({latitude:Oe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Oe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional()}),Ua=Oe.object({retries:Oe.number().optional().describe("number of retries to run"),defaultChannel:Oe.string().optional().describe("default channel to use"),defaultTag:Oe.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Oe.string().optional(),defaultApkFilePath:Oe.string().trim().min(1,"APK file path must not be empty.").optional().describe("APK to install when using the emulator in the local region."),emulator:vm.optional(),ai:Aa.optional()}),Ar=Oe.object({id:Oe.string().uuid(),description:Oe.string(),schemaVersion:Oe.string(),settings:Ua.optional()}),Am=Oe.object({fileType:Oe.literal(De.MOBILE_TEST)}).merge(Ar),kO=Ar.merge(Oe.object({steps:Oe.array(Vt)})),P4=Am.merge(kO),I4=Oe.object({name:Oe.string(),steps:Oe.array(Vt).optional(),settings:Ua.optional()}),UO=Ar.extend({steps:pi.array()});import pe from"zod";var Ur=pe.object({startTime:pe.number(),endTime:pe.number().optional(),durationMs:pe.number().optional(),error:pe.string().optional(),result:pe.unknown().optional(),attributes:pe.record(pe.string(),pe.unknown())});var FO=Ur.extend({type:pe.literal("SECTION"),name:pe.string(),subSpans:pe.lazy(()=>wm.array())}),BO=Ur.extend({type:pe.literal("AI_LOCATOR_CALL"),result:pe.object({id:pe.number(),thoughts:pe.string()}).optional()}),zO=Ur.extend({type:pe.literal("AI_ASSERTION_CALL"),result:pe.object({thoughts:pe.string(),result:pe.boolean()}).optional()}),HO=Ur.extend({type:pe.literal("TARGET_RESOLUTION"),result:pe.object({serializedElement:pe.string()}).optional()}),GO=Ur.extend({type:pe.literal("EMULATOR_INTERACTION"),name:pe.string(),withinWebview:pe.boolean().optional()}),VO=Ur.extend({type:pe.literal("EMULATOR_READ_STATE"),name:pe.string()}),WO=Ur.extend({type:pe.literal("ELEMENT_ASSERTION"),name:pe.string(),result:pe.object({success:pe.boolean(),message:pe.string().optional()}).optional()}),jO=Ur.extend({type:pe.literal("CACHE_RESOLUTION")}),$O=Ur.extend({type:pe.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),qO=Ur.extend({type:pe.literal("GENERIC"),name:pe.string()}),wm=pe.discriminatedUnion("type",[FO,BO,zO,HO,GO,VO,WO,jO,$O,qO]);import xt from"zod";var Fa=xt.object({message:xt.string().optional(),startTime:xt.number(),endTime:xt.number(),status:xt.nativeEnum(Ke),trace:xt.unknown(),beforeSnapshot:xt.string().optional(),afterSnapshot:xt.string().optional(),data:xt.unknown().optional().describe("output data from the step")}),KO=Fa.merge(Oa).extend({previousAttempts:xt.lazy(()=>zt.array()).optional()}),YO=Fa.merge(La).extend({steps:xt.lazy(()=>zt.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>zt.array()).optional()}),XO=Fa.merge(Na).extend({steps:xt.lazy(()=>zt.array()),previousAttempts:xt.lazy(()=>zt.array()).optional()}),zt=xt.discriminatedUnion("type",[KO,YO,XO]);import{parse as V4}from"date-fns";import Ba from"zod";var JO=Fa.extend({index:Ba.number().optional(),userFacingStepReference:Ba.string().optional(),description:Ba.string()}),Qy=JO.extend({beforeScreenshot:Ba.string().optional(),afterScreenshot:Ba.string().optional()});var Zy=Z.object({attributesRequired:Z.array(Z.string()).optional(),textRequired:Z.boolean().optional(),boundsRequired:Z.boolean().optional(),positionSpecificity:Z.nativeEnum(It).optional(),shapeSpecificity:Z.nativeEnum(It).optional()}),eb=Z.object({id:Z.number(),thoughts:Z.string(),updatedMemory:ta.optional(),inWebview:Z.boolean().optional(),requirements:Zy.optional(),additionalElements:Z.object({id:Z.number(),requirements:Zy}).array().optional()}),tb=Z.object({description:Z.string(),screenXml:Z.string(),screenshot:Z.string(),memory:Z.discriminatedUnion("type",[en,Z.object({type:Z.literal("RESOLVED_TRACES"),traces:Z.unknown().array()})]).optional()}),rb=Z.object({assertion:Z.string(),screenXml:Z.string(),screenshot:Z.string(),memory:Z.discriminatedUnion("type",[ia,Z.object({type:Z.literal("RESOLVED_TRACES"),traces:Z.unknown().array()})]).optional()}),nb=Z.object({thoughts:Z.string(),result:Z.boolean(),relevantElements:Z.array(Z.number()).optional(),updatedMemory:oa.optional()}),ob=Z.object({failedResults:Qy.array(),nextStepsSerialized:Z.string().array(),currentScreenXml:Z.string(),currentScreenshot:Z.string(),customInstructions:Z.string().optional(),testDescription:Z.string()}),ib=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(ib||{}),ab=Z.object({thoughts:Z.string(),scenario:Z.nativeEnum(ib),instructions:Z.string().nullish()});import{z as po}from"zod";var sb=po.object({id:po.string().uuid(),skipped:po.boolean().optional(),envKey:po.string().optional().describe("key in the environment to save the result of this step to")}),Cm=sb.merge(Qn).extend({type:po.literal("REQUEST")}),Rm=sb.merge(Xs).extend({type:po.literal("JAVASCRIPT")}),xm=po.discriminatedUnion("type",[Rm,Cm]);import{z as lr}from"zod";var lb=lr.object({id:lr.string(),name:ti,description:lr.string().optional().nullish(),baseUrl:gl.nullish(),schemaVersion:lr.string(),advanced:lr.unknown().optional(),retries:lr.number(),envs:lr.array(Tl).nullish(),parameters:El.nullish()}),QO=lr.object({createdAt:lr.coerce.date(),updatedAt:lr.coerce.date(),schedule:ii.nullish(),notification:ai.nullish(),createdBy:lr.string(),organizationId:lr.string()}),ZO=lb.merge(QO),NJ=ZO.extend({steps:xm.array()}),DJ=lb.extend({steps:xm.array()});import{z as Wt}from"zod";var cb=Wt.object({startedAt:Wt.coerce.date(),finishedAt:Wt.coerce.date(),status:Wt.nativeEnum(Ke),message:Wt.string().optional(),data:Wt.unknown().optional()}),eL=cb.merge(Rm).extend({type:Wt.literal("JAVASCRIPT")}),tL=cb.merge(Cm).extend({type:Wt.literal("REQUEST")}),rL=Wt.discriminatedUnion("type",[eL,tL]),ub=Wt.object({startedAt:Wt.coerce.date(),finishedAt:Wt.coerce.date().nullish(),status:Wt.nativeEnum(xe),results:rL.array(),failureReason:Wt.string().nullish(),failureDetails:al.nullish()});import{z as jt}from"zod";var nL=jt.object({id:jt.string(),organizationId:jt.string(),createdAt:jt.coerce.date(),updatedAt:jt.coerce.date(),createdBy:jt.string(),scheduledAt:jt.coerce.date().nullish(),startedAt:jt.coerce.date().nullish(),finishedAt:jt.coerce.date().nullish(),status:jt.nativeEnum(xe),trigger:jt.nativeEnum(ar),results:ub.array().nullish(),apiTestName:jt.string().nullish(),apiTestPath:jt.string().nullish(),apiTestId:jt.string().nullish()}),jJ=nL.pick({status:!0,startedAt:!0,finishedAt:!0});var za=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(za||{}),db=3;function oL(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function Mm(r){if(!oL(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function _m(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return db;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Nl=class{trackStepExecution(){}async flush(){}};import{parseString as iL,splitCookiesString as aL}from"set-cookie-parser";import{z as we}from"zod";var Pm=we.object({name:we.string(),value:we.string(),url:we.string().optional(),domain:we.string().optional(),path:we.string().optional(),expires:we.number().default(Date.now()/1e3+60*60*24*365),httpOnly:we.boolean().optional(),secure:we.boolean().default(!0),sameSite:we.union([we.literal("Strict"),we.literal("Lax"),we.literal("None")]).default("None")});function Dl(r,e){let t=[],n=aL(r);for(let o of n){let i=iL(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=Pm.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,m]=u.split("=");if(!d||!m)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...s,name:d,value:m})}}return t}var sL=we.object({origin:we.string(),localStorage:we.array(we.object({name:we.string(),value:we.string()}))}),lL=we.object({entries:we.record(we.string(),we.array(we.tuple([we.unknown(),we.unknown()]))),version:we.number().optional()}),mb=we.object({cookies:Pm.array().optional(),origins:sL.array().optional(),idb:we.record(we.string(),lL).optional().describe("key is db name")});function kl(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=Pm.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var f8=new Set(Object.values(nt));var cL={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},S8={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},y8={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",CONDITIONAL:"Execute steps based on the outcome of an AI Check",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},b8={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ADB:"ADB command",STATE:"Debug state"},E8={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen."};import uL from"semver";import{z as dL}from"zod";var w8=dL.string().refine(r=>uL.valid(r),{message:"must be a valid semver string"});import{Faker as x8,en as M8}from"@faker-js/faker";import{z as D}from"zod";var P8=D.object({body:D.string(),to:D.string(),from:D.string()}),I8=D.object({from:D.string().optional(),to:D.string(),timeout:D.number().optional(),beforeDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional()}),O8=D.object({to:D.string().email(),from:D.string(),subject:D.string(),body:D.string(),html:D.string().optional()}),L8=D.object({inbox:D.string().transform(r=>r.toLowerCase()),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),timeout:D.number().optional(),trimWhitespace:D.boolean().optional()}),N8=D.object({inbox:D.string(),limit:D.number().optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),trimWhitespace:D.boolean().optional()});var Ul=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(Ul||{}),pb=D.object({body:D.string().nullish(),status:D.number().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}),mL=D.object({url:D.string(),options:D.object({method:D.string(),body:D.string().nullish(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),pL=D.object({body:D.string().nullish(),options:D.object({status:D.number(),statusText:D.string().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),gb=D.object({result:D.unknown(),variableUpdates:D.record(D.string(),D.unknown()).optional(),persistentVariableUpdates:D.record(D.string(),D.unknown()).optional(),error:D.string().optional(),success:D.boolean()}),D8=D.object({id:D.string().optional(),orgId:D.string(),momenticLambdaAuthHash:D.string(),code:D.string(),fragment:D.boolean(),state:D.object({env:D.record(D.string(),D.unknown()),request:mL,response:pL,additionalBindings:D.record(D.string(),D.unknown()).optional()}),timeoutMs:D.number().optional(),disallowVariableUpdates:D.boolean().optional(),responseSerialization:D.nativeEnum(Ul).optional()}),_n=15e3;import*as Mt from"zod";import{extendZodWithOpenApi as gL}from"zod-openapi";gL(Mt);var hL=Mt.object({url:Mt.string(),lineNumber:Mt.number(),columnNumber:Mt.number()}).openapi({ref:"CodeLocation"}),Fl=Mt.object({timestamp:Mt.number(),text:Mt.string(),type:Mt.string(),tabIndex:Mt.number(),args:Mt.unknown().array().optional(),url:Mt.string().optional(),location:hL.optional()}).openapi({ref:"ConsoleLog"}),hb=Fl.array(),fb=hb.array();import*as Im from"zod";import{extendZodWithOpenApi as fL}from"zod-openapi";fL(Im);var SL=Im.object({logsPerPage:Fl.array().array()}).openapi({ref:"DebugData"});import{z as P}from"zod";var yL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),bL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),EL=P.object({onContentLoad:P.number().optional(),onLoad:P.number().optional(),comment:P.string().optional()}),Bl=P.object({startedDateTime:P.string(),id:P.string(),title:P.string().optional(),pageTimings:EL,comment:P.string().optional()}),TL=P.array(Bl),vL=P.object({name:P.string(),value:P.string(),path:P.string().optional(),domain:P.string().optional(),expires:P.string().optional(),httpOnly:P.boolean().optional(),secure:P.boolean().optional(),comment:P.string().optional()}),yb=P.array(vL),AL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),bb=P.array(AL),wL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),CL=P.array(wL),RL=P.object({name:P.string(),value:P.string().optional(),fileName:P.string().optional(),contentType:P.string().optional(),comment:P.string().optional()}),xL=P.array(RL),ML=P.object({mimeType:P.string(),params:xL,text:P.string(),comment:P.string().optional(),_redactedReason:P.string().optional()}),_L=P.object({method:P.string(),url:P.string(),httpVersion:P.string().optional(),cookies:yb,headers:bb,queryString:CL,postData:ML.optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional()}),PL=P.object({size:P.number().optional(),compression:P.number().optional(),mimeType:P.string().optional(),text:P.string().optional(),encoding:P.string().optional(),comment:P.string().optional(),_redactedReason:P.string().optional()}),IL=P.object({status:P.number(),statusText:P.string(),httpVersion:P.string().optional(),cookies:yb,headers:bb,content:PL,redirectURL:P.string().optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional(),_mocked:P.boolean().optional()}),Sb=P.object({expires:P.string().optional(),lastAccess:P.string(),eTag:P.string(),hitCount:P.number(),comment:P.string().optional()}),OL=P.object({beforeRequest:Sb.optional(),afterRequest:Sb.optional(),comment:P.string().optional()}),LL=P.object({blocked:P.number().optional(),dns:P.number().optional(),connect:P.number().optional(),send:P.number(),wait:P.number(),receive:P.number(),ssl:P.number().optional(),comment:P.string().optional()}),zl=P.object({pageref:P.string().optional(),startedDateTime:P.string(),time:P.number().optional(),request:_L,response:IL.optional(),cache:OL.optional(),timings:LL,serverIPAddress:P.string().optional(),connection:P.string().optional(),comment:P.string().optional(),_resourceType:P.string().optional()}),NL=P.array(zl),DL=P.object({version:P.string().default("1.1"),creator:yL.optional(),browser:bL.optional(),pages:TL.optional(),entries:NL,comment:P.string().optional()}),kL=P.object({log:DL}),K8=P.record(P.string(),Bl),Y8=P.record(P.string(),zl);import{cloneDeep as FL}from"lodash-es";import{z as Fr}from"zod";var Tb=(c=>(c.DisableClickhouseCaches="disable_clickhouse_caches",c.ShowZeroOpacityElements="show_zero_opacity_elements",c.VisualActions="visual_actions",c.RagV2="rag_v2",c.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",c.GlobalLocatorRedirect="global_locator_redirect",c.FakerConstantSeed="faker_constant_seed",c.AutoExpandIframes="auto_expand_iframes",c))(Tb||{});var Eb=Fr.union([Fr.string(),Fr.number(),Fr.boolean(),Fr.null(),Fr.record(Fr.string(),Fr.lazy(()=>Eb)),Fr.array(Fr.lazy(()=>Eb))]),Hl=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=FL(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(Tb).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},a6=new Hl({},{});var Om={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},vb=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],l6=Object.keys(Om);import*as Ab from"zod";var u6=Ab.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as Pn}from"zod";var p6=Pn.object({id:Pn.string(),name:Pn.string(),createdAt:Pn.coerce.date(),createdBy:Pn.string(),updatedAt:Pn.coerce.date(),updatedBy:Pn.string().nullable(),organizationId:Pn.string()});import{z as L}from"zod";import In from"zod";var gi=In.object({platformSep:In.string(),fullPathSegments:In.string().array(),relativePathSegments:In.string().array(),relativePath:In.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:In.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:In.coerce.date(),createdAt:In.coerce.date()});var BL=L.array(gi.extend({id:L.string(),name:L.string(),description:L.string().optional(),labels:L.string().array().optional()})),zL=gi.extend({id:L.string(),name:L.string(),description:L.string().optional(),content:qd}),HL=L.array(zL),R6=L.object({tests:BL,modules:HL,labels:L.string().array()}),x6=Il.merge(di),M6=L.object({schemaVersion:L.string(),stepLists:ro}),_6=di.partial().merge(Tr.pick({id:!0})),GL={name:L.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:L.string().optional(),baseUrl:L.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:L.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:L.nativeEnum(kr).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:hl.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:L.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},P6=L.object(GL),I6=Il.merge(L.object({relativeFilePath:L.string().describe("relative to project root")})),O6=L.object({name:L.string()}),L6=L.object({relativeFilePath:L.string()}),N6=L.object({name:L.string()}),D6=L.object({relativeFilePath:L.string()}),k6=L.object({name:L.string(),description:L.string(),enabled:L.boolean(),steps:L.lazy(()=>ut.array()),testFilePath:L.string().describe("relative to the project root"),folderPath:L.string().optional().describe("user selected folder path")}),U6=L.object({name:L.string(),description:L.string(),enabled:L.boolean()}).partial();var F6=L.array(oy),B6=L.object({defaultEnv:L.string().optional().describe("name of the default env, or undefined to unset")}),z6=L.object({configFilePath:L.string().describe("full path on disk")}),H6=L.string().array(),G6=L.object({message:L.string(),newRelativeTestPath:L.string().optional()}),Lm=L.object({name:L.string(),absolutePath:L.string(),relativePath:L.string(),pathSegments:L.array(L.string()),isDirectory:L.boolean(),size:L.number(),createdAt:L.coerce.date(),modifiedAt:L.coerce.date(),accessedAt:L.coerce.date()}),wb=L.object({pathSegments:L.array(L.string())}),V6=L.object({absolutePath:L.string(),pathSegments:L.array(L.string()),contents:L.array(Lm)}),Cb=L.object({pathSegments:L.array(L.string())}),Rb=L.object({pathSegments:L.array(L.string()),newPathSegments:L.array(L.string())}),xb=L.object({pathSegments:L.array(L.string()),recursive:L.boolean().optional()}),W6=L.object({success:L.boolean(),message:L.string(),pathSegments:L.array(L.string()).optional()}),j6=L.object({gitBranch:L.string(),fileMtime:L.coerce.date(),gitCommitSha:L.string()});var Gl=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],Vl=Gl.map(r=>`**/${r}/**`),Mb=!0,wr=!1;import Br from"chalk";import VL from"safe-stable-stringify";import WL from"truncate-json";import jL from"zod";var go=VL.configure({deterministic:!1});function _b(r){let e=go(r),{jsonString:t}=WL(e,5e4);return t}var $L=["app","version","env","namespace","host"];function be(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!$L.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var jl=jL.enum(["debug","info","warn","error"]);var Ha={debug:20,info:30,warn:40,error:50},Pb={20:"debug",30:"info",40:"warn",50:"error"},Nm=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=Ha[e]:this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){try{this.logWithLevelHelper(e,t,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,t=" "){return e.split(`
|
|
19
|
+
`),Ap=pe.discriminatedUnion("type",[bO,EO,TO,vO,AO,wO]),Uy=r=>{switch(r.type){case"SCREEN":return{type:"SCREEN"};case"OPEN_APP":return{type:"OPEN_APP"};case"OPEN_WEBVIEW":return{type:"OPEN_WEBVIEW"};case"CUSTOM":if(!r.description)throw new dl("Description is required when container type is CUSTOM.");return{type:"CUSTOM",target:{type:"description",description:r.description}};default:{let e=r;throw new Error("Unreachable")}}},By=r=>{let e=Ap.parse(r);switch(e.type){case"TAP":return{id:di(),type:"TAP",target:{type:"description",description:e.description},longPress:e.longPress??void 0,doubleTap:e.doubleTap??void 0,relativePosition:e.relativePosition??void 0};case"PRESS":return{id:di(),...e};case"AI_CHECK":return{id:di(),...e};case"TYPE":return{id:di(),type:"TYPE",text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0};case"SWIPE":return{id:di(),type:"SWIPE",direction:e.direction,scrollableElement:Uy(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case"SCROLL_TO":return{id:di(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:Uy(e.container),scrollStepPercent:e.scrollStepPercent??void 0};default:{let t=e;throw new Error("Unreachable")}}},P3={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true."};var I3=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","AI_CHECK"];import CO from"zod";var fo={type:!0,cache:!0},On=CO.discriminatedUnion("type",[fp.pick(fo),Tp.pick(fo),Sp.pick(fo),yp.pick(fo),bp.pick(fo),Ep.pick(fo),vp.pick(fo)]),RO=Object.values(cn).filter(r=>On.options.some(e=>e.shape.type.safeParse(r).success));function Ol(r){return RO.includes(r.type)}var zy=fa(On),Hy=Sa(On),U3=il(On);import Gy from"zod";var Ll=(t=>(t.US_WEST_1="us-west1",t.EU_NORTH_1="eu-north1",t))(Ll||{}),Nl=(e=>(e.LOCAL="local",e))(Nl||{}),Vy=Gy.nativeEnum(Ll).or(Gy.nativeEnum(Nl)),Na=(t=>(t.ANDROID_14="14",t.ANDROID_15="15",t))(Na||{});var Wy="14";import{cloneDeep as Da}from"lodash-es";import jy from"truncate-json";var xO="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",MO=[po,ii],$y=[po,ii],pi=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,n={}){return new r({testName:e,envName:t,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[po],o=e.env[ii],i={};for(let[s,c]of Object.entries(e.env))$y.includes(s)||(t??{})[s]===void 0&&(i[s]=c);return new r({dynamicVariables:i,envName:n,testName:o,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Da(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){MO.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[po]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Da(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>$y.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,xO]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=jy(JSON.stringify(o),1e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=jy(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=Da(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(po,e.envName),e.testName&&this.setMomenticSystemVariable(ii,e.testName)}getDynamicVariablesCopy(){return Da(this.env)}getVariablesFromEnvironmentCopy(){return Da(this.varsFromMomenticEnvironment)}};import Ze from"zod";import{z as wr}from"zod";import{z as He}from"zod";var Ar=He.object({id:He.string(),name:_n,baseUrl:yl,description:He.string().optional().nullish(),schemaVersion:He.string(),advanced:_a,retries:He.number(),envs:He.array(Cl).nullish(),parameters:wl.nullish(),disabled:He.boolean().optional(),labels:He.array(He.string()).optional().catch([])}),Y3=He.enum(["INHERIT","ENABLED","DISABLED"]);var _O=_a.extend({failureRecovery:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var X3=Ar.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:_O}),J3=Ar.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),PO=He.object({labels:He.array(He.string()).optional(),outputs:ly.nullish()}),mi=Ar.merge(PO),IO=He.object({createdAt:He.coerce.date(),updatedAt:He.coerce.date(),updatedBy:He.string().nullable(),schedule:si,notification:li,createdBy:He.string(),organizationId:He.string(),folderId:He.string().nullable().optional()}),OO=Ar.merge(IO),Q3=OO.merge(ao),Dl=Ar.merge(ao),Z3=Ar.merge(so);var LO="test",NO="module",DO="mobile-test",kO="mobile-module";var Ne=(o=>(o.TEST=`momentic/${LO}`,o.MODULE=`momentic/${NO}`,o.MOBILE_TEST=`momentic/${DO}`,o.MOBILE_MODULE=`momentic/${kO}`,o))(Ne||{}),a4=Ar.merge(so),qy=or.extend({steps:wr.array(wr.record(wr.string(),wr.unknown())),schemaVersion:wr.string()}),s4=qy.extend({fileType:wr.literal(Ne.MODULE)}),l4=wr.object({test:wr.string().describe("YAML for the test, including metadata and steps"),modules:wr.record(wr.string(),wr.string()).describe("Map of module name to YAML for the module")});function gi(r){if(r===void 0)return"__undefined__";if(r===null)return null;if(typeof r!="object")return r;if(Array.isArray(r))return r.map(gi);let e={};for(let[t,n]of Object.entries(r))e[t]=gi(n);return e}import yt from"zod";var Bt=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(Bt||{}),ka=yt.object({id:yt.string().uuid(),envKey:yt.string().optional(),skipped:yt.boolean().optional(),retries:yt.number().optional()}),Ua=ka.extend({type:yt.literal("MOBILE_PRESET_STEP"),command:ky,keyPressDelayMs:yt.number().optional()}),kl=yt.object({moduleId:yt.string(),inputs:yt.record(yt.string(),yt.string()).optional()}),Fa=ka.merge(kl.extend({type:yt.literal("MOBILE_MODULE_STEP")})),p4=kl.extend({steps:yt.lazy(()=>Vt.array())}),Ba=ka.extend({type:yt.literal("MOBILE_AI_ACTION_STEP"),text:yt.string()}),Vt=yt.discriminatedUnion("type",[Ua,Fa,Ba]);var wp=Ze.object({parameterNames:Ze.string().array(),defaultParameters:Ze.record(Ze.string(),Ze.string()).optional(),parameterEnums:Ze.record(Ze.string(),Ze.string().array()).optional()}),Ky=Ze.object({moduleId:Ze.string().uuid(),name:Ze.string(),description:Ze.string().nullish(),parameters:wp.optional(),enabled:Ze.boolean().nullish(),schemaVersion:Ze.string()}),za=Ky.omit({name:!0}),Ul=za.extend({steps:Ze.array(Ze.record(Ze.string(),Ze.unknown()))}),Yy=Ze.object({fileType:Ze.literal(Ne.MOBILE_MODULE)}).merge(Ul),Xy=Ky.omit({schemaVersion:!0}).extend({steps:Ze.array(Vt)});import Pe from"zod";import Ha from"zod";var un=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(un||{}),Cp=kl.extend({steps:Ha.lazy(()=>hi.array()),description:Ha.string().optional(),name:Ha.string().describe("name of the module"),parameters:wp.optional()}),UO=ka.merge(Cp).extend({type:Ha.literal("RESOLVED_MOBILE_MODULE")}),hi=Ha.discriminatedUnion("type",[UO,Ua,Ba]);function Jy(r){return Object.values(un).includes(r)||Object.values(Bt).includes(r)}var FO=Pe.object({disableMomenticAccessibilityTree:Pe.boolean().optional(),autoGrantPermissions:Pe.boolean().optional()}),Rp=FO.extend({region:Vy.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Pe.object({androidVersion:Pe.nativeEnum(Na).optional()}).optional(),localEmulatorSettings:Pe.object({avdId:Pe.string()}).optional(),geolocation:Pe.object({latitude:Pe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Pe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional()}),fi=Pe.object({retries:Pe.number().optional().describe("number of retries to run"),defaultChannel:Pe.string().optional().describe("default channel to use"),defaultTag:Pe.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Pe.string().optional(),defaultApkFilePath:Pe.string().trim().min(1,"APK file path must not be empty.").optional().describe("APK to install when using the emulator in the local region."),emulator:Rp.optional(),ai:Ma.optional()}),Cr=Pe.object({id:Pe.string().uuid(),description:Pe.string(),schemaVersion:Pe.string(),settings:fi.optional(),disabled:Pe.boolean().optional()}),Fl=Pe.object({fileType:Pe.literal(Ne.MOBILE_TEST)}).merge(Cr),BO=Cr.merge(Pe.object({steps:Pe.array(Vt)})),D4=Fl.merge(BO),k4=Pe.object({name:Pe.string(),steps:Pe.array(Vt).optional(),settings:fi.optional()}),Qy=Cr.extend({steps:hi.array()});import me from"zod";var zr=me.object({startTime:me.number(),endTime:me.number().optional(),durationMs:me.number().optional(),error:me.string().optional(),result:me.unknown().optional(),attributes:me.record(me.string(),me.unknown())});var zO=zr.extend({type:me.literal("SECTION"),name:me.string(),subSpans:me.lazy(()=>xp.array())}),HO=zr.extend({type:me.literal("AI_LOCATOR_CALL"),result:me.object({id:me.number(),thoughts:me.string()}).optional()}),GO=zr.extend({type:me.literal("AI_ASSERTION_CALL"),result:me.object({thoughts:me.string(),result:me.boolean()}).optional()}),VO=zr.extend({type:me.literal("TARGET_RESOLUTION"),result:me.object({serializedElement:me.string()}).optional()}),WO=zr.extend({type:me.literal("EMULATOR_INTERACTION"),name:me.string(),withinWebview:me.boolean().optional()}),jO=zr.extend({type:me.literal("EMULATOR_READ_STATE"),name:me.string()}),$O=zr.extend({type:me.literal("ELEMENT_ASSERTION"),name:me.string(),result:me.object({success:me.boolean(),message:me.string().optional()}).optional()}),qO=zr.extend({type:me.literal("CACHE_RESOLUTION")}),KO=zr.extend({type:me.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),YO=zr.extend({type:me.literal("GENERIC"),name:me.string()}),xp=me.discriminatedUnion("type",[zO,HO,GO,VO,WO,jO,$O,qO,KO,YO]);import xt from"zod";var Ga=xt.object({message:xt.string().optional(),startTime:xt.number(),endTime:xt.number(),status:xt.nativeEnum(Ke),trace:xt.unknown(),beforeSnapshot:xt.string().optional(),afterSnapshot:xt.string().optional(),data:xt.unknown().optional().describe("output data from the step")}),XO=Ga.merge(Ua).extend({previousAttempts:xt.lazy(()=>zt.array()).optional()}),JO=Ga.merge(Fa).extend({steps:xt.lazy(()=>zt.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>zt.array()).optional()}),QO=Ga.merge(Ba).extend({steps:xt.lazy(()=>zt.array()),previousAttempts:xt.lazy(()=>zt.array()).optional()}),zt=xt.discriminatedUnion("type",[XO,JO,QO]);import{parse as K4}from"date-fns";import Va from"zod";var ZO=Ga.extend({index:Va.number().optional(),userFacingStepReference:Va.string().optional(),description:Va.string()}),Zy=ZO.extend({beforeScreenshot:Va.string().optional(),afterScreenshot:Va.string().optional()});var eb=ee.object({attributesRequired:ee.array(ee.string()).optional(),textRequired:ee.boolean().optional(),boundsRequired:ee.boolean().optional(),positionSpecificity:ee.nativeEnum(It).optional(),shapeSpecificity:ee.nativeEnum(It).optional()}),tb=ee.object({id:ee.number(),thoughts:ee.string(),updatedMemory:aa.optional(),inWebview:ee.boolean().optional(),requirements:eb.optional(),additionalElements:ee.object({id:ee.number(),requirements:eb}).array().optional()}),rb=ee.object({description:ee.string(),screenXml:ee.string(),screenshot:ee.string(),memory:ee.discriminatedUnion("type",[on,ee.object({type:ee.literal("RESOLVED_TRACES"),traces:ee.unknown().array()})]).optional()}),nb=ee.object({assertion:ee.string(),screenXml:ee.string(),screenshot:ee.string(),memory:ee.discriminatedUnion("type",[ua,ee.object({type:ee.literal("RESOLVED_TRACES"),traces:ee.unknown().array()})]).optional()}),ob=ee.object({thoughts:ee.string(),result:ee.boolean(),relevantElements:ee.array(ee.number()).optional(),updatedMemory:ca.optional()}),ib=ee.object({failedResults:Zy.array(),nextStepsSerialized:ee.string().array(),currentScreenXml:ee.string(),currentScreenshot:ee.string(),customInstructions:ee.string().optional(),testDescription:ee.string()}),ab=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(ab||{}),sb=ee.object({thoughts:ee.string(),scenario:ee.nativeEnum(ab),instructions:ee.string().nullish()});import{z as So}from"zod";var lb=So.object({id:So.string().uuid(),skipped:So.boolean().optional(),envKey:So.string().optional().describe("key in the environment to save the result of this step to")}),Mp=lb.merge(ro).extend({type:So.literal("REQUEST")}),_p=lb.merge(el).extend({type:So.literal("JAVASCRIPT")}),Pp=So.discriminatedUnion("type",[_p,Mp]);import{z as cr}from"zod";var cb=cr.object({id:cr.string(),name:_n,description:cr.string().optional().nullish(),baseUrl:yl.nullish(),schemaVersion:cr.string(),advanced:cr.unknown().optional(),retries:cr.number(),envs:cr.array(Cl).nullish(),parameters:wl.nullish()}),eL=cr.object({createdAt:cr.coerce.date(),updatedAt:cr.coerce.date(),schedule:si.nullish(),notification:li.nullish(),createdBy:cr.string(),organizationId:cr.string()}),tL=cb.merge(eL),BJ=tL.extend({steps:Pp.array()}),zJ=cb.extend({steps:Pp.array()});import{z as Wt}from"zod";var ub=Wt.object({startedAt:Wt.coerce.date(),finishedAt:Wt.coerce.date(),status:Wt.nativeEnum(Ke),message:Wt.string().optional(),data:Wt.unknown().optional()}),rL=ub.merge(_p).extend({type:Wt.literal("JAVASCRIPT")}),nL=ub.merge(Mp).extend({type:Wt.literal("REQUEST")}),oL=Wt.discriminatedUnion("type",[rL,nL]),db=Wt.object({startedAt:Wt.coerce.date(),finishedAt:Wt.coerce.date().nullish(),status:Wt.nativeEnum(xe),results:oL.array(),failureReason:Wt.string().nullish(),failureDetails:ul.nullish()});import{z as jt}from"zod";var iL=jt.object({id:jt.string(),organizationId:jt.string(),createdAt:jt.coerce.date(),updatedAt:jt.coerce.date(),createdBy:jt.string(),scheduledAt:jt.coerce.date().nullish(),startedAt:jt.coerce.date().nullish(),finishedAt:jt.coerce.date().nullish(),status:jt.nativeEnum(xe),trigger:jt.nativeEnum(sr),results:db.array().nullish(),apiTestName:jt.string().nullish(),apiTestPath:jt.string().nullish(),apiTestId:jt.string().nullish()}),XJ=iL.pick({status:!0,startedAt:!0,finishedAt:!0});var Wa=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(Wa||{}),pb=3;function aL(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function Ip(r){if(!aL(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function Op(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return pb;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Bl=class{trackStepExecution(){}async flush(){}};import{parseString as sL,splitCookiesString as lL}from"set-cookie-parser";import{z as we}from"zod";var Lp=we.object({name:we.string(),value:we.string(),url:we.string().optional(),domain:we.string().optional(),path:we.string().optional(),expires:we.number().default(Date.now()/1e3+60*60*24*365),httpOnly:we.boolean().optional(),secure:we.boolean().default(!0),sameSite:we.union([we.literal("Strict"),we.literal("Lax"),we.literal("None")]).default("None")});function zl(r,e){let t=[],n=lL(r);for(let o of n){let i=sL(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=Lp.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,p]=u.split("=");if(!d||!p)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...s,name:d,value:p})}}return t}var cL=we.object({origin:we.string(),localStorage:we.array(we.object({name:we.string(),value:we.string()}))}),uL=we.object({entries:we.record(we.string(),we.array(we.tuple([we.unknown(),we.unknown()]))),version:we.number().optional()}),mb=we.object({cookies:Lp.array().optional(),origins:cL.array().optional(),idb:we.record(we.string(),uL).optional().describe("key is db name")});function Hl(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=Lp.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var T8=new Set(Object.values(nt));var dL={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},v8={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},A8={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",CONDITIONAL:"Execute steps based on the outcome of an AI Check",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},w8={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ADB:"ADB command",STATE:"Debug state"},C8={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen."};import pL from"semver";import{z as mL}from"zod";var _8=mL.string().refine(r=>pL.valid(r),{message:"must be a valid semver string"});import{Faker as O8,en as L8}from"@faker-js/faker";import{z as D}from"zod";var D8=D.object({body:D.string(),to:D.string(),from:D.string()}),k8=D.object({from:D.string().optional(),to:D.string(),timeout:D.number().optional(),beforeDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional()}),U8=D.object({to:D.string().email(),from:D.string(),subject:D.string(),body:D.string(),html:D.string().optional()}),F8=D.object({inbox:D.string().transform(r=>r.toLowerCase()),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),timeout:D.number().optional(),trimWhitespace:D.boolean().optional()}),B8=D.object({inbox:D.string(),limit:D.number().optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),trimWhitespace:D.boolean().optional()});var Gl=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(Gl||{}),gb=D.object({body:D.string().nullish(),status:D.number().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}),gL=D.object({url:D.string(),options:D.object({method:D.string(),body:D.string().nullish(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),hL=D.object({body:D.string().nullish(),options:D.object({status:D.number(),statusText:D.string().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),hb=D.object({result:D.unknown(),variableUpdates:D.record(D.string(),D.unknown()).optional(),persistentVariableUpdates:D.record(D.string(),D.unknown()).optional(),error:D.string().optional(),success:D.boolean()}),z8=D.object({id:D.string().optional(),orgId:D.string(),momenticLambdaAuthHash:D.string(),code:D.string(),fragment:D.boolean(),state:D.object({env:D.record(D.string(),D.unknown()),request:gL,response:hL,additionalBindings:D.record(D.string(),D.unknown()).optional()}),timeoutMs:D.number().optional(),disallowVariableUpdates:D.boolean().optional(),responseSerialization:D.nativeEnum(Gl).optional()}),Ln=15e3;import*as Mt from"zod";import{extendZodWithOpenApi as fL}from"zod-openapi";fL(Mt);var SL=Mt.object({url:Mt.string(),lineNumber:Mt.number(),columnNumber:Mt.number()}).openapi({ref:"CodeLocation"}),Vl=Mt.object({timestamp:Mt.number(),text:Mt.string(),type:Mt.string(),tabIndex:Mt.number(),args:Mt.unknown().array().optional(),url:Mt.string().optional(),location:SL.optional()}).openapi({ref:"ConsoleLog"}),fb=Vl.array(),Sb=fb.array();import*as Np from"zod";import{extendZodWithOpenApi as yL}from"zod-openapi";yL(Np);var bL=Np.object({logsPerPage:Vl.array().array()}).openapi({ref:"DebugData"});import{z as P}from"zod";var EL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),TL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),vL=P.object({onContentLoad:P.number().optional(),onLoad:P.number().optional(),comment:P.string().optional()}),Wl=P.object({startedDateTime:P.string(),id:P.string(),title:P.string().optional(),pageTimings:vL,comment:P.string().optional()}),AL=P.array(Wl),wL=P.object({name:P.string(),value:P.string(),path:P.string().optional(),domain:P.string().optional(),expires:P.string().optional(),httpOnly:P.boolean().optional(),secure:P.boolean().optional(),comment:P.string().optional()}),bb=P.array(wL),CL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),Eb=P.array(CL),RL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),xL=P.array(RL),ML=P.object({name:P.string(),value:P.string().optional(),fileName:P.string().optional(),contentType:P.string().optional(),comment:P.string().optional()}),_L=P.array(ML),PL=P.object({mimeType:P.string(),params:_L,text:P.string(),comment:P.string().optional(),_redactedReason:P.string().optional()}),IL=P.object({method:P.string(),url:P.string(),httpVersion:P.string().optional(),cookies:bb,headers:Eb,queryString:xL,postData:PL.optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional()}),OL=P.object({size:P.number().optional(),compression:P.number().optional(),mimeType:P.string().optional(),text:P.string().optional(),encoding:P.string().optional(),comment:P.string().optional(),_redactedReason:P.string().optional()}),LL=P.object({status:P.number(),statusText:P.string(),httpVersion:P.string().optional(),cookies:bb,headers:Eb,content:OL,redirectURL:P.string().optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional(),_mocked:P.boolean().optional()}),yb=P.object({expires:P.string().optional(),lastAccess:P.string(),eTag:P.string(),hitCount:P.number(),comment:P.string().optional()}),NL=P.object({beforeRequest:yb.optional(),afterRequest:yb.optional(),comment:P.string().optional()}),DL=P.object({blocked:P.number().optional(),dns:P.number().optional(),connect:P.number().optional(),send:P.number(),wait:P.number(),receive:P.number(),ssl:P.number().optional(),comment:P.string().optional()}),jl=P.object({pageref:P.string().optional(),startedDateTime:P.string(),time:P.number().optional(),request:IL,response:LL.optional(),cache:NL.optional(),timings:DL,serverIPAddress:P.string().optional(),connection:P.string().optional(),comment:P.string().optional(),_resourceType:P.string().optional()}),kL=P.array(jl),UL=P.object({version:P.string().default("1.1"),creator:EL.optional(),browser:TL.optional(),pages:AL.optional(),entries:kL,comment:P.string().optional()}),FL=P.object({log:UL}),Z8=P.record(P.string(),Wl),e6=P.record(P.string(),jl);import{cloneDeep as zL}from"lodash-es";import{z as Hr}from"zod";var vb=(c=>(c.DisableClickhouseCaches="disable_clickhouse_caches",c.ShowZeroOpacityElements="show_zero_opacity_elements",c.VisualActions="visual_actions",c.RagV2="rag_v2",c.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",c.GlobalLocatorRedirect="global_locator_redirect",c.FakerConstantSeed="faker_constant_seed",c.AutoExpandIframes="auto_expand_iframes",c))(vb||{});var Tb=Hr.union([Hr.string(),Hr.number(),Hr.boolean(),Hr.null(),Hr.record(Hr.string(),Hr.lazy(()=>Tb)),Hr.array(Hr.lazy(()=>Tb))]),$l=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=zL(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(vb).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},d6=new $l({},{});var Dp={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},Ab=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],m6=Object.keys(Dp);import*as wb from"zod";var h6=wb.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as Nn}from"zod";var y6=Nn.object({id:Nn.string(),name:Nn.string(),createdAt:Nn.coerce.date(),createdBy:Nn.string(),updatedAt:Nn.coerce.date(),updatedBy:Nn.string().nullable(),organizationId:Nn.string()});import{z as L}from"zod";import Dn from"zod";var Si=Dn.object({platformSep:Dn.string(),fullPathSegments:Dn.string().array(),relativePathSegments:Dn.string().array(),relativePath:Dn.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:Dn.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:Dn.coerce.date(),createdAt:Dn.coerce.date()});var HL=L.array(Si.extend({id:L.string(),name:L.string(),description:L.string().optional(),labels:L.string().array().optional()})),GL=Si.extend({id:L.string(),name:L.string(),description:L.string().optional(),content:Jd}),VL=L.array(GL),I6=L.object({tests:HL,modules:VL,labels:L.string().array()}),O6=Dl.merge(mi),L6=L.object({schemaVersion:L.string(),stepLists:ao}),N6=mi.partial().merge(Ar.pick({id:!0})),WL={name:L.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:L.string().optional(),baseUrl:L.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:L.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:L.nativeEnum(Br).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:bl.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:L.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},D6=L.object(WL),k6=Dl.merge(L.object({relativeFilePath:L.string().describe("relative to project root")})),U6=L.object({name:L.string()}),F6=L.object({relativeFilePath:L.string()}),B6=L.object({name:L.string()}),z6=L.object({relativeFilePath:L.string()}),H6=L.object({name:L.string(),description:L.string(),enabled:L.boolean(),steps:L.lazy(()=>ut.array()),testFilePath:L.string().describe("relative to the project root"),folderPath:L.string().optional().describe("user selected folder path")}),G6=L.object({name:L.string(),description:L.string(),enabled:L.boolean()}).partial();var V6=L.array(oy),W6=L.object({defaultEnv:L.string().optional().describe("name of the default env, or undefined to unset")}),j6=L.object({configFilePath:L.string().describe("full path on disk")}),$6=L.string().array(),q6=L.object({message:L.string(),newRelativeTestPath:L.string().optional()}),kp=L.object({name:L.string(),absolutePath:L.string(),relativePath:L.string(),pathSegments:L.array(L.string()),isDirectory:L.boolean(),size:L.number(),createdAt:L.coerce.date(),modifiedAt:L.coerce.date(),accessedAt:L.coerce.date()}),Cb=L.object({pathSegments:L.array(L.string())}),K6=L.object({absolutePath:L.string(),pathSegments:L.array(L.string()),contents:L.array(kp)}),Rb=L.object({pathSegments:L.array(L.string())}),xb=L.object({pathSegments:L.array(L.string()),newPathSegments:L.array(L.string())}),Mb=L.object({pathSegments:L.array(L.string()),recursive:L.boolean().optional()}),Y6=L.object({success:L.boolean(),message:L.string(),pathSegments:L.array(L.string()).optional()}),X6=L.object({gitBranch:L.string(),fileMtime:L.coerce.date(),gitCommitSha:L.string()});var ql=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],Kl=ql.map(r=>`**/${r}/**`),_b=!0,Rr=!1;import Gr from"chalk";import jL from"safe-stable-stringify";import $L from"truncate-json";import qL from"zod";var yo=jL.configure({deterministic:!1});function Pb(r){let e=yo(r),{jsonString:t}=$L(e,5e4);return t}var KL=["app","version","env","namespace","host"];function Ee(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!KL.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var Xl=qL.enum(["debug","info","warn","error"]);var ja={debug:20,info:30,warn:40,error:50},Ib={20:"debug",30:"info",40:"warn",50:"error"},Up=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=ja[e]:this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){try{this.logWithLevelHelper(e,t,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,t=" "){return e.split(`
|
|
20
20
|
`).map((n,o)=>o>0?`${t}${n}`:n).join(`
|
|
21
|
-
`)}logWithLevelHelper(e,t,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(t(` ${s}:`,l)),console.log(t(" stack:",c.stack));let d=Object.entries(c).filter(([
|
|
21
|
+
`)}logWithLevelHelper(e,t,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(t(` ${s}:`,l)),console.log(t(" stack:",c.stack));let d=Object.entries(c).filter(([p])=>p!=="message"&&p!=="stack");for(let[p,m]of d){if(m instanceof Error){console.log(t(` ${s}.${p}:`,m.message)),m.stack&&console.log(t(` ${s}.${p}.stack:`,m.stack));continue}if(typeof m=="object"&&m!==null){let g=this.indentMultiline(yo(m,void 0,2)," ");console.log(t(` ${s}.${p}:`,g));continue}console.log(t(` ${s}.${p}:`,m))}}else typeof c=="object"?(l=yo(c,void 0,2),l=this.indentMultiline(l),console.log(t(` ${s}:`,l))):console.log(t(` ${s}:`,l))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=yo(a,void 0,2),s=s.split(`
|
|
22
22
|
`).map((c,l)=>l>0?` ${c}`:c).join(`
|
|
23
|
-
`)),console.log(" ",t(s))}}setMinLevel(e){typeof e=="string"?this.minLogLevel=Ha[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Br.reset,...e)}info(...e){this.logWithLevel(30,Br.white,...e)}debug(...e){this.logWithLevel(20,Br.dim,...e)}warn(...e){this.logWithLevel(40,Br.yellow,...e)}error(...e){this.logWithLevel(50,Br.red,...e)}success(...e){this.logWithLevel(1/0,Br.green,...e)}dimmed(...e){this.logWithLevel(30,Br.dim,...e)}underline(...e){this.logWithLevel(40,Br.underline,...e)}bold(...e){this.logWithLevel(40,Br.bold,...e)}grey(...e){this.logWithLevel(20,Br.grey,...e)}child(e){return new r(this.minLogLevel,{...this.logBindings,...e})}async flush(){}bindings(){return this.logBindings}},Dm=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}async flush(){}bindings(){return{}}},Z6=new Dm,qL=typeof window>"u"&&typeof process<"u"&&jl.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?jl.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,w=new Nm(qL,{}),On={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>On,flush:async()=>{},bindings:()=>({})},Wl={},$l=({logger:r,logKey:e,maxCount:t,intervalMs:n},o,i,...a)=>{let s=Wl[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},Wl[e]=s),s.totalCount++,s.count<t&&(s.count++,r.debug(o,i,...a)),s.timer=setTimeout(()=>{let c=Wl[e];c?.totalCount!==c?.count&&r.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete Wl[e]},n)};import{z as ae}from"zod";var KL=ae.array(gi.extend({id:ae.string(),name:ae.string(),description:ae.string().optional(),labels:ae.string().array().optional()})),YL=ae.array(gi.extend({id:ae.string(),name:ae.string(),description:ae.string().optional(),content:Tm})),Ib=ae.object({name:ae.string(),description:ae.string().optional(),settings:Ua.optional(),pathSegments:ae.string().array(),defaultEnv:ae.string().optional()}),o9=ae.object({id:ae.string(),fileName:ae.string(),fullPath:ae.string(),relativeFilePath:ae.string().describe("relative to project root")});var Ob=ae.object({steps:pi.array().optional(),settings:Ua.optional()}),i9=ae.object({message:ae.literal("ok")}),Lb=ae.object({tag:ae.string(),channel:ae.string(),filePath:ae.string()}),a9=ae.object({tests:KL,modules:YL,labels:ae.string().array()}),Nb=ae.object({name:ae.string(),description:ae.string(),enabled:ae.boolean()}).partial(),Db=ae.object({name:ae.string(),description:ae.string(),enabled:ae.boolean(),steps:pi.array(),testFilePath:ae.string().describe("relative to the project root"),folderPath:ae.string().optional().describe("user selected folder path")}),s9=ae.object({packages:ae.string().array()});import{z as et}from"zod";var kb=et.object({id:et.string(),createdAt:et.coerce.date(),createdBy:et.string(),organizationId:et.string(),name:et.string(),description:et.string().nullish(),enabled:et.boolean(),schemaVersion:et.string().describe("Schema version for steps"),parameters:et.string().array().nullish().describe("Parameter list"),parameterEnums:et.record(et.string(),et.string().array()).nullish(),defaultParameters:et.record(et.string(),et.string()).nullish(),defaultCacheKey:et.string().nullish(),defaultCacheTtl:et.number().nullish(),defaultCacheAllInvocations:et.boolean().nullish(),autoAuth:et.boolean().nullish(),advanced:$d.nullish()}),f9=kb.extend({steps:et.lazy(()=>Ut.array())}),S9=5*60*1e3,XL=nr.merge(kb.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as E9}from"date-fns-tz";import{z as Pe}from"zod";var km=Aa.extend({aiAction:Pe.boolean().optional(),stepLintSuggestions:Pe.boolean().optional(),agentConfig:Pe.record(Pe.string(),Pe.string()).optional(),aiFailureAnalysis:Pe.boolean().optional(),aiPageFiltering:Pe.boolean().optional().describe("rag v2 feature flag")}),JL=Pe.object({cliOnly:Pe.boolean().optional()}),Um=Pe.object({fakerConstantSeed:Pe.boolean().optional()}),R9=Pe.object({ai:km.optional(),githubAppInstallationId:Pe.number().nullish(),githubAppSummaryMessageEnabled:Pe.boolean().nullish(),githubReleaseAppInstallationId:Pe.number().nullish(),gitlabAppAccessToken:Pe.string().nullish(),gitlabAppBaseUrl:Pe.string().nullish(),qaseAccessToken:Pe.string().nullish(),testSuggestionsEnabled:Pe.boolean().nullish(),browser:Zd.optional(),internal:JL.optional(),advanced:Um.optional()}),x9=Pe.object({globalOverrides:Pe.record(Pe.string()).optional(),agentConfig:Pe.record(Pe.string(),Pe.string()).optional()}),M9=Pe.record(Pe.string(),Pe.string()).nullish();import*as y from"zod";import{z as Xe}from"zod";var Fm=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(Fm||{});var QL=Xe.object({type:Xe.literal("DESCRIPTION_UPDATE"),thoughts:Xe.string()}),ql=Xe.discriminatedUnion("type",[QL]),ZL=Xe.object({testId:Xe.string(),name:Xe.string(),orgId:Xe.string(),runId:Xe.string(),steps:ut.array(),purpose:Xe.nativeEnum(Fm),details:ql.or(ql.array()).optional()});var O9=ZL.pick({name:!0,orgId:!0}),eN=Xe.object({id:Xe.string(),name:Xe.string().nullish(),createdAt:Xe.string().pipe(Xe.coerce.date()).or(Xe.date()),organizationId:Xe.string(),schemaVersion:Xe.string(),runId:Xe.string().nullish(),purpose:Xe.nativeEnum(Fm),details:ql.or(ql.array()).optional(),applied:Xe.boolean().nullish(),appliedAt:Xe.coerce.date().nullish()}),Ub=eN.extend({steps:ut.array()});var Kl="x-momentic-cli-version",Fb="x-momentic-client-mode",Bb="x-momentic-cli-type",zb="x-momentic-logger-tags",tN="x-momentic-main-branch-name",rN="x-momentic-branch-name",nN="x-momentic-commit-timestamp",oN="x-momentic-last-commit-on-main",iN="x-momentic-last-commit-on-main-timestamp",aN="x-momentic-merged-branch-name",Hb="x-momentic-session-id",J9=y.object({error:y.boolean(),reason:y.string(),message:y.string()}),Q9=at.merge(sm),Gb=el,Z9=at.merge(sm);var eQ=at.merge(by).extend({useConsensus:y.boolean().optional(),attemptNumber:y.number().optional()}),Bm=sf,tQ=at.merge(Ty),Vb=BS,rQ=at.merge(vy),Wb=zS,nQ=at.merge(Ay),jb=HS,oQ=at.merge(Ey),$b=FS,iQ=at.merge(fy),qb=kS,aQ=at.merge(Sy),Kb=NS,sQ=at.merge(yy);var lQ=at.merge(xy),cQ=at.merge(My),uQ=y.object({testPaths:y.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:y.string().optional(),all:y.boolean().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional(),testInputMatrix:y.record(y.string(),y.string()).array().optional()}),Yb=y.object({queuedTests:y.unknown().array(),runIds:y.string().uuid().array(),runGroupId:y.string().optional()});var dQ=y.string().array(),mQ=y.union([y.object({paths:y.string().array().describe("run specific test paths (e.g. todo-test)"),all:y.boolean().describe("run all tests").optional()}),y.object({path:y.string().describe("deprecated; present for backcompat")})]),Xb=y.object({tests:y.record(y.string().describe("Test name"),y.string().describe("Test YAML")),modules:y.record(y.string().describe("Module name"),y.string().describe("Module YAML"))}),sN=y.object({test:y.string().describe("test YAML"),modules:y.record(y.string().describe("moduleId"),y.string().describe("module YAML"))}),pQ=sN.array(),gQ=y.object({testId:y.string(),schemaVersion:y.string()}).merge(no);function zm(r){let{gitMainBranch:e,gitBranchName:t,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=r,a={};return e&&(a[tN]=encodeURIComponent(e)),t&&(a[rN]=encodeURIComponent(t)),n&&(a[nN]=n.toISOString()),o&&(a[oN]=encodeURIComponent(o)),i&&(a[iN]=i.toISOString()),r.mergedGitBranchName&&(a[aN]=encodeURIComponent(r.mergedGitBranchName)),a}var hQ=y.object({entries:y.array(kf),testId:y.string()}),fQ=y.object({entries:y.array(zy),testId:y.string()}),SQ=y.object({testId:y.string()});function Jb(r){return y.record(y.unknown()).transform(e=>{let t={};for(let[n,o]of Object.entries(e)){let i=r.safeParse(o);i.success&&(t[n]=i.data)}return t})}var Qb=Jb(Uf),Zb=Jb(Hy),eE=y.object({trigger:y.nativeEnum(ar),status:y.nativeEnum(xe),startedAt:y.coerce.date().optional(),gitCommitSha:y.string().optional(),gitCommitShaShort:y.string().optional(),gitCommitTimestamp:y.coerce.date().optional(),gitBranchName:y.string().optional(),gitOriginUrl:y.string().optional(),gitCommitMessage:y.string().optional(),gitCommitAuthorName:y.string().optional(),githubRepository:y.string().optional(),gitlabProjectPath:y.string().optional(),pipelineId:y.string().optional(),cliVersion:y.string().optional()}),yQ=y.object({id:y.string()}),tE=y.object({status:y.nativeEnum(xe),updatedAt:y.coerce.date().optional(),finishedAt:y.coerce.date().optional()}),rE=y.object({stepsSnapshot:y.array(y.record(y.unknown())).optional(),runGroupId:y.string().optional(),testId:y.string(),testName:y.string(),resolvedBaseUrl:y.string().optional(),environmentName:y.string().optional(),labels:y.array(y.string()).optional(),cliVersion:y.string().optional(),trigger:y.nativeEnum(ar),schemaVersion:y.string().optional(),section:y.nativeEnum(vl).optional(),resolvedInputs:y.record(y.string(),y.string()).optional(),quarantined:y.boolean().optional().default(!1),quarantinedReason:y.string().optional()}),bQ=y.object({id:y.string()}),lN=im.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),nE=lN.array(),oE=im.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),EQ=y.object({id:y.string()}),iE=y.object({status:y.nativeEnum(xe),finishedAt:y.coerce.date().optional(),schemaVersion:y.string().optional().default("1.0.19"),results:y.record(y.string(),y.unknown()).array().optional(),beforeResults:y.record(y.string(),y.unknown()).array().optional(),afterResults:y.record(y.string(),y.unknown()).array().optional()}),TQ=y.object({screenshot:y.string()}),aE=y.object({key:y.string()}),sE=y.object({orgId:y.string(),userId:y.string()}),lE=y.array(ny),vQ=y.record(y.string(),y.union([y.string(),y.boolean()])),AQ=y.object({paths:y.string().array(),env:y.string().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional()}),cE=y.object({suiteRunIds:y.string().array(),runGroupIds:y.string().array()}),wQ=y.object({suiteRunIds:y.string().array()}),CQ=my.array(),RQ=y.object({runGroupIds:y.string().array()}),cN=y.object({uploadUrl:y.string()}),xQ=at.merge(wy),MQ=at.merge(Ry),_Q=at.merge(Cy),uN=y.object({testId:y.string().optional().default(""),testName:y.string().optional().default(""),suiteId:y.string().optional().default(""),suiteName:y.string().optional().default(""),creditsUsed:y.number().optional()}),dN=y.object({transactionId:y.string(),timestamp:y.string(),event:y.nativeEnum(za),properties:uN}),PQ=dN.array(),uE=Ub.omit({steps:!0}).extend({steps:y.array(y.record(y.string(),y.unknown())).describe("unparsed ResolvedStep[]")}),IQ=y.object({limit:y.number().max(10).optional(),afterTime:y.number().optional()}),dE=cy.array(),OQ=y.object({applied:y.boolean().optional(),appliedAt:y.coerce.date().optional()}),mE=cN.extend({id:y.string()}),LQ=y.object({runGroupId:y.string().uuid().optional()}),pE=y.object({runGroupId:y.string().uuid()}),gE=y.object({quarantined:y.object({testId:y.string().uuid(),quarantinedAt:y.coerce.date(),quarantinedBy:y.string().optional(),quarantinedReason:y.string()}).array()}),NQ=y.object({testId:y.string().uuid(),testName:y.string().optional(),reason:y.string(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),DQ=y.object({testName:y.string().optional(),reason:y.string().optional(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),kQ=at.merge(tb),UQ=at.merge(rb),FQ=at.merge(ob),BQ=y.object({apkToInstall:y.object({channel:y.string(),tag:y.string().optional()}).optional(),hostname:y.string().optional(),region:y.nativeEnum(_l).optional(),osVersion:y.nativeEnum(_a).optional(),sessionId:y.string().optional()}),hE=y.object({name:y.string(),webRtcUrl:y.string(),adbUrl:y.string(),token:y.string(),apkDownloadUrl:y.string().optional(),playwrightServerUrl:y.string().optional(),region:y.string().optional()}),zQ=y.object({channel:y.string(),tag:y.string(),md5:y.string()}),fE=y.object({id:y.string(),uploadUrl:y.string().optional(),downloadUrl:y.string(),md5:y.string().optional()}),SE=y.object({assets:y.array(y.object({channel:y.string(),tag:y.string(),md5:y.string(),createdAt:y.number().describe("Unix timestamp in milliseconds")}))});import{z as Q}from"zod";var yE=7,mN=3,VQ=Q.object({localTestId:Q.string(),quarantinedAt:Q.date(),quarantinedBy:Q.string().optional(),quarantinedReason:Q.string(),quarantinedByGitEmail:Q.string().optional(),quarantinedByGitName:Q.string().optional(),quarantinedByGitUsername:Q.string().optional()}).or(Q.object({cloudTestId:Q.string(),quarantinedAt:Q.date(),quarantinedBy:Q.string().optional(),quarantinedReason:Q.string(),quarantinedByGitEmail:Q.string().optional(),quarantinedByGitName:Q.string().optional(),quarantinedByGitUsername:Q.string().optional()})),bE=(t=>(t.QUARANTINE="QUARANTINE",t.UNQUARANTINE="UNQUARANTINE",t))(bE||{});var Hm=Q.object({name:Q.string(),description:Q.string().nullish(),effect:Q.nativeEnum(bE),labels:Q.array(Q.string()).nullish(),githubRepository:Q.string().nullish(),gitlabProjectPath:Q.string().nullish(),gitBranchName:Q.string().nullish(),slackNotificationChannel:Q.string().nullish()}),pN=Q.object({type:Q.literal("LAST_N_RUNS"),lastN:Q.number().min(mN)}),gN=Q.object({type:Q.literal("LAST_N_HOURS"),lastN:Q.number().min(1).max(yE*24)}),hN=Q.object({type:Q.literal("LAST_N_DAYS"),lastN:Q.number().min(1).max(yE)}),Gm=Q.discriminatedUnion("type",[pN,gN,hN]),fN=Q.object({flakeRateThreshold:Q.number().min(1).max(100),evaluationWindow:Gm}),SN=Hm.extend({type:Q.literal("FLAKE_RATE"),config:fN}),yN=Q.object({passRateThreshold:Q.number().min(1).max(100),evaluationWindow:Gm}),bN=Hm.extend({type:Q.literal("PASS_RATE"),config:yN}),EN=Q.object({failureCountThreshold:Q.number().min(0),evaluationWindow:Gm}),TN=Hm.extend({type:Q.literal("FAILURE_COUNT"),config:EN}),WQ=Q.discriminatedUnion("type",[SN,bN,TN]);import{z as tt}from"zod";var qQ=tt.object({repositoriesIndexed:tt.boolean(),indexingInProgress:tt.boolean(),indexesOutdated:tt.boolean()}),EE=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(EE||{}),TE=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(TE||{}),KQ=tt.object({name:tt.string(),status:tt.nativeEnum(EE),conclusion:tt.nativeEnum(TE).nullable()}),Ga=tt.object({sha:tt.string(),message:tt.string(),author:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()}),committer:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()})}),Vm=tt.object({mergedBranch:tt.string().optional()});import{z as Ge}from"zod";var vE=Ge.object({orgId:Ge.string(),cacheKeys:Ge.string().array()}),JQ=Ge.object({keyParams:vE,clientMetadata:Ge.string(),lockAcquisitionTimeoutMs:Ge.number().optional()}),AE=Ge.object({acquired:Ge.boolean(),acquiredByMetadata:Ge.string(),keyPrefix:Ge.string()}),QQ=Ge.object({keyPrefix:Ge.string(),result:Ge.string(),ttlMs:Ge.number()}),ZQ=Ge.union([Ge.object({keyPrefix:Ge.string()}),vE]),vN=Ge.object({remainingTtlMs:Ge.number(),value:Ge.string().nullish()}),eZ=Ge.object({results:Ge.record(Ge.string(),vN),activeLocks:Ge.string().array()});var tZ=5*60*1e3;var iZ=90*24*60*60*1e3,aZ=7*24*60*60*1e3;import{z as wE}from"zod";var cZ=wE.object({quarantineNotifications:wE.string().nullish()});import{z as bt}from"zod";var AN=bt.object({version:bt.string(),json:bt.record(bt.unknown()),hash:bt.string()}),CE=bt.record(bt.unknown()),pZ=bt.object({newSvgs:bt.array(AN),metadata:CE.optional()}),wN=bt.object({version:bt.string(),json:bt.record(bt.unknown()).nullish(),hash:bt.string(),description:bt.string().nullish(),metadata:CE.nullish()}),RE=bt.record(bt.string().describe("icon hash"),wN);import{z as je}from"zod";var Wm=je.object({assertion:je.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),CN=je.object({instruction:je.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Wm.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),xE=CN.extend({subSteps:je.lazy(()=>xE.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),ME=je.object({name:je.string().describe("Short name describing the test plan"),description:je.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),_E=ME.extend({id:je.string(),createdAt:je.coerce.date(),updatedAt:je.coerce.date(),updatedBy:je.string(),createdBy:je.string(),test:je.object({id:je.string(),name:je.string()}).nullish().transform(r=>r??void 0)}),SZ=_E.extend({testGenRuns:je.tuple([]).or(je.tuple([je.object({id:je.string(),startedAt:je.coerce.date(),status:je.nativeEnum(xe)})]))}),PE=je.object({preConditions:Wm.array().nullish().transform(r=>r??[]),postConditions:Wm.array().nullish().transform(r=>r??[]),steps:xE.array().nullish().transform(r=>r??[])}),yZ=_E.extend({plan:PE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),RN=ME.extend({plan:PE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),bZ=RN.array().nullish().transform(r=>r??[]);import{validator as xN}from"@exodus/schemasafe";function IE(r){let e;try{e=JSON.parse(r)}catch(t){return`The schema is not valid JSON. ${t}`}try{xN(e)}catch(t){return`The schema is not a valid JSON schema. ${t}`}}var OE=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};var Yl=class{async prepareGoldenScreenshotForComparison(e,t,n){return n}};import{z as kZ}from"zod";var Xl=class{async resolveEntries(){}async saveEntries(){}};import{z as jm}from"zod";var LE=jm.object({parentStepIdChain:jm.array(jm.string()),result:zt});import{z as K}from"zod";var Va="assets",MN=K.object({step:ut,status:K.nativeEnum(Ke),startedAt:K.coerce.date(),finishedAt:K.coerce.date().optional(),healMetadata:K.object({healType:K.nativeEnum(Ta).or(K.literal("AI")),healedAt:K.coerce.date()}).optional(),beforeSnapshotId:K.string().uuid().optional(),afterSnapshotId:K.string().uuid().optional(),message:K.string().optional()}),_N=MN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),e7=_N.extend({step:K.unknown()}),$m=K.object({avdId:K.string().optional(),channel:K.string().optional(),tag:K.string().optional()}),NE="1.0.0",qm=iE.extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),runAttemptSchemaVersion:K.string().optional(),schemaVersion:K.string().optional().default("1.0.19"),results:K.record(K.string(),K.unknown()).array().optional(),beforeResults:K.record(K.string(),K.unknown()).array().optional(),afterResults:K.record(K.string(),K.unknown()).array().optional(),assetDetails:$m.optional(),activeVideos:K.array(K.object({videoName:K.string(),timestamp:K.coerce.date()})).optional()}),DE=qm.extend({assetDetails:$m.optional(),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),t7=qm.merge(va),r7=DE.merge(va),kE=K.object({results:K.array(zt),beforeResults:K.array(zt).optional(),afterResults:K.array(zt).optional()}),n7=qm.merge(kE),o7=DE.merge(kE),UE=oE.merge(rE).extend({executionType:K.nativeEnum(oi).optional().default("WEB"),testId:K.string().uuid(),testDescription:K.string().optional(),runGroupId:K.string().uuid(),status:K.nativeEnum(xe),startedAt:K.coerce.date(),attempts:K.number(),failureRecoveryDetails:K.object({attempts:K.number()}).optional()}),PN=UE.merge($m),i7=UE.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),a7=PN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),IN=eE.merge(tE).extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),cliVersion:K.string(),labels:K.string().array().optional().default([])}),Jl=IN.extend({updatedAt:K.coerce.date().optional().transform(r=>r??new Date),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)});import{confirm as ON,input as LN}from"@inquirer/prompts";import{existsSync as Nee,mkdirSync as Dee,statSync as NN}from"fs";var ho=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;var DN=!1,FE=(()=>{try{return NN("/.dockerenv"),!0}catch{return!1}})();async function Ql(r){return ho||DN||FE?!0:(await w.flush(),await new Promise(t=>setTimeout(t,100)),await ON({message:r}))}async function BE(r,e){return ho||FE?e:(await LN({message:r,default:e})).trim()||e}import Si,{supportsColor as $N}from"chalk";import{Console as zE}from"console";import{format as Wa}from"util";var Km=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},Zl=class r extends zE{_buffer=[];_groupDepth=0;Console=zE;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new Km(void 0,r.write).stack;if(!i)return e;let a=i.split(`
|
|
23
|
+
`)),console.log(" ",t(s))}}setMinLevel(e){typeof e=="string"?this.minLogLevel=ja[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Gr.reset,...e)}info(...e){this.logWithLevel(30,Gr.white,...e)}debug(...e){this.logWithLevel(20,Gr.dim,...e)}warn(...e){this.logWithLevel(40,Gr.yellow,...e)}error(...e){this.logWithLevel(50,Gr.red,...e)}success(...e){this.logWithLevel(1/0,Gr.green,...e)}dimmed(...e){this.logWithLevel(30,Gr.dim,...e)}underline(...e){this.logWithLevel(40,Gr.underline,...e)}bold(...e){this.logWithLevel(40,Gr.bold,...e)}grey(...e){this.logWithLevel(20,Gr.grey,...e)}child(e){return new r(this.minLogLevel,{...this.logBindings,...e})}async flush(){}bindings(){return this.logBindings}},Fp=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}async flush(){}bindings(){return{}}},o9=new Fp,YL=typeof window>"u"&&typeof process<"u"&&Xl.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?Xl.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,w=new Up(YL,{}),kn={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>kn,flush:async()=>{},bindings:()=>({})},Yl={},Jl=({logger:r,logKey:e,maxCount:t,intervalMs:n},o,i,...a)=>{let s=Yl[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},Yl[e]=s),s.totalCount++,s.count<t&&(s.count++,r.debug(o,i,...a)),s.timer=setTimeout(()=>{let c=Yl[e];c?.totalCount!==c?.count&&r.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete Yl[e]},n)};import{z as Q}from"zod";var XL=Q.array(Si.extend({id:Q.string(),name:Q.string(),description:Q.string().optional(),labels:Q.string().array().optional()})),JL=Q.array(Si.extend({id:Q.string(),name:Q.string(),description:Q.string().optional(),content:Cp})),Ob=Q.object({name:Q.string(),description:Q.string().optional(),settings:fi.optional(),pathSegments:Q.string().array(),defaultEnv:Q.string().optional()}),u9=Q.object({id:Q.string(),fileName:Q.string(),fullPath:Q.string(),relativeFilePath:Q.string().describe("relative to project root")}),d9=Qy.extend({name:Q.string()}),Lb=Q.object({steps:hi.array().optional(),settings:fi.optional()}),p9=Q.object({message:Q.literal("ok")}),Nb=Q.object({name:_n.optional(),description:Q.string().min(1).optional(),settings:fi.optional(),disabled:Q.boolean().optional()}),m9=Q.object({message:Q.string(),newRelativeTestPath:Q.string().optional()}),Db=Q.object({tag:Q.string(),channel:Q.string(),filePath:Q.string()}),g9=Q.object({tests:XL,modules:JL,labels:Q.string().array()}),kb=Q.object({name:Q.string(),description:Q.string(),enabled:Q.boolean()}).partial(),Ub=Q.object({name:Q.string(),description:Q.string(),enabled:Q.boolean(),steps:hi.array(),testFilePath:Q.string().describe("relative to the project root"),folderPath:Q.string().optional().describe("user selected folder path")}),h9=Q.object({packages:Q.string().array()});import{z as et}from"zod";var Fb=et.object({id:et.string(),createdAt:et.coerce.date(),createdBy:et.string(),organizationId:et.string(),name:et.string(),description:et.string().nullish(),enabled:et.boolean(),schemaVersion:et.string().describe("Schema version for steps"),parameters:et.string().array().nullish().describe("Parameter list"),parameterEnums:et.record(et.string(),et.string().array()).nullish(),defaultParameters:et.record(et.string(),et.string()).nullish(),defaultCacheKey:et.string().nullish(),defaultCacheTtl:et.number().nullish(),defaultCacheAllInvocations:et.boolean().nullish(),autoAuth:et.boolean().nullish(),advanced:Xd.nullish()}),w9=Fb.extend({steps:et.lazy(()=>Ut.array())}),C9=5*60*1e3,QL=or.merge(Fb.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as M9}from"date-fns-tz";import{z as Ie}from"zod";var Bp=Ma.extend({aiAction:Ie.boolean().optional(),stepLintSuggestions:Ie.boolean().optional(),agentConfig:Ie.record(Ie.string(),Ie.string()).optional(),aiFailureAnalysis:Ie.boolean().optional(),aiPageFiltering:Ie.boolean().optional().describe("rag v2 feature flag")}),ZL=Ie.object({cliOnly:Ie.boolean().optional()}),zp=Ie.object({fakerConstantSeed:Ie.boolean().optional()}),N9=Ie.object({ai:Bp.optional(),githubAppInstallationId:Ie.number().nullish(),githubAppSummaryMessageEnabled:Ie.boolean().nullish(),githubReleaseAppInstallationId:Ie.number().nullish(),gitlabAppAccessToken:Ie.string().nullish(),gitlabAppBaseUrl:Ie.string().nullish(),qaseAccessToken:Ie.string().nullish(),testSuggestionsEnabled:Ie.boolean().nullish(),browser:np.optional(),internal:ZL.optional(),advanced:zp.optional()}),D9=Ie.object({globalOverrides:Ie.record(Ie.string()).optional(),agentConfig:Ie.record(Ie.string(),Ie.string()).optional()}),k9=Ie.record(Ie.string(),Ie.string()).nullish();import*as y from"zod";import{z as Xe}from"zod";var Hp=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(Hp||{});var eN=Xe.object({type:Xe.literal("DESCRIPTION_UPDATE"),thoughts:Xe.string()}),Ql=Xe.discriminatedUnion("type",[eN]),tN=Xe.object({testId:Xe.string(),name:Xe.string(),orgId:Xe.string(),runId:Xe.string(),steps:ut.array(),purpose:Xe.nativeEnum(Hp),details:Ql.or(Ql.array()).optional()});var z9=tN.pick({name:!0,orgId:!0}),rN=Xe.object({id:Xe.string(),name:Xe.string().nullish(),createdAt:Xe.string().pipe(Xe.coerce.date()).or(Xe.date()),organizationId:Xe.string(),schemaVersion:Xe.string(),runId:Xe.string().nullish(),purpose:Xe.nativeEnum(Hp),details:Ql.or(Ql.array()).optional(),applied:Xe.boolean().nullish(),appliedAt:Xe.coerce.date().nullish()}),Bb=rN.extend({steps:ut.array()});var Zl="x-momentic-cli-version",zb="x-momentic-client-mode",Hb="x-momentic-cli-type",Gb="x-momentic-logger-tags",nN="x-momentic-main-branch-name",oN="x-momentic-branch-name",iN="x-momentic-commit-timestamp",aN="x-momentic-last-commit-on-main",sN="x-momentic-last-commit-on-main-timestamp",lN="x-momentic-merged-branch-name",Vb="x-momentic-session-id",iQ=y.object({error:y.boolean(),reason:y.string(),message:y.string()}),aQ=at.merge(dp),Wb=ol,sQ=at.merge(dp);var lQ=at.merge(by).extend({useConsensus:y.boolean().optional(),attemptNumber:y.number().optional()}),Gp=sf,cQ=at.merge(Ty),jb=BS,uQ=at.merge(vy),$b=zS,dQ=at.merge(Ay),qb=HS,pQ=at.merge(Ey),Kb=FS,mQ=at.merge(fy),Yb=kS,gQ=at.merge(Sy),Xb=NS,hQ=at.merge(yy);var fQ=at.merge(xy),SQ=at.merge(My),yQ=y.object({testPaths:y.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:y.string().optional(),all:y.boolean().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional(),testInputMatrix:y.record(y.string(),y.string()).array().optional()}),Jb=y.object({queuedTests:y.unknown().array(),runIds:y.string().uuid().array(),runGroupId:y.string().optional()});var bQ=y.string().array(),EQ=y.union([y.object({paths:y.string().array().describe("run specific test paths (e.g. todo-test)"),all:y.boolean().describe("run all tests").optional()}),y.object({path:y.string().describe("deprecated; present for backcompat")})]),Qb=y.object({tests:y.record(y.string().describe("Test name"),y.string().describe("Test YAML")),modules:y.record(y.string().describe("Module name"),y.string().describe("Module YAML"))}),cN=y.object({test:y.string().describe("test YAML"),modules:y.record(y.string().describe("moduleId"),y.string().describe("module YAML"))}),TQ=cN.array(),vQ=y.object({testId:y.string(),schemaVersion:y.string()}).merge(so);function Vp(r){let{gitMainBranch:e,gitBranchName:t,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=r,a={};return e&&(a[nN]=encodeURIComponent(e)),t&&(a[oN]=encodeURIComponent(t)),n&&(a[iN]=n.toISOString()),o&&(a[aN]=encodeURIComponent(o)),i&&(a[sN]=i.toISOString()),r.mergedGitBranchName&&(a[lN]=encodeURIComponent(r.mergedGitBranchName)),a}var AQ=y.object({entries:y.array(kf),testId:y.string()}),wQ=y.object({entries:y.array(zy),testId:y.string()}),CQ=y.object({testId:y.string()});function Zb(r){return y.record(y.unknown()).transform(e=>{let t={};for(let[n,o]of Object.entries(e)){let i=r.safeParse(o);i.success&&(t[n]=i.data)}return t})}var eE=Zb(Uf),tE=Zb(Hy),rE=y.object({trigger:y.nativeEnum(sr),status:y.nativeEnum(xe),startedAt:y.coerce.date().optional(),gitCommitSha:y.string().optional(),gitCommitShaShort:y.string().optional(),gitCommitTimestamp:y.coerce.date().optional(),gitBranchName:y.string().optional(),gitOriginUrl:y.string().optional(),gitCommitMessage:y.string().optional(),gitCommitAuthorName:y.string().optional(),githubRepository:y.string().optional(),gitlabProjectPath:y.string().optional(),pipelineId:y.string().optional(),cliVersion:y.string().optional()}),RQ=y.object({id:y.string()}),nE=y.object({status:y.nativeEnum(xe),updatedAt:y.coerce.date().optional(),finishedAt:y.coerce.date().optional()}),oE=y.object({stepsSnapshot:y.array(y.record(y.unknown())).optional(),runGroupId:y.string().optional(),testId:y.string(),testName:y.string(),resolvedBaseUrl:y.string().optional(),environmentName:y.string().optional(),labels:y.array(y.string()).optional(),cliVersion:y.string().optional(),trigger:y.nativeEnum(sr),schemaVersion:y.string().optional(),section:y.nativeEnum(Rl).optional(),resolvedInputs:y.record(y.string(),y.string()).optional(),quarantined:y.boolean().optional().default(!1),quarantinedReason:y.string().optional()}),xQ=y.object({id:y.string()}),uN=cp.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),iE=uN.array(),aE=cp.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),MQ=y.object({id:y.string()}),sE=y.object({status:y.nativeEnum(xe),finishedAt:y.coerce.date().optional(),schemaVersion:y.string().optional().default("1.0.19"),results:y.record(y.string(),y.unknown()).array().optional(),beforeResults:y.record(y.string(),y.unknown()).array().optional(),afterResults:y.record(y.string(),y.unknown()).array().optional()}),_Q=y.object({screenshot:y.string()}),lE=y.object({key:y.string()}),cE=y.object({orgId:y.string(),userId:y.string()}),uE=y.array(ny),PQ=y.record(y.string(),y.union([y.string(),y.boolean()])),IQ=y.object({paths:y.string().array(),env:y.string().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional()}),dE=y.object({suiteRunIds:y.string().array(),runGroupIds:y.string().array()}),OQ=y.object({suiteRunIds:y.string().array()}),LQ=py.array(),NQ=y.object({runGroupIds:y.string().array()}),dN=y.object({uploadUrl:y.string()}),DQ=at.merge(wy),kQ=at.merge(Ry),UQ=at.merge(Cy),pN=y.object({testId:y.string().optional().default(""),testName:y.string().optional().default(""),suiteId:y.string().optional().default(""),suiteName:y.string().optional().default(""),creditsUsed:y.number().optional()}),mN=y.object({transactionId:y.string(),timestamp:y.string(),event:y.nativeEnum(Wa),properties:pN}),FQ=mN.array(),pE=Bb.omit({steps:!0}).extend({steps:y.array(y.record(y.string(),y.unknown())).describe("unparsed ResolvedStep[]")}),BQ=y.object({limit:y.number().max(10).optional(),afterTime:y.number().optional()}),mE=cy.array(),zQ=y.object({applied:y.boolean().optional(),appliedAt:y.coerce.date().optional()}),gE=dN.extend({id:y.string()}),HQ=y.object({runGroupId:y.string().uuid().optional()}),hE=y.object({runGroupId:y.string().uuid()}),fE=y.object({quarantined:y.object({testId:y.string().uuid(),quarantinedAt:y.coerce.date(),quarantinedBy:y.string().optional(),quarantinedReason:y.string()}).array()}),GQ=y.object({testId:y.string().uuid(),testName:y.string().optional(),reason:y.string(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),VQ=y.object({testName:y.string().optional(),reason:y.string().optional(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),WQ=at.merge(rb),jQ=at.merge(nb),$Q=at.merge(ib),qQ=y.object({apkToInstall:y.object({channel:y.string(),tag:y.string().optional()}).optional(),hostname:y.string().optional(),region:y.nativeEnum(Ll).optional(),osVersion:y.nativeEnum(Na).optional(),sessionId:y.string().optional()}),SE=y.object({name:y.string(),webRtcUrl:y.string(),adbUrl:y.string(),token:y.string(),apkDownloadUrl:y.string().optional(),playwrightServerUrl:y.string().optional(),region:y.string().optional()}),KQ=y.object({channel:y.string(),tag:y.string(),md5:y.string()}),yE=y.object({id:y.string(),uploadUrl:y.string().optional(),downloadUrl:y.string(),md5:y.string().optional()}),bE=y.object({assets:y.array(y.object({channel:y.string(),tag:y.string(),md5:y.string(),createdAt:y.number().describe("Unix timestamp in milliseconds")}))});import{z as Z}from"zod";var EE=7,gN=3,JQ=Z.object({localTestId:Z.string(),quarantinedAt:Z.date(),quarantinedBy:Z.string().optional(),quarantinedReason:Z.string(),quarantinedByGitEmail:Z.string().optional(),quarantinedByGitName:Z.string().optional(),quarantinedByGitUsername:Z.string().optional()}).or(Z.object({cloudTestId:Z.string(),quarantinedAt:Z.date(),quarantinedBy:Z.string().optional(),quarantinedReason:Z.string(),quarantinedByGitEmail:Z.string().optional(),quarantinedByGitName:Z.string().optional(),quarantinedByGitUsername:Z.string().optional()})),TE=(t=>(t.QUARANTINE="QUARANTINE",t.UNQUARANTINE="UNQUARANTINE",t))(TE||{});var Wp=Z.object({name:Z.string(),description:Z.string().nullish(),effect:Z.nativeEnum(TE),labels:Z.array(Z.string()).nullish(),githubRepository:Z.string().nullish(),gitlabProjectPath:Z.string().nullish(),gitBranchName:Z.string().nullish(),slackNotificationChannel:Z.string().nullish()}),hN=Z.object({type:Z.literal("LAST_N_RUNS"),lastN:Z.number().min(gN)}),fN=Z.object({type:Z.literal("LAST_N_HOURS"),lastN:Z.number().min(1).max(EE*24)}),SN=Z.object({type:Z.literal("LAST_N_DAYS"),lastN:Z.number().min(1).max(EE)}),jp=Z.discriminatedUnion("type",[hN,fN,SN]),yN=Z.object({flakeRateThreshold:Z.number().min(1).max(100),evaluationWindow:jp}),bN=Wp.extend({type:Z.literal("FLAKE_RATE"),config:yN}),EN=Z.object({passRateThreshold:Z.number().min(1).max(100),evaluationWindow:jp}),TN=Wp.extend({type:Z.literal("PASS_RATE"),config:EN}),vN=Z.object({failureCountThreshold:Z.number().min(0),evaluationWindow:jp}),AN=Wp.extend({type:Z.literal("FAILURE_COUNT"),config:vN}),QQ=Z.discriminatedUnion("type",[bN,TN,AN]);import{z as tt}from"zod";var tZ=tt.object({repositoriesIndexed:tt.boolean(),indexingInProgress:tt.boolean(),indexesOutdated:tt.boolean()}),vE=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(vE||{}),AE=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(AE||{}),rZ=tt.object({name:tt.string(),status:tt.nativeEnum(vE),conclusion:tt.nativeEnum(AE).nullable()}),$a=tt.object({sha:tt.string(),message:tt.string(),author:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()}),committer:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()})}),$p=tt.object({mergedBranch:tt.string().optional()});import{z as Ge}from"zod";var wE=Ge.object({orgId:Ge.string(),cacheKeys:Ge.string().array()}),iZ=Ge.object({keyParams:wE,clientMetadata:Ge.string(),lockAcquisitionTimeoutMs:Ge.number().optional()}),CE=Ge.object({acquired:Ge.boolean(),acquiredByMetadata:Ge.string(),keyPrefix:Ge.string()}),aZ=Ge.object({keyPrefix:Ge.string(),result:Ge.string(),ttlMs:Ge.number()}),sZ=Ge.union([Ge.object({keyPrefix:Ge.string()}),wE]),wN=Ge.object({remainingTtlMs:Ge.number(),value:Ge.string().nullish()}),lZ=Ge.object({results:Ge.record(Ge.string(),wN),activeLocks:Ge.string().array()});var cZ=5*60*1e3;var mZ=90*24*60*60*1e3,gZ=7*24*60*60*1e3;import{z as RE}from"zod";var SZ=RE.object({quarantineNotifications:RE.string().nullish()});import{z as bt}from"zod";var CN=bt.object({version:bt.string(),json:bt.record(bt.unknown()),hash:bt.string()}),xE=bt.record(bt.unknown()),TZ=bt.object({newSvgs:bt.array(CN),metadata:xE.optional()}),RN=bt.object({version:bt.string(),json:bt.record(bt.unknown()).nullish(),hash:bt.string(),description:bt.string().nullish(),metadata:xE.nullish()}),ME=bt.record(bt.string().describe("icon hash"),RN);import{z as je}from"zod";var qp=je.object({assertion:je.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),xN=je.object({instruction:je.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:qp.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),_E=xN.extend({subSteps:je.lazy(()=>_E.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),PE=je.object({name:je.string().describe("Short name describing the test plan"),description:je.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),IE=PE.extend({id:je.string(),createdAt:je.coerce.date(),updatedAt:je.coerce.date(),updatedBy:je.string(),createdBy:je.string(),test:je.object({id:je.string(),name:je.string()}).nullish().transform(r=>r??void 0)}),CZ=IE.extend({testGenRuns:je.tuple([]).or(je.tuple([je.object({id:je.string(),startedAt:je.coerce.date(),status:je.nativeEnum(xe)})]))}),OE=je.object({preConditions:qp.array().nullish().transform(r=>r??[]),postConditions:qp.array().nullish().transform(r=>r??[]),steps:_E.array().nullish().transform(r=>r??[])}),RZ=IE.extend({plan:OE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),MN=PE.extend({plan:OE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),xZ=MN.array().nullish().transform(r=>r??[]);import{validator as _N}from"@exodus/schemasafe";function LE(r){let e;try{e=JSON.parse(r)}catch(t){return`The schema is not valid JSON. ${t}`}try{_N(e)}catch(t){return`The schema is not a valid JSON schema. ${t}`}}var NE=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};var ec=class{async prepareGoldenScreenshotForComparison(e,t,n){return n}};import{z as WZ}from"zod";var tc=class{async resolveEntries(){}async saveEntries(){}};import{z as Kp}from"zod";var DE=Kp.object({parentStepIdChain:Kp.array(Kp.string()),result:zt});import{z as K}from"zod";var qa="assets",PN=K.object({step:ut,status:K.nativeEnum(Ke),startedAt:K.coerce.date(),finishedAt:K.coerce.date().optional(),healMetadata:K.object({healType:K.nativeEnum(Ra).or(K.literal("AI")),healedAt:K.coerce.date()}).optional(),beforeSnapshotId:K.string().uuid().optional(),afterSnapshotId:K.string().uuid().optional(),message:K.string().optional()}),IN=PN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),l7=IN.extend({step:K.unknown()}),Yp=K.object({avdId:K.string().optional(),channel:K.string().optional(),tag:K.string().optional()}),kE="1.0.0",Xp=sE.extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),runAttemptSchemaVersion:K.string().optional(),schemaVersion:K.string().optional().default("1.0.19"),results:K.record(K.string(),K.unknown()).array().optional(),beforeResults:K.record(K.string(),K.unknown()).array().optional(),afterResults:K.record(K.string(),K.unknown()).array().optional(),assetDetails:Yp.optional(),activeVideos:K.array(K.object({videoName:K.string(),timestamp:K.coerce.date()})).optional()}),UE=Xp.extend({assetDetails:Yp.optional(),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),c7=Xp.merge(xa),u7=UE.merge(xa),FE=K.object({results:K.array(zt),beforeResults:K.array(zt).optional(),afterResults:K.array(zt).optional()}),d7=Xp.merge(FE),p7=UE.merge(FE),BE=aE.merge(oE).extend({executionType:K.nativeEnum(ai).optional().default("WEB"),testId:K.string().uuid(),testDescription:K.string().optional(),runGroupId:K.string().uuid(),status:K.nativeEnum(xe),startedAt:K.coerce.date(),attempts:K.number(),failureRecoveryDetails:K.object({attempts:K.number()}).optional()}),ON=BE.merge(Yp),m7=BE.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),g7=ON.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),LN=rE.merge(nE).extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),cliVersion:K.string(),labels:K.string().array().optional().default([])}),rc=LN.extend({updatedAt:K.coerce.date().optional().transform(r=>r??new Date),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)});import{confirm as NN,input as DN}from"@inquirer/prompts";import{existsSync as Gee,mkdirSync as Vee,statSync as kN}from"fs";var bo=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;var UN=!1,zE=(()=>{try{return kN("/.dockerenv"),!0}catch{return!1}})();async function nc(r){return bo||UN||zE?!0:(await w.flush(),await new Promise(t=>setTimeout(t,100)),await NN({message:r}))}async function HE(r,e){return bo||zE?e:(await DN({message:r,default:e})).trim()||e}import Ei,{supportsColor as KN}from"chalk";import{Console as GE}from"console";import{format as Ka}from"util";var Jp=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},oc=class r extends GE{_buffer=[];_groupDepth=0;Console=GE;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new Jp(void 0,r.write).stack;if(!i)return e;let a=i.split(`
|
|
24
24
|
`).slice(o).filter(Boolean).join(`
|
|
25
|
-
`);return e.push({message:n,origin:a,type:t}),e}_log(e,t){r.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",
|
|
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",Ka(e,...t))}error(e,...t){this._log("error",Ka(e,...t))}info(e,...t){this._log("info",Ka(e,...t))}log(e,...t){this._log("log",Ka(e,...t))}warn(e,...t){this._log("warn",Ka(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function VE(r){let e=globalThis.console,t=new oc;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 Ym=" ".repeat(6);import kN from"fetch-retry";import UN from"os";import GE,{multistream as FN}from"pino";import BN from"pino-pretty";import zN from"pino-std-serializers";var hi=new Map,HN=!0,VE="Log throttle exceeded",GN=100,VN=5e3,WN=kN(global.fetch,{retries:2,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),Xm=class r{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=!1;lastWindowStart=Date.now();site="https://ingest.us.signoz.cloud:443/logs/json";flushIntervalMs;maxBatchSize;buffer=[];flushTimer;constructor({bindings:e,hostname:t,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=t??UN.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10;let a={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=HN?GE(a):GE(a,FN([{stream:BN({colorize:!0})}]))}child(e){return new r({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}async flush(){await this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushBuffer()},this.flushIntervalMs))}async flushBuffer(){if(this.buffer.length===0)return;let e=this.buffer;this.buffer=[];try{let t=await WN(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:go(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===VE)return!0;let t=Date.now();return t-this.lastWindowStart>VN&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,VE),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<GN?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,t,n,...o){try{this.logHelper(e,t,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,t,n,...o){if(Ha[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof t=="string"&&!n&&(t={message:t}),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error&&(t.err=zN.err(t.err));let i={...this.bindingAttributes,...t&&typeof t=="object"?t:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env};this.disableConsoleLogs||this.consoleLogger[e](i,n,...o);let s={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:_b({message:n||"",...i})};this.buffer.push(s),this.buffer.length>=this.maxBatchSize?(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flushBuffer()):this.scheduleFlush()}setApp(e){let t=this.bindingAttributes.app;this.bindingAttributes.app=e,hi.set("app",this),hi.delete(t)}debug(e,t,...n){this.log("debug",e,t,...n)}info(e,t,...n){this.log("info",e,t,...n)}warn(e,t,...n){this.log("warn",e,t,...n)}error(e,t,...n){this.log("error",e,t,...n)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=Pb[e]):(this.minLevelValue=Ha[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},fi=({app:r,hostname:e,disableConsoleLogs:t})=>(hi.has(r)||hi.set(r,new Xm({bindings:{app:r},hostname:e,disableConsoleLogs:t})),hi.get(r));async function WE(){await Promise.all([...hi.values()].map(r=>r.flush()))}import{hostname as jN}from"os";var cr=fi({app:"cli",hostname:jN(),disableConsoleLogs:!0}).child({cliVersion:"0.13.2"});function Jm(r){if(!r)return;r=r.toLowerCase();let e=jl.safeParse(r);if(e.success)return w.setMinLevel(e.data),e.data}function jE({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return HE(()=>{if(c.forEach(u=>{w.log(""),o(u)}),c.length){w.log("");let u=c.length===1?"":"s";w.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{w.dimmed(n(d))})}if(l.length){w.log("");let u=l.length===1?"":"s";w.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{w.dimmed(n(d))})}if(a.length){w.log("");let u=a.length===1?"":"s";w.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{w.dimmed(n(d))})}if(s.length){w.log("");let u=s.length===1?"":"s";w.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{w.dimmed(n(d))})}if(i.length){w.log("");let u=i.length===1?"":"s";w.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{w.dimmed(n(d))})}w.log(""),w.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var ja=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Si.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Si.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Si.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Si.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Si.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Si.bgMagenta.white("RUNNING"),a=0):(w.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),$N||(i=`${i}`),w.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import qN from"fs";import{tmpdir as KN}from"os";import YN from"path";import{registry as $a}from"playwright-core/lib/server";import $E from"proper-lockfile";var qE=YN.join(KN(),"momenticBrowserInstallation");var Qm=["chrome","chromium","chrome-for-testing","ffmpeg"],XN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},KE={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function YE(r){if(r==="Org Default")return!1;let e=KE[XN[r]??""]??"",t=$a.findExecutable(e);return!t||t.installType==="none"?!1:Zm(t)}function Zm(r){let e=r.executablePath();return qN.existsSync(e)}function JN(r,e){let t=KE[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=$a.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Zm(n)))return n}async function QN({browser:r,force:e}){let t=JN(r,e);if(!t){w.info(`Browser '${r}' is already installed, skipping...`);return}w.info(`Installing browser '${r}'...`);try{await $a.installDeps([t],!1),await $a.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){w.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=$a.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Zm(o);)w.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function ec({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Qm:Array.from(new Set(r));try{await $E.lock(qE,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){w.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of n)try{await QN({browser:i,force:e})}catch(a){o=a,w.error(`Failed to install the ${i} browser: ${a}`)}}finally{await $E.unlock(qE,{realpath:!1})}if(o)throw o}import{createServer as ZN}from"http";async function tc(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await rc(o))return o}w.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function rc(r){return new Promise((e,t)=>{let n=ZN();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(w.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(r)})}import zte from"blocked-at";import Gte from"why-is-node-running";function XE(r){let e=r?.shardIndex??1,t=r?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(t<1)throw new Error("Shard count must be greater than 0.");if(e>t)throw new Error("Shard index cannot be greater than shard count")}function eD(r,e,t,n){if(t>r.length&&(w.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let o=Math.floor((e-1)*(r.length/t)),i=Math.floor(e*(r.length/t));return(n?[...r].sort((s,c)=>n(s).localeCompare(n(c))):[...r].sort()).filter((s,c)=>c>=o&&c<i)}function JE(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?eD(e,t,n,o):e}import cF from"fs";import{tmpdir as uF,totalmem as dF}from"os";import mF from"path";import{execFile as tD}from"child_process";import rD from"path";function nD(){let r=process.env.ANDROID_HOME;if(!r)return"adb";let e=process.platform==="win32"?"adb.exe":"adb";return rD.join(r,"platform-tools",e)}async function ht(r,{timeoutMs:e=5e3,serial:t,throwOnError:n=!1}){let o=nD(),i=t?["-s",t,...r]:r;return await new Promise((a,s)=>{tD(o,i,{encoding:"utf8",timeout:e},(c,l)=>{if(c){if(n){s(c);return}a(void 0);return}a(l)})})}import{createInstanceClient as xU}from"@limrun/api";import{execSync as MU}from"child_process";import ire,{multistream as sre}from"pino";import cre from"pino-pretty";var mre=5*1024,oD="...[truncated]",pre=Buffer.byteLength(oD,"utf8");import{PostHog as Are}from"posthog-node";var Ln=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var QE=r=>{let e=r.reason===void 0?new DOMException("This operation was aborted.","AbortError"):r.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function z(r,e){let{milliseconds:t,fallback:n,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);return new Promise((s,c)=>{let l;if(e.signal){let{signal:m}=e;if(m.aborted)return c(QE(m));l=()=>c(QE(m)),m.addEventListener("abort",l,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",l),n)try{s(n())}catch(m){c(m)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let m=o instanceof Error?o:new Ln(o??`Promise timed out after ${t}ms`);c(m)}};t<1/0&&(a=i.setTimeout(u,t));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(r).then(m=>{d(),s(m)}).catch(m=>{d(),c(m)})})}import{PostHog as Ore}from"posthog-node";import{execSync as iD}from"child_process";import yi from"os";import aD from"v8";var ZE,zr,tT=yi.platform(),sD=yi.cpus().map(r=>({model:r.model,speed:r.speed})).reduce((r,e)=>(r[e.model]={speed:e.speed},r.totalCores=(r.totalCores??0)+1,r),{}),eT=r=>{try{let e={},t=!1,n=lD(),o=cD(),i=`${Math.round(n.freePercentage*100)}%`;n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),t=!0);let a=`${o?Math.round(o.idle):"unknown"}%`;o&&o?.total>80&&(t=!0);let s=aD.getHeapStatistics(),c=s.used_heap_size,l=s.heap_size_limit;c/l>.9&&(t=!0),t?(r.warn({memory:n,cpu:o,heapStats:s,...e},"Critical resource usage metrics detected"),ho&&w.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};function rT(r){if(!wr)return eT(r),{interval:setInterval(()=>eT(r),2e4),cpuMetadata:sD,platform:tT}}function lD(){let r=yi.totalmem(),e=tT==="darwin"?uD():(()=>{let n=yi.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function cD(){let r=yi.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of r)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!zr)return zr=t,null;let n={user:t.user-zr.user,nice:t.nice-zr.nice,sys:t.sys-zr.sys,idle:t.idle-zr.idle,irq:t.irq-zr.irq,total:t.total-zr.total};return ZE={measurementTime:e,intervalMs:e-zr.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100},zr=t,ZE}function uD(){try{let r=iD("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),t=r.match(/page size of (\d+) bytes/)?.[1],n=t?Number.parseInt(t,10):4096,o=u=>{let m=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?Number.parseInt(m,10):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),c=i*n,l=(a+s)*n;return{availableMemory:c+l,rawFreeMemory:c,cachedMemory:l}}catch{let e=yi.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var nc=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function dD(r){if(!r||r.length===0)return{};let e={};for(let t of r){let n=t.indexOf(":");if(n>-1){let o=t.slice(0,n).trim(),i=t.slice(n+1).trim();o&&(e[o]=i);continue}e[t]=!0}return e}function oc(r,e){let t=dD(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var _T="=",lc=";",dp=",";var PT=8192;var vi={};f_(vi,{getKeyPairs:()=>WD,parseKeyPairsIntoRecord:()=>jD,parsePairKeyValue:()=>IT,serializeKeyPairs:()=>VD});Le();var GD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function VD(r){return r.reduce(function(e,t){var n=""+e+(e!==""?dp:"")+t;return n.length>PT?e:n},"")}function WD(r){return r.getAllEntries().map(function(e){var t=GD(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=lc+o.metadata.toString()),i})}function IT(r){var e=r.split(lc);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(_T);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=tp(e.join(lc))),{key:o,value:i,metadata:a}}}}}function jD(r){return typeof r!="string"||r.length===0?{}:r.split(dp).map(function(e){return IT(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Le();var cc;(function(r){r.AlwaysOff="always_off",r.AlwaysOn="always_on",r.ParentBasedAlwaysOff="parentbased_always_off",r.ParentBasedAlwaysOn="parentbased_always_on",r.ParentBasedTraceIdRatio="parentbased_traceidratio",r.TraceIdRatio="traceidratio"})(cc||(cc={}));var $D=",",qD=["OTEL_SDK_DISABLED"];function KD(r){return qD.indexOf(r)>-1}var YD=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function XD(r){return YD.indexOf(r)>-1}var JD=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function QD(r){return JD.indexOf(r)>-1}var mp=1/0,pp=128,ZD=128,e0=128,gp={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:Be.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:mp,OTEL_ATTRIBUTE_COUNT_LIMIT:pp,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:mp,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:pp,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:mp,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:pp,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:ZD,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:e0,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:cc.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative"};function t0(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function r0(r,e,t,n,o){if(n===void 0&&(n=-1/0),o===void 0&&(o=1/0),typeof t[r]<"u"){var i=Number(t[r]);isNaN(i)||(i<n?e[r]=n:i>o?e[r]=o:e[r]=i)}}function n0(r,e,t,n){n===void 0&&(n=$D);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var o0={ALL:Be.ALL,VERBOSE:Be.VERBOSE,DEBUG:Be.DEBUG,INFO:Be.INFO,WARN:Be.WARN,ERROR:Be.ERROR,NONE:Be.NONE};function i0(r,e,t){var n=t[r];if(typeof n=="string"){var o=o0[n.toUpperCase()];o!=null&&(e[r]=o)}}function OT(r){var e={};for(var t in gp){var n=t;switch(n){case"OTEL_LOG_LEVEL":i0(n,e,r);break;default:if(KD(n))t0(n,e,r);else if(XD(n))r0(n,e,r);else if(QD(n))n0(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Et(){var r=OT(process.env);return Object.assign({},gp,r)}function LT(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function uc(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=LT(r.charCodeAt(n)),i=LT(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var NT="1.25.1";var a0="deployment.environment";var s0="process.runtime.name";var l0="service.name";var c0="service.instance.id";var u0="telemetry.sdk.name",d0="telemetry.sdk.language",m0="telemetry.sdk.version";var DT=a0;var kT=s0;var dc=l0;var UT=c0;var Za=u0,es=d0,ts=m0;var p0="nodejs";var FT=p0;var Ai,mc=(Ai={},Ai[Za]="opentelemetry",Ai[kT]="node",Ai[es]=FT,Ai[ts]=NT,Ai);var g0=9,h0=6,f0=Math.pow(10,h0),S0=Math.pow(10,g0);function BT(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*f0);return[t,n]}function zT(r){return r[0]*S0+r[1]}function rs(r){return r[0]*1e6+r[1]/1e3}var So;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(So||(So={}));var HT=function(){function r(){var e=this;this._promise=new Promise(function(t,n){e._resolve=t,e._reject=n})}return Object.defineProperty(r.prototype,"promise",{get:function(){return this._promise},enumerable:!1,configurable:!0}),r.prototype.resolve=function(e){this._resolve(e)},r.prototype.reject=function(e){this._reject(e)},r}();var y0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},b0=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},GT=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new HT}return Object.defineProperty(r.prototype,"isCalled",{get:function(){return this._isCalled},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"promise",{get:function(){return this._deferred.promise},enumerable:!1,configurable:!0}),r.prototype.call=function(){for(var e,t=this,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];if(!this._isCalled){this._isCalled=!0;try{Promise.resolve((e=this._callback).call.apply(e,b0([this._that],y0(n),!1))).then(function(i){return t._deferred.resolve(i)},function(i){return t._deferred.reject(i)})}catch(i){this._deferred.reject(i)}}return this._deferred.promise},r}();var ur;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(ur||(ur={}));var _t;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(_t||(_t={}));var E0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}();var rie=function(r){E0(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function VT(r,e){for(var t=0,n=r.length-1;n-t>1;){var o=Math.trunc((n+t)/2);r[o]<=e?t=o:n=o-1}return r[n]<=e?n:r[t]<=e?t:-1}Le();var dr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(dr||(dr={}));var WT=function(){function r(){this.kind=dr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var ue;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ue||(ue={}));var T0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function v0(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var hp=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=v0(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=VT(this._boundaries,e);this._current.buckets.counts[t+1]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var fp=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=dr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new hp(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new hp(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new hp(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.HISTOGRAM,dataPoints:n.map(function(i){var a=T0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();Le();var Sp=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},yp=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},bp=function(){function r(e,t,n,o){e===void 0&&(e=new A0),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var A0=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,yp([n,this._counts.length-t],Sp(this._counts.slice(t)),!1)),o.splice.apply(o,yp([0,t],Sp(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(yp([],Sp(this._counts),!1))},r}();var jT=52,w0=2146435072,C0=1048575,Ep=1023,pc=-Ep+1,gc=Ep,ns=Math.pow(2,-1022);function hc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&w0)>>20;return n-Ep}function fc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&C0)*Math.pow(2,32);return o+n}function os(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function qT(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var R0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Nn=function(r){R0(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var YT=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<ns)return this._minNormalLowerBoundaryIndex();var t=hc(e),n=this._rightShift(fc(e)-1,jT);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Nn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Nn("overflow: "+e+" is > maximum lower boundary: "+n);return os(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=pc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return gc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var XT=function(){function r(e){this._scale=e,this._scaleFactor=os(Math.LOG2E,e),this._inverseFactor=os(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=ns)return this._minNormalLowerBoundaryIndex()-1;if(fc(e)===0){var t=hc(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Nn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return ns;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Nn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return pc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(gc+1<<this._scale)-1},r}();var JT=-10,QT=20,x0=Array.from({length:31},function(r,e){return e>10?new XT(e-10):new YT(e-10)});function Tp(r){if(r>QT||r<JT)throw new Nn("expected scale >= "+JT+" && <= "+QT+", got: "+r);return x0[r+10]}var M0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Sc=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),_0=20,P0=160,vp=2,I0=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=P0),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new bp),u===void 0&&(u=new bp),d===void 0&&(d=Tp(_0)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<vp&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+vp),this._maxSize=vp)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=qT(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Tp(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Sc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Sc.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Sc(0,-1);var o=t-n;return new Sc(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var ZT=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=dr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new I0(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=M0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var O0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Ap=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=BT(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var ev=function(){function r(){this.kind=dr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Ap(e)},r.prototype.merge=function(e,t){var n=rs(t.sampleTime)>=rs(e.sampleTime)?t:e;return new Ap(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=rs(t.sampleTime)>=rs(e.sampleTime)?t:e;return new Ap(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.GAUGE,dataPoints:n.map(function(i){var a=O0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var L0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},is=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var wp=function(){function r(e){this.monotonic=e,this.kind=dr.SUM}return r.prototype.createAccumulation=function(e){return new is(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new is(t.startTime,this.monotonic,o,t.reset):new is(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new is(t.startTime,this.monotonic,o,!0):new is(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.SUM,dataPoints:n.map(function(i){var a=L0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var yo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Gr=function(){function r(){}return r.Drop=function(){return lv},r.Sum=function(){return cv},r.LastValue=function(){return uv},r.Histogram=function(){return dv},r.ExponentialHistogram=function(){return N0},r.Default=function(){return D0},r}();var tv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new WT,e}(Gr);var rv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new wp(!0),e.NON_MONOTONIC_INSTANCE=new wp(!1),e}(Gr);var nv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new ev,e}(Gr);var ov=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new fp([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Gr);var iv=function(r){yo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new fp(this._boundaries,this._recordMinMax)},e}(Gr);var av=function(r){yo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new ZT(this._maxSize,this._recordMinMax)},e}(Gr);var sv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ue.COUNTER:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return cv;case ue.GAUGE:case ue.OBSERVABLE_GAUGE:return uv;case ue.HISTOGRAM:return t.advice.explicitBucketBoundaries?new iv(t.advice.explicitBucketBoundaries):dv}return V.warn("Unable to recognize instrument type: "+t.type),lv},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Gr);var lv=new tv,cv=new rv,uv=new nv,dv=new ov,N0=new av,D0=new sv;Le();function yc(){return"unknown_service:"+process.argv0}var Dn=function(){return Dn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Dn.apply(this,arguments)},k0=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},U0=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},F0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Cp=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[dc]=yc(),e[es]=mc[es],e[Za]=mc[Za],e[ts]=mc[ts],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return k0(this,void 0,void 0,function(){return U0(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Dn(Dn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=F0(a,2),l=c[0],u=c[1];return Dn(Dn(Dn(Dn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var bo;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(bo||(bo={}));Le();var B0=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},z0=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Rp=function(){return ur.CUMULATIVE},mv=function(r){switch(r){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.GAUGE:case ue.HISTOGRAM:case ue.OBSERVABLE_GAUGE:return ur.DELTA;case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return ur.CUMULATIVE}},pv=function(r){switch(r){case ue.COUNTER:case ue.HISTOGRAM:return ur.DELTA;case ue.GAUGE:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_GAUGE:return ur.CUMULATIVE}};function H0(){var r=Et(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Rp:e==="delta"?mv:e==="lowmemory"?pv:(V.warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '"+r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE+"', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead."),Rp)}function G0(r){return r!=null?r===bo.DELTA?mv:r===bo.LOWMEMORY?pv:Rp:H0()}function V0(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Gr.Default()}}var gv=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=V0(t),this._aggregationTemporalitySelector=G0(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return B0(this,void 0,void 0,function(){return z0(this,function(e){switch(e.label){case 0:return[4,this._otlpExporter.shutdown()];case 1:return e.sent(),[2]}})})},r.prototype.forceFlush=function(){return Promise.resolve()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r}();Le();Le();var W0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},hv=1e4,fv=5,Sv=1e3,yv=5e3,bv=1.5;function as(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=W0(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):V.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function xp(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function Mp(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return V.warn("Could not parse export URL: '"+r+"'"),r}}function _p(r){return typeof r=="number"?r<=0?Pp(r,hv):r:j0()}function j0(){var r,e=Number((r=Et().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Et().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?Pp(e,hv):e}function Pp(r,e){return V.warn("Timeout must be greater than 0",r),e}function Ev(r){var e=[429,502,503,504];return e.includes(r)}function Tv(r){if(r==null)return-1;var e=Number.parseInt(r,10);if(Number.isInteger(e))return e>0?e*1e3:-1;var t=new Date(r).getTime()-Date.now();return t>=0?t:0}var vv=function(){function r(e){e===void 0&&(e={}),this._sendingPromises=[],this.url=this.getDefaultUrl(e),typeof e.hostname=="string"&&(this.hostname=e.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new GT(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=_p(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:So.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:So.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:So.SUCCESS})}).catch(function(n){t({code:So.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{V.debug("items to be sent",e),t.send(e,n,o)}catch(i){o(i)}})},r.prototype.shutdown=function(){return this._shutdownOnce.call()},r.prototype.forceFlush=function(){return Promise.all(this._sendingPromises).then(function(){})},r.prototype._shutdown=function(){return V.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Le();import*as Ip from"url";import*as Ec from"http";import*as Tc from"https";import*as Av from"zlib";import{Readable as q0}from"stream";var kn;(function(r){r.NONE="none",r.GZIP="gzip"})(kn||(kn={}));var $0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),wi=function(r){$0(e,r);function e(t,n,o){var i=r.call(this,t)||this;return i.name="OTLPExporterError",i.data=o,i.code=n,i}return e}(Error);var bc=function(){return bc=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},bc.apply(this,arguments)};function Op(r,e,t,n,o){var i=r.timeoutMillis,a=new Ip.URL(r.url),s=Number(process.versions.node.split(".")[0]),c,l,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,l.destroyed){var h=new wi("Request Timeout");o(h)}else s>=14?l.destroy():l.abort()},i),m={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:bc({"Content-Type":t},r.headers),agent:r.agent},p=a.protocol==="http:"?Ec.request:Tc.request,g=function(h,f){switch(h===void 0&&(h=fv),f===void 0&&(f=Sv),l=p(m,function(b){var C="";b.on("data",function(R){return C+=R}),b.on("aborted",function(){if(u){var R=new wi("Request Timeout");o(R)}}),b.on("end",function(){if(u===!1)if(b.statusCode&&b.statusCode<299)V.debug("statusCode: "+b.statusCode,C),n(),clearTimeout(d),clearTimeout(c);else if(b.statusCode&&Ev(b.statusCode)&&h>0){var R=void 0;f=bv*f,b.headers["retry-after"]?R=Tv(b.headers["retry-after"]):R=Math.round(Math.random()*(yv-f)+f),c=setTimeout(function(){g(h-1,f)},R)}else{var v=new wi(b.statusMessage,b.statusCode,C);o(v),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(b){if(u){var C=new wi("Request Timeout",b.code);o(C)}else o(b);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var b=new wi("Request Timeout");o(b)}clearTimeout(d),clearTimeout(c)}),r.compression){case kn.GZIP:{l.setHeader("Content-Encoding","gzip");var E=K0(e);E.on("error",o).pipe(Av.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function K0(r){var e=new q0;return e.push(r),e.push(null),e}function Lp(r){if(r.httpAgentOptions&&r.keepAlive===!1){V.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Ip.URL(r.url),t=e.protocol==="http:"?Ec.Agent:Tc.Agent;return new t(bc({keepAlive:!0},r.httpAgentOptions))}catch(n){V.error("collector exporter failed to create http agent. err: "+n.message);return}}function Np(r){if(r)return r;var e=Et().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Et().OTEL_EXPORTER_OTLP_COMPRESSION;return e===kn.GZIP?kn.GZIP:kn.NONE}Le();var Y0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),vc=function(r){Y0(e,r);function e(t,n,o){t===void 0&&(t={});var i=r.call(this,t)||this;return i.DEFAULT_HEADERS={},i._contentType=o,t.metadata&&V.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,as(t.headers),vi.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=Lp(t),i.compression=Np(t.compression),i._serializer=n,i}return e.prototype.onInit=function(t){},e.prototype.send=function(t,n,o){var i=this;if(this._shutdownOnce.isCalled){V.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;Op(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,l)}).then(n,o);this._sendingPromises.push(a);var s=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(s,s)},e.prototype.onShutdown=function(){},e}(vv);function Cv(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function X0(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function Rv(r){var e=Cv(r);return X0(e)}function J0(r){var e=Cv(r);return e.toString()}var Q0=typeof BigInt<"u"?J0:zT;function wv(r){return r}function xv(r){if(r!==void 0)return uc(r)}var Z0={encodeHrTime:Rv,encodeSpanContext:uc,encodeOptionalSpanContext:xv};function Mv(r){var e,t;if(r===void 0)return Z0;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?Rv:Q0,encodeSpanContext:o?wv:uc,encodeOptionalSpanContext:o?wv:xv}}var ek=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function _v(r){return{name:r.name,version:r.version}}function Ci(r){return Object.keys(r).map(function(e){return Pv(e,r[e])})}function Pv(r,e){return{key:r,value:Iv(e)}}function Iv(r){var e=typeof r;return e==="string"?{stringValue:r}:e==="number"?Number.isInteger(r)?{intValue:r}:{doubleValue:r}:e==="boolean"?{boolValue:r}:r instanceof Uint8Array?{bytesValue:r}:Array.isArray(r)?{arrayValue:{values:r.map(Iv)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=ek(t,2),o=n[0],i=n[1];return Pv(o,i)})}}:{}}function Ov(r){return{attributes:Ci(r.attributes),droppedAttributesCount:0}}Le();function Nv(r,e){var t=Mv(e);return{resource:Ov(r.resource),schemaUrl:void 0,scopeMetrics:tk(r.scopeMetrics,t)}}function tk(r,e){return Array.from(r.map(function(t){return{scope:_v(t.scope),metrics:t.metrics.map(function(n){return rk(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function rk(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=ak(r.aggregationTemporality);switch(r.dataPointType){case _t.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:Lv(r,e)};break;case _t.GAUGE:t.gauge={dataPoints:Lv(r,e)};break;case _t.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:ok(r,e)};break;case _t.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:ik(r,e)};break}return t}function nk(r,e,t){var n={attributes:Ci(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Kt.INT:n.asInt=r.value;break;case Kt.DOUBLE:n.asDouble=r.value;break}return n}function Lv(r,e){return r.dataPoints.map(function(t){return nk(t,r.descriptor.valueType,e)})}function ok(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ci(t.attributes),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function ik(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ci(t.attributes),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function ak(r){switch(r){case ur.DELTA:return 1;case ur.CUMULATIVE:return 2}}function Dv(r,e){return{resourceMetrics:r.map(function(t){return Nv(t,e)})}}var Dp={serializeRequest:function(r){var e=Dv(r,{useLongBits:!1}),t=new TextEncoder;return t.encode(JSON.stringify(e))},deserializeResponse:function(r){var e=new TextDecoder;return JSON.parse(e.decode(r))}};var kv="0.52.1";var Uv=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ri=function(){return Ri=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Ri.apply(this,arguments)},Fv="v1/metrics",sk="http://localhost:4318/"+Fv,lk={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+kv},ck=function(r){Uv(e,r);function e(t){var n=r.call(this,t,Dp,"application/json")||this;return n.headers=Ri(Ri(Ri(Ri({},n.headers),lk),vi.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),as(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?Mp(Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Et().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?xp(Et().OTEL_EXPORTER_OTLP_ENDPOINT,Fv):sk},e}(vc),Bv=function(r){Uv(e,r);function e(t){return r.call(this,new ck(t),t)||this}return e}(gv);var xi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(xi||(xi={}));var Vr;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Vr||(Vr={}));Le();var uk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),zv=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Hv=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},dk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},pk=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Gv(r){return r!=null}function Ac(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function Vv(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var kp=function(r){uk(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Un(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new kp("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function Wv(r){return zv(this,void 0,void 0,function(){var e=this;return Hv(this,function(t){return[2,Promise.all(r.map(function(n){return zv(e,void 0,void 0,function(){var o,i;return Hv(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return[2]}})})}))]})})}function jv(r){return r.status==="rejected"}function Up(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,mk([],dk(e(n)),!1))}),t}function $v(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=pk(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(s){t={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function qv(r,e){for(var t=0,n=r.length-1,o=r.length;n>=t;){var i=t+Math.trunc((n-t)/2);r[i]<e?t=i+1:(o=i,n=i-1)}return o}function Kv(r,e){return r.toLowerCase()===e.toLowerCase()}Le();var mr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(mr||(mr={}));var Fp=function(){function r(){this.kind=mr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();Le();var ye;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ye||(ye={}));function Wr(r,e,t){var n,o,i,a;return hk(r)||V.warn('Invalid metric name: "'+r+'". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:"",unit:(o=t?.unit)!==null&&o!==void 0?o:"",valueType:(i=t?.valueType)!==null&&i!==void 0?i:Kt.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function Yv(r,e){var t,n;return{name:(t=r.name)!==null&&t!==void 0?t:e.name,description:(n=r.description)!==null&&n!==void 0?n:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function Xv(r,e){return Kv(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var gk=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function hk(r){return r.match(gk)!=null}var fk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function Sk(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var wc=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=Sk(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=qv(this._boundaries,e);this._current.buckets.counts[t]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Cc=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=mr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new wc(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new wc(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new wc(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.HISTOGRAM,dataPoints:n.map(function(i){var a=fk(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ye.GAUGE||e.type===ye.UP_DOWN_COUNTER||e.type===ye.OBSERVABLE_GAUGE||e.type===ye.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();Le();var Bp=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},zp=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},Hp=function(){function r(e,t,n,o){e===void 0&&(e=new yk),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var yk=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,zp([n,this._counts.length-t],Bp(this._counts.slice(t)),!1)),o.splice.apply(o,zp([0,t],Bp(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(zp([],Bp(this._counts),!1))},r}();var Jv=52,bk=2146435072,Ek=1048575,Gp=1023,Rc=-Gp+1,xc=Gp,ss=Math.pow(2,-1022);function Mc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&bk)>>20;return n-Gp}function _c(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&Ek)*Math.pow(2,32);return o+n}function ls(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Zv(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var Tk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Fn=function(r){Tk(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var tA=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<ss)return this._minNormalLowerBoundaryIndex();var t=Mc(e),n=this._rightShift(_c(e)-1,Jv);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Fn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Fn("overflow: "+e+" is > maximum lower boundary: "+n);return ls(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=Rc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return xc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var rA=function(){function r(e){this._scale=e,this._scaleFactor=ls(Math.LOG2E,e),this._inverseFactor=ls(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=ss)return this._minNormalLowerBoundaryIndex()-1;if(_c(e)===0){var t=Mc(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Fn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return ss;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Fn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return Rc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(xc+1<<this._scale)-1},r}();var nA=-10,oA=20,vk=Array.from({length:31},function(r,e){return e>10?new rA(e-10):new tA(e-10)});function Vp(r){if(r>oA||r<nA)throw new Fn("expected scale >= "+nA+" && <= "+oA+", got: "+r);return vk[r+10]}var Ak=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Pc=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),wk=20,Ck=160,Wp=2,iA=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=Ck),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new Hp),u===void 0&&(u=new Hp),d===void 0&&(d=Vp(wk)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<Wp&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Wp),this._maxSize=Wp)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=Zv(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Vp(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Pc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Pc.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Pc(0,-1);var o=t-n;return new Pc(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var jp=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=mr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new iA(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Ak(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ye.GAUGE||e.type===ye.UP_DOWN_COUNTER||e.type===ye.OBSERVABLE_GAUGE||e.type===ye.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();Le();var Rk=rp("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function aA(r){return r.setValue(Rk,!0)}Le();function sA(){return function(r){V.error(xk(r))}}function xk(r){return typeof r=="string"?r:JSON.stringify(Mk(r))}function Mk(r){for(var e={},t=r;t!==null;)Object.getOwnPropertyNames(t).forEach(function(n){if(!e[n]){var o=t[n];o&&(e[n]=String(o))}}),t=Object.getPrototypeOf(t);return e}var _k=sA();function Ic(r){try{_k(r)}catch{}}var lA="1.30.1";var Pk="process.runtime.name";var Ik="service.name";var Ok="telemetry.sdk.name",Lk="telemetry.sdk.language",Nk="telemetry.sdk.version";var cA=Pk;var uA=Ik;var cs=Ok,us=Lk,ds=Nk;var Dk="nodejs";var dA=Dk;var Mi,Eo=(Mi={},Mi[cs]="opentelemetry",Mi[cA]="node",Mi[us]=dA,Mi[ds]=lA,Mi);function ms(r){r.unref()}var Gk=9,Vk=6,Wk=Math.pow(10,Vk),ale=Math.pow(10,Gk);function To(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*Wk);return[t,n]}function _i(r){return r[0]*1e6+r[1]/1e3}var ps;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(ps||(ps={}));Le();function mA(r,e){return new Promise(function(t){Ti.with(aA(Ti.active()),function(){r.export(e,function(n){t(n)})})})}var pA={_export:mA};var jk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Oc=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=To(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var $p=function(){function r(){this.kind=mr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Oc(e)},r.prototype.merge=function(e,t){var n=_i(t.sampleTime)>=_i(e.sampleTime)?t:e;return new Oc(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=_i(t.sampleTime)>=_i(e.sampleTime)?t:e;return new Oc(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.GAUGE,dataPoints:n.map(function(i){var a=jk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var $k=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Pi=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Lc=function(){function r(e){this.monotonic=e,this.kind=mr.SUM}return r.prototype.createAccumulation=function(e){return new Pi(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Pi(t.startTime,this.monotonic,o,t.reset):new Pi(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Pi(t.startTime,this.monotonic,o,!0):new Pi(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.SUM,dataPoints:n.map(function(i){var a=$k(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var vo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),pr=function(){function r(){}return r.Drop=function(){return EA},r.Sum=function(){return TA},r.LastValue=function(){return vA},r.Histogram=function(){return AA},r.ExponentialHistogram=function(){return qk},r.Default=function(){return Kk},r}();var gA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Fp,e}(pr);var hA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ye.COUNTER:case ye.OBSERVABLE_COUNTER:case ye.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Lc(!0),e.NON_MONOTONIC_INSTANCE=new Lc(!1),e}(pr);var fA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new $p,e}(pr);var SA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Cc([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(pr);var gs=function(r){vo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new Cc(this._boundaries,this._recordMinMax)},e}(pr);var yA=function(r){vo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new jp(this._maxSize,this._recordMinMax)},e}(pr);var bA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ye.COUNTER:case ye.UP_DOWN_COUNTER:case ye.OBSERVABLE_COUNTER:case ye.OBSERVABLE_UP_DOWN_COUNTER:return TA;case ye.GAUGE:case ye.OBSERVABLE_GAUGE:return vA;case ye.HISTOGRAM:return t.advice.explicitBucketBoundaries?new gs(t.advice.explicitBucketBoundaries):AA}return V.warn("Unable to recognize instrument type: "+t.type),EA},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(pr);var EA=new gA,TA=new hA,vA=new fA,AA=new SA,qk=new yA,Kk=new bA;var wA=function(r){return pr.Default()},CA=function(r){return xi.CUMULATIVE};var qp=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Kp=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},RA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Yk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},xA=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:wA,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:CA,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector}return r.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},r.prototype.onInitialized=function(){},r.prototype.collect=function(e){return qp(this,void 0,void 0,function(){var t,n,o,i,a,s;return Kp(this,function(c){switch(c.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return[4,Promise.all(Yk([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],RA(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=RA.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(Up(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(Up(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return qp(this,void 0,void 0,function(){return Kp(this,function(t){switch(t.label){case 0:return this._shutdown?(V.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return t.sent(),[3,4];case 2:return[4,Un(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return qp(this,void 0,void 0,function(){return Kp(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return t.sent(),[2];case 2:return[4,Un(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Le();var Xk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Nc=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Dc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Jk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Qk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},Yp=function(r){Xk(e,r);function e(t){var n,o,i,a,s=r.call(this,{aggregationSelector:(n=t.exporter.selectAggregation)===null||n===void 0?void 0:n.bind(t.exporter),aggregationTemporalitySelector:(o=t.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(t.exporter),metricProducers:t.metricProducers})||this;if(t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<t.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=t.exporter,s}return e.prototype._runOnce=function(){return Nc(this,void 0,void 0,function(){var t;return Dc(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,Un(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof kp?(V.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(Ic(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Nc(this,void 0,void 0,function(){var o,i,a,s,c,l;return Dc(this,function(u){switch(u.label){case 0:return[4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(l=V).error.apply(l,Qk(["PeriodicExportingMetricReader: metrics collection errors"],Jk(a),!1)),!i.resource.asyncAttributesPending)return[3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(n=(t=i.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),V.debug("Error while resolving async portion of resource: ",s),Ic(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,pA._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==ps.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+c.error+")");return[2]}})})},e.prototype.onInitialized=function(){var t=this;this._interval=setInterval(function(){t._runOnce()},this._exportInterval),ms(this._interval)},e.prototype.onForceFlush=function(){return Nc(this,void 0,void 0,function(){return Dc(this,function(t){switch(t.label){case 0:return[4,this._runOnce()];case 1:return t.sent(),[4,this._exporter.forceFlush()];case 2:return t.sent(),[2]}})})},e.prototype.onShutdown=function(){return Nc(this,void 0,void 0,function(){return Dc(this,function(t){switch(t.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return t.sent(),[4,this._exporter.shutdown()];case 2:return t.sent(),[2]}})})},e}(xA);Le();Le();function kc(){return"unknown_service:"+process.argv0}var Bn=function(){return Bn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Bn.apply(this,arguments)},Zk=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},eU=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},tU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Uc=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[uA]=kc(),e[us]=Eo[us],e[cs]=Eo[cs],e[ds]=Eo[ds],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return Zk(this,void 0,void 0,function(){return eU(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Bn(Bn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=tU(a,2),l=c[0],u=c[1];return Bn(Bn(Bn(Bn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var MA=function(){function r(){this._registeredViews=[]}return r.prototype.addView=function(e){this._registeredViews.push(e)},r.prototype.findViews=function(e,t){var n=this,o=this._registeredViews.filter(function(i){return n._matchInstrument(i.instrumentSelector,e)&&n._matchMeter(i.meterSelector,t)});return o},r.prototype._matchInstrument=function(e,t){return(e.getType()===void 0||t.type===e.getType())&&e.getNameFilter().match(t.name)&&e.getUnitFilter().match(t.unit)},r.prototype._matchMeter=function(e,t){return e.getNameFilter().match(t.name)&&(t.version===void 0||e.getVersionFilter().match(t.version))&&(t.schemaUrl===void 0||e.getSchemaUrlFilter().match(t.schemaUrl))},r}();Le();var Ao=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Fc=function(){function r(e,t){this._writableMetricStorage=e,this._descriptor=t}return r.prototype._record=function(e,t,n){if(t===void 0&&(t={}),n===void 0&&(n=Ti.active()),typeof e!="number"){V.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._descriptor.name+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,To(Date.now()))},r}();var _A=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){this._record(t,n,o)},e}(Fc);var PA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){V.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Fc);var IA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){this._record(t,n,o)},e}(Fc);var OA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){V.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Fc);var Bc=function(){function r(e,t,n){this._observableRegistry=n,this._descriptor=e,this._metricStorages=t}return r.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this)},r.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this)},r}();var LA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Bc);var NA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Bc);var DA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Bc);function hs(r){return r instanceof Bc}var kA=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=Wr(e,ye.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new IA(o,n)},r.prototype.createHistogram=function(e,t){var n=Wr(e,ye.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new OA(o,n)},r.prototype.createCounter=function(e,t){var n=Wr(e,ye.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new PA(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=Wr(e,ye.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new _A(o,n)},r.prototype.createObservableGauge=function(e,t){var n=Wr(e,ye.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new NA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=Wr(e,ye.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new LA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=Wr(e,ye.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new DA(n,o,this._meterSharedState.observableRegistry)},r.prototype.addBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.addBatchCallback(e,t)},r.prototype.removeBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.removeBatchCallback(e,t)},r}();var zc=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=Wr(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var rU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),UA=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},nU=function(){function r(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map}return r.prototype.get=function(e,t){return t??(t=this._hash(e)),this._valueMap.get(t)},r.prototype.getOrDefault=function(e,t){var n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);var o=t();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o),o},r.prototype.set=function(e,t,n){n??(n=this._hash(e)),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,t)},r.prototype.has=function(e,t){return t??(t=this._hash(e)),this._valueMap.has(t)},r.prototype.keys=function(){var e,t;return UA(this,function(n){switch(n.label){case 0:e=this._keyMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},r.prototype.entries=function(){var e,t;return UA(this,function(n){switch(n.label){case 0:e=this._valueMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[this._keyMap.get(t.value[0]),t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},Object.defineProperty(r.prototype,"size",{get:function(){return this._valueMap.size},enumerable:!1,configurable:!0}),r}();var Cr=function(r){rU(e,r);function e(){return r.call(this,Ac)||this}return e}(nU);var oU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Hc=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new Cr,this._cumulativeMemoStorage=new Cr,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Ac(this._overflowAttributes)}return r.prototype.record=function(e,t,n,o){var i=this,a=this._activeCollectionStorage.get(t);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(t,a)}a?.record(e)},r.prototype.batchCumulate=function(e,t){var n=this;Array.from(e.entries()).forEach(function(o){var i=oU(o,3),a=i[0],s=i[1],c=i[2],l=n._aggregator.createAccumulation(t);l?.record(s);var u=l;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}else if(n._cumulativeMemoStorage.size>=n._cardinalityLimit&&(a=n._overflowAttributes,c=n._overflowHashCode,n._cumulativeMemoStorage.has(a,c))){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}if(n._activeCollectionStorage.has(a,c)){var m=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(m,u)}n._cumulativeMemoStorage.set(a,l,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new Cr,e},r}();var Xp=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},FA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Gc=function(){function r(e,t){var n=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,t.forEach(function(o){n._unreportedAccumulations.set(o,[])})}return r.prototype.buildMetrics=function(e,t,n,o){this._stashAccumulations(n);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),l=c.collectionTime;s=c.aggregationTemporality,s===xi.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,l)}else s=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=iU(a);if(u.length!==0)return this._aggregator.toMetricData(t,s,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=Xp(o),a=i.next();!a.done;a=i.next()){var s=a.value,c=this._unreportedAccumulations.get(s);c===void 0&&(c=[],this._unreportedAccumulations.set(s,c)),c.push(e)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}},r.prototype._getMergedUnreportedAccumulations=function(e){var t,n,o=new Cr,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Xp(i),s=a.next();!s.done;s=a.next()){var c=s.value;o=r.merge(o,c,this._aggregator)}}catch(l){t={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return o},r.merge=function(e,t,n){for(var o=e,i=t.entries(),a=i.next();a.done!==!0;){var s=FA(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),m=n.merge(d,l);o.set(c,m,u)}else o.set(c,l,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=Xp(e.keys()),s=a.next();!s.done;s=a.next()){var c=FA(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(m){o={error:m}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function iU(r){return Array.from(r.entries())}var aU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),sU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BA=function(r){aU(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Hc(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Gc(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new Cr;Array.from(t.entries()).forEach(function(a){var s=sU(a,2),c=s[0],l=s[1];i.set(o._attributesProcessor.process(c),l)}),this._deltaMetricStorage.batchCumulate(i,n)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(zc);Le();function Jp(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
|
|
27
|
+
`),globalThis.console=e}}var Qp=" ".repeat(6);import FN from"fetch-retry";import BN from"os";import WE,{multistream as zN}from"pino";import HN from"pino-pretty";import GN from"pino-std-serializers";var yi=new Map,VN=!0,jE="Log throttle exceeded",WN=100,jN=5e3,$N=FN(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}}),Zp=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??BN.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=VN?WE(a):WE(a,zN([{stream:HN({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 $N(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:yo(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===jE)return!0;let t=Date.now();return t-this.lastWindowStart>jN&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,jE),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<WN?(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(ja[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=GN.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:Pb({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,yi.set("app",this),yi.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=Ib[e]):(this.minLevelValue=ja[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},bi=({app:r,hostname:e,disableConsoleLogs:t})=>(yi.has(r)||yi.set(r,new Zp({bindings:{app:r},hostname:e,disableConsoleLogs:t})),yi.get(r));async function $E(){await Promise.all([...yi.values()].map(r=>r.flush()))}import{hostname as qN}from"os";var ur=bi({app:"cli",hostname:qN(),disableConsoleLogs:!0}).child({cliVersion:"0.14.0"});function em(r){if(!r)return;r=r.toLowerCase();let e=Xl.safeParse(r);if(e.success)return w.setMinLevel(e.data),e.data}function qE({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 VE(()=>{if(c.forEach(u=>{w.log(""),o(u)}),c.length){w.log("");let u=c.length===1?"":"s";w.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{w.dimmed(n(d))})}if(l.length){w.log("");let u=l.length===1?"":"s";w.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{w.dimmed(n(d))})}if(a.length){w.log("");let u=a.length===1?"":"s";w.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{w.dimmed(n(d))})}if(s.length){w.log("");let u=s.length===1?"":"s";w.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{w.dimmed(n(d))})}if(i.length){w.log("");let u=i.length===1?"":"s";w.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{w.dimmed(n(d))})}w.log(""),w.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var Ya=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Ei.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Ei.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Ei.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Ei.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Ei.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Ei.bgMagenta.white("RUNNING"),a=0):(w.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),KN||(i=`${i}`),w.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import YN from"fs";import{tmpdir as XN}from"os";import JN from"path";import{registry as Xa}from"playwright-core/lib/server";import KE from"proper-lockfile";var YE=JN.join(XN(),"momenticBrowserInstallation");var tm=["chrome","chromium","chrome-for-testing","ffmpeg"],QN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},XE={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function JE(r){if(r==="Org Default")return!1;let e=XE[QN[r]??""]??"",t=Xa.findExecutable(e);return!t||t.installType==="none"?!1:rm(t)}function rm(r){let e=r.executablePath();return YN.existsSync(e)}function ZN(r,e){let t=XE[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=Xa.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&rm(n)))return n}async function eD({browser:r,force:e}){let t=ZN(r,e);if(!t){w.info(`Browser '${r}' is already installed, skipping...`);return}w.info(`Installing browser '${r}'...`);try{await Xa.installDeps([t],!1),await Xa.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){w.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=Xa.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!rm(o);)w.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function ic({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?tm:Array.from(new Set(r));try{await KE.lock(YE,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){w.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of n)try{await eD({browser:i,force:e})}catch(a){o=a,w.error(`Failed to install the ${i} browser: ${a}`)}}finally{await KE.unlock(YE,{realpath:!1})}if(o)throw o}import{createServer as tD}from"http";async function ac(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await sc(o))return o}w.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function sc(r){return new Promise((e,t)=>{let n=tD();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(w.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(r)})}import Kte from"blocked-at";import Xte from"why-is-node-running";function QE(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 rD(r,e,t,n){if(t>r.length&&(w.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let o=Math.floor((e-1)*(r.length/t)),i=Math.floor(e*(r.length/t));return(n?[...r].sort((s,c)=>n(s).localeCompare(n(c))):[...r].sort()).filter((s,c)=>c>=o&&c<i)}function ZE(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?rD(e,t,n,o):e}import dF from"fs";import{tmpdir as pF,totalmem as mF}from"os";import gF from"path";import{execFile as nD}from"child_process";import oD from"path";function iD(){let r=process.env.ANDROID_HOME;if(!r)return"adb";let e=process.platform==="win32"?"adb.exe":"adb";return oD.join(r,"platform-tools",e)}async function ht(r,{timeoutMs:e=5e3,serial:t,throwOnError:n=!1}){let o=iD(),i=t?["-s",t,...r]:r;return await new Promise((a,s)=>{nD(o,i,{encoding:"utf8",timeout:e},(c,l)=>{if(c){if(n){s(c);return}a(void 0);return}a(l)})})}import{createInstanceClient as _U}from"@limrun/api";import{execSync as PU}from"child_process";import mre,{multistream as hre}from"pino";import Sre from"pino-pretty";var Ere=5*1024,aD="...[truncated]",Tre=Buffer.byteLength(aD,"utf8");import{PostHog as Ire}from"posthog-node";var Un=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var eT=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(eT(p));l=()=>c(eT(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 Un(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 zre}from"posthog-node";import{execSync as sD}from"child_process";import Ti from"os";import lD from"v8";var tT,Vr,nT=Ti.platform(),cD=Ti.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),{}),rT=r=>{try{let e={},t=!1,n=uD(),o=dD(),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=lD.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"),bo&&w.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};function oT(r){if(!Rr)return rT(r),{interval:setInterval(()=>rT(r),2e4),cpuMetadata:cD,platform:nT}}function uD(){let r=Ti.totalmem(),e=nT==="darwin"?pD():(()=>{let n=Ti.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function dD(){let r=Ti.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,!Vr)return Vr=t,null;let n={user:t.user-Vr.user,nice:t.nice-Vr.nice,sys:t.sys-Vr.sys,idle:t.idle-Vr.idle,irq:t.irq-Vr.irq,total:t.total-Vr.total};return tT={measurementTime:e,intervalMs:e-Vr.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},Vr=t,tT}function pD(){try{let r=sD("/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=Ti.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var lc=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function mD(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 cc(r,e){let t=mD(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var IT="=",mc=";",gm=",";var OT=8192;var Ci={};b_(Ci,{getKeyPairs:()=>$D,parseKeyPairsIntoRecord:()=>qD,parsePairKeyValue:()=>LT,serializeKeyPairs:()=>jD});De();var WD=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 jD(r){return r.reduce(function(e,t){var n=""+e+(e!==""?gm:"")+t;return n.length>OT?e:n},"")}function $D(r){return r.getAllEntries().map(function(e){var t=WD(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=mc+o.metadata.toString()),i})}function LT(r){var e=r.split(mc);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(IT);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=om(e.join(mc))),{key:o,value:i,metadata:a}}}}}function qD(r){return typeof r!="string"||r.length===0?{}:r.split(gm).map(function(e){return LT(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}De();var gc;(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"})(gc||(gc={}));var KD=",",YD=["OTEL_SDK_DISABLED"];function XD(r){return YD.indexOf(r)>-1}var JD=["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 QD(r){return JD.indexOf(r)>-1}var ZD=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function e0(r){return ZD.indexOf(r)>-1}var hm=1/0,fm=128,t0=128,r0=128,Sm={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:hm,OTEL_ATTRIBUTE_COUNT_LIMIT:fm,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:hm,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:fm,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:hm,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:fm,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:t0,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:r0,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:gc.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 n0(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function o0(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 i0(r,e,t,n){n===void 0&&(n=KD);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var a0={ALL:Be.ALL,VERBOSE:Be.VERBOSE,DEBUG:Be.DEBUG,INFO:Be.INFO,WARN:Be.WARN,ERROR:Be.ERROR,NONE:Be.NONE};function s0(r,e,t){var n=t[r];if(typeof n=="string"){var o=a0[n.toUpperCase()];o!=null&&(e[r]=o)}}function NT(r){var e={};for(var t in Sm){var n=t;switch(n){case"OTEL_LOG_LEVEL":s0(n,e,r);break;default:if(XD(n))n0(n,e,r);else if(QD(n))o0(n,e,r);else if(e0(n))i0(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Et(){var r=NT(process.env);return Object.assign({},Sm,r)}function DT(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function hc(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=DT(r.charCodeAt(n)),i=DT(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var kT="1.25.1";var l0="deployment.environment";var c0="process.runtime.name";var u0="service.name";var d0="service.instance.id";var p0="telemetry.sdk.name",m0="telemetry.sdk.language",g0="telemetry.sdk.version";var UT=l0;var FT=c0;var fc=u0;var BT=d0;var ns=p0,os=m0,is=g0;var h0="nodejs";var zT=h0;var Ri,Sc=(Ri={},Ri[ns]="opentelemetry",Ri[FT]="node",Ri[os]=zT,Ri[is]=kT,Ri);var f0=9,S0=6,y0=Math.pow(10,S0),b0=Math.pow(10,f0);function HT(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*y0);return[t,n]}function GT(r){return r[0]*b0+r[1]}function as(r){return r[0]*1e6+r[1]/1e3}var To;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(To||(To={}));var VT=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 E0=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},T0=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))},WT=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new VT}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,T0([this._that],E0(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 dr;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(dr||(dr={}));var _t;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(_t||(_t={}));var v0=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 uie=function(r){v0(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function jT(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}De();var pr;(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"})(pr||(pr={}));var $T=function(){function r(){this.kind=pr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var ue;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ue||(ue={}));var A0=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 w0(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 ym=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=w0(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=jT(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 bm=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=pr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new ym(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 ym(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 ym(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.HISTOGRAM,dataPoints:n.map(function(i){var a=A0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();De();var Em=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},Tm=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))},vm=function(){function r(e,t,n,o){e===void 0&&(e=new C0),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 C0=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,Tm([n,this._counts.length-t],Em(this._counts.slice(t)),!1)),o.splice.apply(o,Tm([0,t],Em(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(Tm([],Em(this._counts),!1))},r}();var qT=52,R0=2146435072,x0=1048575,Am=1023,yc=-Am+1,bc=Am,ss=Math.pow(2,-1022);function Ec(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&R0)>>20;return n-Am}function Tc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&x0)*Math.pow(2,32);return o+n}function ls(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function YT(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var M0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Fn=function(r){M0(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var JT=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<ss)return this._minNormalLowerBoundaryIndex();var t=Ec(e),n=this._rightShift(Tc(e)-1,qT);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Fn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Fn("overflow: "+e+" is > maximum lower boundary: "+n);return ls(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=yc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return bc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var QT=function(){function r(e){this._scale=e,this._scaleFactor=ls(Math.LOG2E,e),this._inverseFactor=ls(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=ss)return this._minNormalLowerBoundaryIndex()-1;if(Tc(e)===0){var t=Ec(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Fn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return ss;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Fn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return yc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(bc+1<<this._scale)-1},r}();var ZT=-10,ev=20,_0=Array.from({length:31},function(r,e){return e>10?new QT(e-10):new JT(e-10)});function wm(r){if(r>ev||r<ZT)throw new Fn("expected scale >= "+ZT+" && <= "+ev+", got: "+r);return _0[r+10]}var 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},vc=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}(),I0=20,O0=160,Cm=2,L0=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=O0),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 vm),u===void 0&&(u=new vm),d===void 0&&(d=wm(I0)),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<Cm&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Cm),this._maxSize=Cm)}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=YT(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=wm(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=vc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=vc.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 vc(0,-1);var o=t-n;return new vc(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 tv=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=pr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new L0(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=P0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var N0=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},Rm=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=HT(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var rv=function(){function r(){this.kind=pr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Rm(e)},r.prototype.merge=function(e,t){var n=as(t.sampleTime)>=as(e.sampleTime)?t:e;return new Rm(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=as(t.sampleTime)>=as(e.sampleTime)?t:e;return new Rm(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.GAUGE,dataPoints:n.map(function(i){var a=N0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var D0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},cs=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 xm=function(){function r(e){this.monotonic=e,this.kind=pr.SUM}return r.prototype.createAccumulation=function(e){return new cs(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new cs(t.startTime,this.monotonic,o,t.reset):new cs(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 cs(t.startTime,this.monotonic,o,!0):new cs(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.SUM,dataPoints:n.map(function(i){var a=D0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var vo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),jr=function(){function r(){}return r.Drop=function(){return uv},r.Sum=function(){return dv},r.LastValue=function(){return pv},r.Histogram=function(){return mv},r.ExponentialHistogram=function(){return k0},r.Default=function(){return U0},r}();var nv=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new $T,e}(jr);var ov=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new xm(!0),e.NON_MONOTONIC_INSTANCE=new xm(!1),e}(jr);var iv=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new rv,e}(jr);var av=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new bm([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(jr);var sv=function(r){vo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new bm(this._boundaries,this._recordMinMax)},e}(jr);var lv=function(r){vo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new tv(this._maxSize,this._recordMinMax)},e}(jr);var cv=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ue.COUNTER:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return dv;case ue.GAUGE:case ue.OBSERVABLE_GAUGE:return pv;case ue.HISTOGRAM:return t.advice.explicitBucketBoundaries?new sv(t.advice.explicitBucketBoundaries):mv}return V.warn("Unable to recognize instrument type: "+t.type),uv},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(jr);var uv=new nv,dv=new ov,pv=new iv,mv=new av,k0=new lv,U0=new cv;De();function Ac(){return"unknown_service:"+process.argv0}var Bn=function(){return Bn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Bn.apply(this,arguments)},F0=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())})},B0=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}}},z0=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},Mm=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[fc]=Ac(),e[os]=Sc[os],e[ns]=Sc[ns],e[is]=Sc[is],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return F0(this,void 0,void 0,function(){return B0(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Bn(Bn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=z0(a,2),l=c[0],u=c[1];return Bn(Bn(Bn(Bn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var Ao;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Ao||(Ao={}));De();var H0=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())})},G0=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}}},_m=function(){return dr.CUMULATIVE},gv=function(r){switch(r){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.GAUGE:case ue.HISTOGRAM:case ue.OBSERVABLE_GAUGE:return dr.DELTA;case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return dr.CUMULATIVE}},hv=function(r){switch(r){case ue.COUNTER:case ue.HISTOGRAM:return dr.DELTA;case ue.GAUGE:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_GAUGE:return dr.CUMULATIVE}};function V0(){var r=Et(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?_m:e==="delta"?gv:e==="lowmemory"?hv:(V.warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '"+r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE+"', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead."),_m)}function W0(r){return r!=null?r===Ao.DELTA?gv:r===Ao.LOWMEMORY?hv:_m:V0()}function j0(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return jr.Default()}}var fv=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=j0(t),this._aggregationTemporalitySelector=W0(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return H0(this,void 0,void 0,function(){return G0(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}();De();De();var $0=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},Sv=1e4,yv=5,bv=1e3,Ev=5e3,Tv=1.5;function us(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=$0(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):V.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function Pm(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function Im(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return V.warn("Could not parse export URL: '"+r+"'"),r}}function Om(r){return typeof r=="number"?r<=0?Lm(r,Sv):r:q0()}function q0(){var r,e=Number((r=Et().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Et().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?Lm(e,Sv):e}function Lm(r,e){return V.warn("Timeout must be greater than 0",r),e}function vv(r){var e=[429,502,503,504];return e.includes(r)}function Av(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 wv=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 WT(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=Om(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:To.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:To.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:To.SUCCESS})}).catch(function(n){t({code:To.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{V.debug("items to be sent",e),t.send(e,n,o)}catch(i){o(i)}})},r.prototype.shutdown=function(){return this._shutdownOnce.call()},r.prototype.forceFlush=function(){return Promise.all(this._sendingPromises).then(function(){})},r.prototype._shutdown=function(){return V.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();De();import*as Nm from"url";import*as Cc from"http";import*as Rc from"https";import*as Cv from"zlib";import{Readable as Y0}from"stream";var zn;(function(r){r.NONE="none",r.GZIP="gzip"})(zn||(zn={}));var K0=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)}}(),xi=function(r){K0(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 wc=function(){return wc=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},wc.apply(this,arguments)};function Dm(r,e,t,n,o){var i=r.timeoutMillis,a=new Nm.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 xi("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:wc({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?Cc.request:Rc.request,g=function(h,f){switch(h===void 0&&(h=yv),f===void 0&&(f=bv),l=m(p,function(b){var C="";b.on("data",function(R){return C+=R}),b.on("aborted",function(){if(u){var R=new xi("Request Timeout");o(R)}}),b.on("end",function(){if(u===!1)if(b.statusCode&&b.statusCode<299)V.debug("statusCode: "+b.statusCode,C),n(),clearTimeout(d),clearTimeout(c);else if(b.statusCode&&vv(b.statusCode)&&h>0){var R=void 0;f=Tv*f,b.headers["retry-after"]?R=Av(b.headers["retry-after"]):R=Math.round(Math.random()*(Ev-f)+f),c=setTimeout(function(){g(h-1,f)},R)}else{var v=new xi(b.statusMessage,b.statusCode,C);o(v),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(b){if(u){var C=new xi("Request Timeout",b.code);o(C)}else o(b);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var b=new xi("Request Timeout");o(b)}clearTimeout(d),clearTimeout(c)}),r.compression){case zn.GZIP:{l.setHeader("Content-Encoding","gzip");var E=X0(e);E.on("error",o).pipe(Cv.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function X0(r){var e=new Y0;return e.push(r),e.push(null),e}function km(r){if(r.httpAgentOptions&&r.keepAlive===!1){V.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Nm.URL(r.url),t=e.protocol==="http:"?Cc.Agent:Rc.Agent;return new t(wc({keepAlive:!0},r.httpAgentOptions))}catch(n){V.error("collector exporter failed to create http agent. err: "+n.message);return}}function Um(r){if(r)return r;var e=Et().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Et().OTEL_EXPORTER_OTLP_COMPRESSION;return e===zn.GZIP?zn.GZIP:zn.NONE}De();var J0=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)}}(),xc=function(r){J0(e,r);function e(t,n,o){t===void 0&&(t={});var i=r.call(this,t)||this;return i.DEFAULT_HEADERS={},i._contentType=o,t.metadata&&V.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,us(t.headers),Ci.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=km(t),i.compression=Um(t.compression),i._serializer=n,i}return e.prototype.onInit=function(t){},e.prototype.send=function(t,n,o){var i=this;if(this._shutdownOnce.isCalled){V.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;Dm(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}(wv);function xv(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function Q0(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function Mv(r){var e=xv(r);return Q0(e)}function Z0(r){var e=xv(r);return e.toString()}var ek=typeof BigInt<"u"?Z0:GT;function Rv(r){return r}function _v(r){if(r!==void 0)return hc(r)}var tk={encodeHrTime:Mv,encodeSpanContext:hc,encodeOptionalSpanContext:_v};function Pv(r){var e,t;if(r===void 0)return tk;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?Mv:ek,encodeSpanContext:o?Rv:hc,encodeOptionalSpanContext:o?Rv:_v}}var rk=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 Iv(r){return{name:r.name,version:r.version}}function Mi(r){return Object.keys(r).map(function(e){return Ov(e,r[e])})}function Ov(r,e){return{key:r,value:Lv(e)}}function Lv(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(Lv)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=rk(t,2),o=n[0],i=n[1];return Ov(o,i)})}}:{}}function Nv(r){return{attributes:Mi(r.attributes),droppedAttributesCount:0}}De();function kv(r,e){var t=Pv(e);return{resource:Nv(r.resource),schemaUrl:void 0,scopeMetrics:nk(r.scopeMetrics,t)}}function nk(r,e){return Array.from(r.map(function(t){return{scope:Iv(t.scope),metrics:t.metrics.map(function(n){return ok(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function ok(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=lk(r.aggregationTemporality);switch(r.dataPointType){case _t.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:Dv(r,e)};break;case _t.GAUGE:t.gauge={dataPoints:Dv(r,e)};break;case _t.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:ak(r,e)};break;case _t.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:sk(r,e)};break}return t}function ik(r,e,t){var n={attributes:Mi(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Kt.INT:n.asInt=r.value;break;case Kt.DOUBLE:n.asDouble=r.value;break}return n}function Dv(r,e){return r.dataPoints.map(function(t){return ik(t,r.descriptor.valueType,e)})}function ak(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Mi(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 sk(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Mi(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 lk(r){switch(r){case dr.DELTA:return 1;case dr.CUMULATIVE:return 2}}function Uv(r,e){return{resourceMetrics:r.map(function(t){return kv(t,e)})}}var Fm={serializeRequest:function(r){var e=Uv(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 Fv="0.52.1";var Bv=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)}}(),_i=function(){return _i=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},_i.apply(this,arguments)},zv="v1/metrics",ck="http://localhost:4318/"+zv,uk={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+Fv},dk=function(r){Bv(e,r);function e(t){var n=r.call(this,t,Fm,"application/json")||this;return n.headers=_i(_i(_i(_i({},n.headers),uk),Ci.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),us(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?Im(Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Et().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?Pm(Et().OTEL_EXPORTER_OTLP_ENDPOINT,zv):ck},e}(xc),Hv=function(r){Bv(e,r);function e(t){return r.call(this,new dk(t),t)||this}return e}(fv);var Pi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Pi||(Pi={}));var $r;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})($r||($r={}));De();var pk=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)}}(),Gv=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())})},Vv=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}}},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))},hk=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 Wv(r){return r!=null}function Mc(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function jv(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var Bm=function(r){pk(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Hn(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new Bm("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function $v(r){return Gv(this,void 0,void 0,function(){var e=this;return Vv(this,function(t){return[2,Promise.all(r.map(function(n){return Gv(e,void 0,void 0,function(){var o,i;return Vv(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 qv(r){return r.status==="rejected"}function zm(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,gk([],mk(e(n)),!1))}),t}function Kv(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=hk(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 Yv(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 Xv(r,e){return r.toLowerCase()===e.toLowerCase()}De();var mr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(mr||(mr={}));var Hm=function(){function r(){this.kind=mr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();De();var be;(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"})(be||(be={}));function qr(r,e,t){var n,o,i,a;return Sk(r)||V.warn('Invalid metric name: "'+r+'". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:"",unit:(o=t?.unit)!==null&&o!==void 0?o:"",valueType:(i=t?.valueType)!==null&&i!==void 0?i:Kt.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function Jv(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 Qv(r,e){return Xv(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var fk=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function Sk(r){return r.match(fk)!=null}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 bk(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 _c=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=bk(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=Yv(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 Pc=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=mr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new _c(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 _c(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 _c(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:$r.HISTOGRAM,dataPoints:n.map(function(i){var a=yk(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===be.GAUGE||e.type===be.UP_DOWN_COUNTER||e.type===be.OBSERVABLE_GAUGE||e.type===be.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}();De();var Gm=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},Vm=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=function(){function r(e,t,n,o){e===void 0&&(e=new Ek),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 Ek=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,Vm([n,this._counts.length-t],Gm(this._counts.slice(t)),!1)),o.splice.apply(o,Vm([0,t],Gm(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(Vm([],Gm(this._counts),!1))},r}();var Zv=52,Tk=2146435072,vk=1048575,jm=1023,Ic=-jm+1,Oc=jm,ds=Math.pow(2,-1022);function Lc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&Tk)>>20;return n-jm}function Nc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&vk)*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 tA(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var Ak=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)}}(),Gn=function(r){Ak(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var nA=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<ds)return this._minNormalLowerBoundaryIndex();var t=Lc(e),n=this._rightShift(Nc(e)-1,Zv);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Gn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Gn("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=Ic>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Oc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var oA=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<=ds)return this._minNormalLowerBoundaryIndex()-1;if(Nc(e)===0){var t=Lc(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 Gn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return ds;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Gn("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 Ic<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Oc+1<<this._scale)-1},r}();var iA=-10,aA=20,wk=Array.from({length:31},function(r,e){return e>10?new oA(e-10):new nA(e-10)});function $m(r){if(r>aA||r<iA)throw new Gn("expected scale >= "+iA+" && <= "+aA+", got: "+r);return wk[r+10]}var Ck=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Dc=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,xk=160,qm=2,sA=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=xk),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 Wm),u===void 0&&(u=new Wm),d===void 0&&(d=$m(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<qm&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+qm),this._maxSize=qm)}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=tA(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=$m(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Dc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Dc.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 Dc(0,-1);var o=t-n;return new Dc(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 Km=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=mr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new sA(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:$r.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Ck(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===be.GAUGE||e.type===be.UP_DOWN_COUNTER||e.type===be.OBSERVABLE_GAUGE||e.type===be.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}();De();var Mk=im("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function lA(r){return r.setValue(Mk,!0)}De();function cA(){return function(r){V.error(_k(r))}}function _k(r){return typeof r=="string"?r:JSON.stringify(Pk(r))}function Pk(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 Ik=cA();function kc(r){try{Ik(r)}catch{}}var uA="1.30.1";var Ok="process.runtime.name";var Lk="service.name";var Nk="telemetry.sdk.name",Dk="telemetry.sdk.language",kk="telemetry.sdk.version";var dA=Ok;var pA=Lk;var ms=Nk,gs=Dk,hs=kk;var Uk="nodejs";var mA=Uk;var Ii,wo=(Ii={},Ii[ms]="opentelemetry",Ii[dA]="node",Ii[gs]=mA,Ii[hs]=uA,Ii);function fs(r){r.unref()}var Wk=9,jk=6,$k=Math.pow(10,jk),gle=Math.pow(10,Wk);function Co(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*$k);return[t,n]}function Oi(r){return r[0]*1e6+r[1]/1e3}var Ss;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Ss||(Ss={}));De();function gA(r,e){return new Promise(function(t){wi.with(lA(wi.active()),function(){r.export(e,function(n){t(n)})})})}var hA={_export:gA};var qk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Uc=function(){function r(e,t,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=Co(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ym=function(){function r(){this.kind=mr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Uc(e)},r.prototype.merge=function(e,t){var n=Oi(t.sampleTime)>=Oi(e.sampleTime)?t:e;return new Uc(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Oi(t.sampleTime)>=Oi(e.sampleTime)?t:e;return new Uc(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:$r.GAUGE,dataPoints:n.map(function(i){var a=qk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var Kk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Li=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 Fc=function(){function r(e){this.monotonic=e,this.kind=mr.SUM}return r.prototype.createAccumulation=function(e){return new Li(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Li(t.startTime,this.monotonic,o,t.reset):new Li(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 Li(t.startTime,this.monotonic,o,!0):new Li(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:$r.SUM,dataPoints:n.map(function(i){var a=Kk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Ro=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),gr=function(){function r(){}return r.Drop=function(){return vA},r.Sum=function(){return AA},r.LastValue=function(){return wA},r.Histogram=function(){return CA},r.ExponentialHistogram=function(){return Yk},r.Default=function(){return Xk},r}();var fA=function(r){Ro(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 Hm,e}(gr);var SA=function(r){Ro(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case be.COUNTER:case be.OBSERVABLE_COUNTER:case be.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Fc(!0),e.NON_MONOTONIC_INSTANCE=new Fc(!1),e}(gr);var yA=function(r){Ro(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 Ym,e}(gr);var bA=function(r){Ro(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 Pc([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(gr);var ys=function(r){Ro(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 Pc(this._boundaries,this._recordMinMax)},e}(gr);var EA=function(r){Ro(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 Km(this._maxSize,this._recordMinMax)},e}(gr);var TA=function(r){Ro(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case be.COUNTER:case be.UP_DOWN_COUNTER:case be.OBSERVABLE_COUNTER:case be.OBSERVABLE_UP_DOWN_COUNTER:return AA;case be.GAUGE:case be.OBSERVABLE_GAUGE:return wA;case be.HISTOGRAM:return t.advice.explicitBucketBoundaries?new ys(t.advice.explicitBucketBoundaries):CA}return V.warn("Unable to recognize instrument type: "+t.type),vA},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(gr);var vA=new fA,AA=new SA,wA=new yA,CA=new bA,Yk=new EA,Xk=new TA;var RA=function(r){return gr.Default()},xA=function(r){return Pi.CUMULATIVE};var Xm=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())})},Jm=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}}},MA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Jk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},_A=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:RA,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:xA,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 Xm(this,void 0,void 0,function(){var t,n,o,i,a,s;return Jm(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(Jk([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],MA(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=MA.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(zm(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(zm(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Xm(this,void 0,void 0,function(){return Jm(this,function(t){switch(t.label){case 0:return this._shutdown?(V.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return t.sent(),[3,4];case 2:return[4,Hn(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Xm(this,void 0,void 0,function(){return Jm(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return t.sent(),[2];case 2:return[4,Hn(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();De();var Qk=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)}}(),Bc=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())})},zc=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}}},Zk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},eU=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},Qm=function(r){Qk(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 Bc(this,void 0,void 0,function(){var t;return zc(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,Hn(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof Bm?(V.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(kc(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Bc(this,void 0,void 0,function(){var o,i,a,s,c,l;return zc(this,function(u){switch(u.label){case 0:return[4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(l=V).error.apply(l,eU(["PeriodicExportingMetricReader: metrics collection errors"],Zk(a),!1)),!i.resource.asyncAttributesPending)return[3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(n=(t=i.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),V.debug("Error while resolving async portion of resource: ",s),kc(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,hA._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==Ss.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),fs(this._interval)},e.prototype.onForceFlush=function(){return Bc(this,void 0,void 0,function(){return zc(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 Bc(this,void 0,void 0,function(){return zc(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}(_A);De();De();function Hc(){return"unknown_service:"+process.argv0}var Vn=function(){return Vn=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},Vn.apply(this,arguments)},tU=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())})},rU=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},nU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Gc=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[pA]=Hc(),e[gs]=wo[gs],e[ms]=wo[ms],e[hs]=wo[hs],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return tU(this,void 0,void 0,function(){return rU(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=Vn(Vn({},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=nU(a,2),l=c[0],u=c[1];return Vn(Vn(Vn(Vn({},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 PA=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}();De();var xo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Vc=function(){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=wi.active()),typeof e!="number"){V.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._descriptor.name+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,Co(Date.now()))},r}();var IA=function(r){xo(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}(Vc);var OA=function(r){xo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){V.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Vc);var LA=function(r){xo(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}(Vc);var NA=function(r){xo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){V.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Vc);var Wc=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 DA=function(r){xo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wc);var kA=function(r){xo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wc);var UA=function(r){xo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Wc);function bs(r){return r instanceof Wc}var FA=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=qr(e,be.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new LA(o,n)},r.prototype.createHistogram=function(e,t){var n=qr(e,be.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new NA(o,n)},r.prototype.createCounter=function(e,t){var n=qr(e,be.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new OA(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=qr(e,be.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new IA(o,n)},r.prototype.createObservableGauge=function(e,t){var n=qr(e,be.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new kA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=qr(e,be.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new DA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=qr(e,be.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new UA(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 jc=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=qr(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var oU=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)}}(),BA=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}}},iU=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 BA(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 BA(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 xr=function(r){oU(e,r);function e(){return r.call(this,Mc)||this}return e}(iU);var 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},$c=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new xr,this._cumulativeMemoStorage=new xr,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Mc(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=aU(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 xr,e},r}();var Zm=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},zA=function(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},qc=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===Pi.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=sU(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=Zm(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 xr,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Zm(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=zA(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=Zm(e.keys()),s=a.next();!s.done;s=a.next()){var c=zA(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 sU(r){return Array.from(r.entries())}var lU=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)}}(),cU=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},HA=function(r){lU(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 $c(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new qc(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new xr;Array.from(t.entries()).forEach(function(a){var s=cU(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}(jc);De();function eg(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
|
|
28
28
|
`),r.type!==e.type&&(t+=" - Type '"+r.type+"' does not match '"+e.type+`'
|
|
29
29
|
`),r.valueType!==e.valueType&&(t+=" - Value Type '"+r.valueType+"' does not match '"+e.valueType+`'
|
|
30
30
|
`),r.description!==e.description&&(t+=" - Description '"+r.description+"' does not match '"+e.description+`'
|
|
31
|
-
`),t}function
|
|
31
|
+
`),t}function uU(r,e){return" - use valueType '"+r.valueType+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function dU(r,e){return" - use unit '"+r.unit+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function pU(r,e){var t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return" - create a new view with a name other than '"+r.name+"' and InstrumentSelector '"+n+"'"}function mU(r,e){var t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return" - create a new view with a name other than '"+r.name+"' and InstrumentSelector '"+n+`'
|
|
32
32
|
- OR - create a new view with the name `+r.name+" and description '"+r.description+"' and InstrumentSelector "+n+`
|
|
33
|
-
- OR - create a new view with the name `+e.name+" and description '"+r.description+"' and InstrumentSelector "+n}function
|
|
33
|
+
- OR - create a new view with the name `+e.name+" and description '"+r.description+"' and InstrumentSelector "+n}function tg(r,e){return r.valueType!==e.valueType?uU(r,e):r.unit!==e.unit?dU(r,e):r.type!==e.type?pU(r,e):r.description!==e.description?mU(r,e):""}var rg=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.")},GA=function(){function r(){this._sharedRegistry=new Map,this._perCollectorRegistry=new Map}return r.create=function(){return new r},r.prototype.getStorages=function(e){var t,n,o,i,a=[];try{for(var s=rg(this._sharedRegistry.values()),c=s.next();!c.done;c=s.next()){var l=c.value;a=a.concat(l)}}catch(m){t={error:m}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}var u=this._perCollectorRegistry.get(e);if(u!=null)try{for(var d=rg(u.values()),p=d.next();!p.done;p=d.next()){var l=p.value;a=a.concat(l)}}catch(m){o={error:m}}finally{try{p&&!p.done&&(i=d.return)&&i.call(d)}finally{if(o)throw o.error}}return a},r.prototype.register=function(e){this._registerStorage(e,this._sharedRegistry)},r.prototype.registerForCollector=function(e,t){var n=this._perCollectorRegistry.get(e);n==null&&(n=new Map,this._perCollectorRegistry.set(e,n)),this._registerStorage(t,n)},r.prototype.findOrUpdateCompatibleStorage=function(e){var t=this._sharedRegistry.get(e.name);return t===void 0?null:this._findOrUpdateCompatibleStorage(e,t)},r.prototype.findOrUpdateCompatibleCollectorStorage=function(e,t){var n=this._perCollectorRegistry.get(e);if(n===void 0)return null;var o=n.get(t.name);return o===void 0?null:this._findOrUpdateCompatibleStorage(t,o)},r.prototype._registerStorage=function(e,t){var n=e.getInstrumentDescriptor(),o=t.get(n.name);if(o===void 0){t.set(n.name,[e]);return}o.push(e)},r.prototype._findOrUpdateCompatibleStorage=function(e,t){var n,o,i=null;try{for(var a=rg(t),s=a.next();!s.done;s=a.next()){var c=s.value,l=c.getInstrumentDescriptor();Qv(l,e)?(l.description!==e.description&&(e.description.length>l.description.length&&c.updateDescription(e.description),V.warn("A view or instrument with the name ",e.name,` has already been registered, but has a different description and is incompatible with another registered view.
|
|
34
34
|
`,`Details:
|
|
35
|
-
`,
|
|
36
|
-
To resolve the conflict:`,
|
|
35
|
+
`,eg(l,e),`The longer description will be used.
|
|
36
|
+
To resolve the conflict:`,tg(l,e))),i=c):V.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
|
|
37
37
|
`,`Details:
|
|
38
|
-
`,
|
|
39
|
-
`,Qp(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},r}();var HA=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();Le();Le();var GA=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new Cr}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){V.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)},r}();var VA=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!hs(e)){var o=this._buffer.get(e);if(o==null&&(o=new Cr,this._buffer.set(e,o)),typeof t!="number"){V.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Kt.INT&&!Number.isInteger(t)&&(V.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var eg=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},tg=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},WA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},jA=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},$A=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(hs));if(n.size===0){V.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(hs)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return eg(this,void 0,void 0,function(){var n,o,i,a;return tg(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,Wv(jA(jA([],WA(n),!1),WA(o),!1))];case 1:return i=s.sent(),a=i.filter(jv).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return eg(n,void 0,void 0,function(){var s,c;return tg(this,function(l){switch(l.label){case 0:return s=new GA(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=Un(c,t)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return eg(n,void 0,void 0,function(){var s,c;return tg(this,function(l){switch(l.label){case 0:return s=new VA,c=Promise.resolve(i(s)),t!=null&&(c=Un(c,t)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(m){m.record(d,e)})}),[2]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&$v(n.instruments,t)})},r}();var mU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),qA=function(r){mU(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Hc(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Gc(n,i),s}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(zc);var KA=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ii=function(){function r(){}return r.Noop=function(){return gU},r}();var pU=function(r){KA(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Ii);var YA=function(r){KA(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Ii);var gU=new pU;var hU=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},fU=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},SU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},XA=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new zA,this.observableRegistry=new $A,this.meter=new kA(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,qA);return t.length===1?t[0]:new HA(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,BA);return t},r.prototype.collect=function(e,t,n){return hU(this,void 0,void 0,function(){var o,i,a;return fU(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(t,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,t)}).filter(Gv),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=Yv(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),m=new t(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(m),m});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=SU(c,2),u=l[0],d=l[1],m=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(m!=null)return m;var p=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new t(e,p,Ii.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var yU=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},JA=function(){function r(e){this.resource=e,this.viewRegistry=new MA,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=Vv(e),n=this.meterSharedStates.get(t);return n==null&&(n=new XA(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=yU(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var Vc=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Wc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},bU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},EU=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},QA=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return Vc(this,void 0,void 0,function(){var t,n,o,i,a=this;return Wc(this,function(s){switch(s.label){case 0:return t=To(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Vc(a,void 0,void 0,function(){var l;return Wc(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,EU([],bU(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return Vc(this,void 0,void 0,function(){return Wc(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return Vc(this,void 0,void 0,function(){return Wc(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var ZA=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},ew=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},tw=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function TU(r,e){var t=e??Uc.empty();return r?Uc.default().merge(t):t}var rg=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new JA(TU((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=tw(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(p){t={error:p}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=tw(e.readers),d=u.next();!d.done;d=u.next()){var m=d.value;this.addMetricReader(m)}}catch(p){o={error:p}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(V.warn("A shutdown MeterProvider cannot provide a Meter"),sp()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new QA(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return ZA(this,void 0,void 0,function(){return ew(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return ZA(this,void 0,void 0,function(){return ew(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return t.sent(),[2]}})})},r}();var vU=/[\^$\\.+?()[\]{}|]/g,jc=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(vU,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Oi=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var rw=function(){function r(e){var t;this._nameFilter=new jc((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Oi(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var nw=function(){function r(e){this._nameFilter=new Oi(e?.name),this._versionFilter=new Oi(e?.version),this._schemaUrlFilter=new Oi(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function AU(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var $c=function(){function r(e){var t;if(AU(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||jc.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new YA(e.attributeKeys):this.attributesProcessor=Ii.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:pr.Default(),this.instrumentSelector=new rw({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new nw({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var Hue=process.env.APP||"unknown";Le();import{v4 as wU}from"uuid";function CU(){return new Bv({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:bo.DELTA})}var RU=[new $c({instrumentName:"test_event_duration",instrumentType:ye.HISTOGRAM,aggregation:new gs([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new $c({instrumentName:"test_step_duration",instrumentType:ye.HISTOGRAM,aggregation:new gs([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],Kc=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let t=typeof process<"u"?"production":"unknown",n=new Cp({[dc]:e.serviceName,[DT]:t,[UT]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:wU()}),o=CU(),i=new Yp({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new rg({resource:n,readers:[i],views:RU}),sc.setGlobalMeterProvider(this.provider),this.meter=sc.getMeter("momentic-serverless")}increment(e,t,n){try{let o=oc(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=oc(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var Tt=new nc;function ow(r){r.disabled||(Tt=new Kc(r))}import{hostname as _U}from"os";import PU from"path";import{_android as IU}from"playwright";async function iw(r){let{apiClient:e,logger:t,creationOpts:n,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s}=r,{token:c,webRtcUrl:l,adbUrl:u,name:d,apkDownloadUrl:m,region:p,playwrightServerUrl:g}=await e.createAndroidEmulator({...n,hostname:_U(),sessionId:s}),h;try{MU("adb --version"),h="adb"}catch{if(process.env.ANDROID_HOME)h=PU.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new Error("The adb binary was not found in PATH and ANDROID_HOME is not set either")}t.info({emulatorName:d,apkToInstall:n.apkToInstall,region:p,apkDownloadUrl:m,sessionId:s,playwrightServerUrl:g},"Android instance creation ok");let f=await Tt.recordDuration({fn:async()=>await xU({adbUrl:u,endpointUrl:l,token:c,logLevel:i,adbPath:h}),name:"test_event_duration",tags:["name:limbar-client-creation",`orgId:${a}`]}),E=["https://github.com/appium/appium-uiautomator2-server/releases/download/v7.6.2/appium-uiautomator2-server-v7.6.2.apk","https://github.com/appium/appium-uiautomator2-server/releases/download/v7.6.2/appium-uiautomator2-server-debug-androidTest.apk","https://github.com/appium/io.appium.settings/releases/download/v5.14.15/settings_apk-debug.apk"];m&&E.push(m);let b=n.apkToInstall?.channel,C=n.apkToInstall?.tag;o(`Installing APK${b?` with channel ${b}`:""}${C?` and tag ${C}`:""}`),await Promise.all(E.map(A=>f.sendAsset(A))),o("Starting ADB tunnel");let R=await Tt.recordDuration({fn:async()=>await f.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),v=()=>{R.close(),f.disconnect()},M;return g&&(o("Opening Playwright connection"),M=await Tt.recordDuration({fn:async()=>await IU.connect(g),name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:R.address.port,close:v,limbarToken:c,limbarUrl:l,emulatorName:d,playwrightDevice:M,client:f}}import QU from"fs";function ft(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var un={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},dn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},ng={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},og={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function sw(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?dn[r.operation]:un[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?dn[r.operation]:un[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?dn[r.operation]:un[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?dn[r.operation]:un[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?og[r.condition]:ng[r.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Fde={CONTENT:"The page"};function lw(r){switch(r.type){case"SUBSTRING":return`match substring '${r.url}'`;case"REGEX":return`match regex '${r.regex}'`;case"GLOB":return`match glob '${r.glob}'`;case"DOMAIN":return`match domain '${r.domain}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function ig(r){return`${r.negated?dn.CONTAINS:un.CONTAINS} '${r.value}'`}function cw(r){switch(r.type){case"CONTENT":return ig(r);default:return r.type,""}}function OU(r){return typeof r=="object"&&r!==null}function wo(r){if(Array.isArray(r))return r.map(wo);if(OU(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=wo(n))}),e}return r}function jr(r,e,t,n){let{negated:o,ignoreCase:i}=n,a=r.trim(),s=e.trim();i&&(a=a.toLowerCase(),s=s.toLowerCase());let c;switch(t){case"CONTAINS":{c=a.includes(s);break}case"EQUALS":{c=a===s;break}case"STARTS_WITH":{c=a.startsWith(s);break}case"EXISTS":{c=a.length>0;break}default:throw new Error(`Unrecognized content assertion type: ${t}`)}return o?!c:c}function Yc(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function gr(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?ng[r.condition]:og[r.condition]:r.negated?un[r.operation]:dn[r.operation]}import{diff as LU}from"deep-object-diff";import{cloneDeep as lme}from"lodash-es";function Xc(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(LU(r,e)).length>0}function ag({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],s=[],c=[],l=0,u=(m,p)=>{try{let g=Mn.parse(p.value);if(g.type!==m.type){o.warn({parsedCacheEntry:g,command:m},"Not using step cache due to type mismatch"),s.push(p.key);return}m.cache=g.cache,a.push(p.key),c.push(p.uniqueKey)}catch(g){s.push(p.key),o.error({err:g,cacheEntry:p},"Not using step cache due to parsing error")}},d=(m,p)=>{let g=DU(m.id,p),h=g.find(f=>!!n[f]);if(h)u(m,n[h]);else{if(m.type==="AI_CHECK")return;s.push(g[0])}};for(let m of r)switch(m.type){case"MOBILE_PRESET_STEP":{if(!Ml(m.command)||m.command.type==="TYPE"&&!m.command.target||"cache"in m.command&&m.command.cache)continue;l++,d(m.command,i);break}case"RESOLVED_MOBILE_MODULE":{l+=m.steps.length;let{cacheKeysHit:p,cacheKeysMissed:g,uniqueKeysHit:h}=ag({...t,steps:m.steps,keyPrefix:i?`${i}:${m.id}`:m.id,topLevel:!1});a.push(...p),s.push(...g),c.push(...h);break}case"MOBILE_AI_ACTION_STEP":{l++;break}default:{let p=m}}return e&&l&&s.length>0&&o.warn({totalSteps:l,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:c,cacheEntriesKeys:Object.values(n).map(m=>m.uniqueKey)},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:c}}function NU(r,e){return e?`${e}:${r}`:r}function DU(r,e){let t=[],n=e?.split(":")??[];for(let o=n.length;o>=0;o--){let i=[...n.slice(o),r];t.push(i.join(":"))}return t.reverse(),t}function sg(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
|
|
40
|
-
${JSON.stringify(t)}`);let n=[];return n.push({key:NU(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function Jc({cmd:r,newTarget:e,key:t,logger:n,updatedWithAI:o}){if(r.type==="DRAG")if(t!=="fromTarget"&&t!=="toTarget")n.error({cmd:r,newTarget:e,key:t},"Attempted to apply invalid cache to DRAG command");else{let i=r.cache?.updatedAt;r.cache={...r.cache,[t]:e,updatedAt:i&&!o?i:new Date}}else if(t==="target"&&Pd(r)){let i=r.cache?.updatedAt;r.cache={...r.cache,target:e,updatedAt:i&&!o?i:new Date}}else n.error({cmd:r,newTarget:e,key:t},"Invalid target cache application")}function fs(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;Xc(n,e)&&(t.info({updatedTraces:e,oldCmd:r},"Wrote new memory to assertion command"),r.cache={...r.cache,memory:{type:"GCS_TRACES",traces:e},updatedAt:new Date})}function lg(r){return{...r,serializedHtml:void 0,nodeOnlySerializedHtml:void 0,screenshotUrl:void 0,boundingBox:void 0,selector:void 0,hybridSelector:void 0,generatedSelectors:void 0,id:-1}}function dw(r,e){return r?Xc(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:lg(e.target),updatedAt:e.updatedAt}}function kU(r){switch(r.type){case"AI_CHECK":return`AI check: ${r.assertion}`;case"TAP":return`Tap on element: ${li(r.target)}`;case"TYPE":return`Type ${r.text} ${r.target?`into ${li(r.target)}`:""}`;case"PRESS":return`Press the ${r.key} button`;case"PRESS_KEYBOARD":return`Press the ${r.key} key`;case"SWIPE":return r.scrollableElement.type==="CUSTOM"?`Swipe ${r.direction} in container: ${r.scrollableElement.target.description}`:`Swipe ${r.direction} in the ${r.scrollableElement.type.toLowerCase()}`;case"SCROLL_TO":{let e=r.scrollStepPercent?` (${Math.round(r.scrollStepPercent*100)}% per step)`:"";return`Scroll ${r.direction} to find: ${r.target.description}${e}`}case"DRAG_AND_DROP":return`Drag ${li(r.fromTarget)} to ${li(r.toTarget)}`;case"SCREEN_CHECK":return`Check that the screen ${cw(r.assertion)}`;case"ELEMENT_CHECK":return`Check that the element ${li(r.target)} ${sw(r.assertion)}`;case"OPEN_APP":return`Open app: ${r.packageName}`;case"OPEN_NOTIFICATION_DRAWER":return"Open notification drawer";case"JAVASCRIPT":return`Execute JavaScript: ${r.code}`;case"REQUEST":return`Make API request to ${r.url}`;case"WAIT":return`Wait ${r.timeoutSecs} seconds`;case"ADD_FILE":return`Add file: ${r.file} to ${r.storageLocation}`;case"INSTALL_APP":return`Install app: ${r.uri}`;case"UNINSTALL_APP":return`Uninstall app: ${r.packageName}`;case"TOGGLE_SETTINGS":{let e;switch(r.settingsType){case"AIRPLANE_MODE":e="airplane mode";break;case"DATA":e="data connection";break;case"WIFI":e="Wi-Fi";break;case"LOCATION":e="location services";break;default:{let t=r.settingsType;e=String(r.settingsType)}}return`Toggle ${e}`}case"ADB":return`ADB command: ${r.command}`;case"KILL_APP":return"Kill active app";case"STATE":return"Send debug state to Momentic";default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}function cg(r){switch(r.type){case"MOBILE_PRESET_STEP":return kU(r.command);case"MOBILE_MODULE_STEP":return`Module ${r.moduleId}`;case"RESOLVED_MOBILE_MODULE":return`Module ${r.name}`;case"MOBILE_AI_ACTION_STEP":return`AI action: ${r.text}`;default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}import{cloneDeep as Hw}from"lodash-es";import ug from"semver";function Qc(r,e){if(r!=="0.0.1"&&r!==e[e.length-1].toVersion)throw new Error("Please bump latestSchemaVersion in types package after adding a migration");e.forEach((t,n)=>{if(!ug.valid(t.toVersion)||!ug.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!ug.gt(t.toVersion,t.fromVersion))throw new Error(`Migration '${t.name}' has toVersion <= fromVersion`);if(n===0)return;if(e[n-1].toVersion!==t.fromVersion)throw new Error(`Migration '${t.name}' at index ${n} is not contiguous with previous migration`)})}import UU from"diff-lines";import FU,{gte as BU}from"semver";function zU(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function dg({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>FU.gt(d.toVersion,a));if(c===-1)return{steps:i,newVersion:a};let l=a;for(let d=c;d<o.length;d++){if(n&&BU(l,n)){t.debug("Stopping migration early because toVersion was reached");break}let m=o[d],p={id:s,migration:m.name,toVersion:m.toVersion};try{i=await mw(i,m),l=m.toVersion}catch(g){throw t.error({err:g,...p},"Migration failed"),new Error(`Step migration ${m.name} failed: ${g}`)}}let u=UU(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&t.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function mw(r,e){let t=await e.execute(r);for(let n of t)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||zU(i)&&(n[o]=await mw(i,e))}return t}var pw={name:"Migrate API request body types",fromVersion:"0.0.1",toVersion:"0.0.2",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var gw=[pw];Qc(oo,gw);async function mg({metadata:r,steps:e,logger:t,toVersion:n}){return await dg({metadata:r,steps:e,logger:t,toVersion:n,migrations:gw})}var hw={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>(r=r.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),r=r.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),r)};var fw={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,n=t[t.length-1];return n&&n.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var HU=["target","fromTarget","toTarget"];function Sw(r){for(let e of HU){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var yw={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":return Sw(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])Sw(n);return e}default:return e}})};import{v4 as GU}from"uuid";var bw={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=GU()),e;default:return e}})};import{v4 as Ew}from"uuid";var Tw={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??Ew(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??Ew()}})),delete e.commands),e;default:return e}})};var vw={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as VU}from"uuid";var Aw={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>("id"in e&&typeof e.id=="string"||(e.id=VU()),e))};import{v4 as ww}from"uuid";var Cw={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=ww())}return e.id=ww(),e})};var Rw={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as WU}from"uuid";var xw={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=WU()),e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};var Mw={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var _w={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Pw(t),e})};function Pw(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){Pw(r[e]);return}if(typeof r[e]!="string")return;let t=r[e];e==="code"?r[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(r[e]=t.replace(/inputs\./g,"env."))})}var Iw={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var Ow={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var Lw={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var Nw={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t)return e;if(t.type==="SELECT_OPTION"){if(t.option===void 0)return e;t.choice={type:"VALUE",value:t.option},t.option=void 0}else if(t.type==="TAB"){if(t.url===void 0)return e;t.action={type:"SUBSTRING",substring:t.url},t.url=void 0}else if(t.type==="WAIT_FOR_URL"){if(t.url===void 0)return e;t.matcher={type:"GLOB",glob:t.url},t.url=void 0}else t.type==="AI_WAIT"&&(t.type="AI_ASSERTION",t.timeout||(t.timeout=10));return e})};var Dw={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="MOCK_ROUTE"&&t.type!=="SET_HEADER"&&t.type!=="RECORD_REQUESTS"&&t.type!=="REGISTER_REQUEST_LISTENER"||(t.type==="REGISTER_REQUEST_LISTENER"||t.type==="RECORD_REQUESTS"?t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.pattern}}:(t.type==="SET_HEADER"||t.type==="MOCK_ROUTE")&&t.urlPattern&&(t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.urlPattern}})),e})};var kw={name:"Migrate API request body types",fromVersion:"1.0.21",toVersion:"1.0.22",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var Uw={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async r=>r.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Zc=new Set(["CLICK","TYPE","SELECT_OPTION"]),Fw={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type,o=t?.elementDescriptor;return(o!==void 0||Zc.has(n))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Zc.has(c))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,c=s?.elementDescriptor,l=s?.type;(c!==void 0||Zc.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let m=d?.elementDescriptor,p=d?.type;(m!==void 0||Zc.has(p))&&(d.target={elementDescriptor:m??""})})}),e}),stopOnFailure:!0};var Bw={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var zw={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type;return n?.startsWith("PRESET_")&&(t.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var jU=[Uw,Bw,zw,Fw,hw,fw,yw,bw,Tw,vw,Aw,Cw,Rw,xw,Mw,_w,Iw,Ow,Lw,Nw,Dw,kw];Qc(Cn,jU);async function Gw(r){let e={},{resolvedSteps:t,newSchemaVersion:n}=await eu({rawSteps:r.rawStepLists.steps,onFetchModule:r.onFetchModule,logger:r.logger,metadata:r.testMetadata,resolvedModuleCache:e}),o={steps:t};for(let i of["beforeSteps","afterSteps"]){let a=r.rawStepLists[i];if(!a)continue;let{resolvedSteps:s}=await eu({rawSteps:a,onFetchModule:r.onFetchModule,logger:r.logger,metadata:r.testMetadata,resolvedModuleCache:e});o[i]=s}return{resolvedStepLists:o,moduleIds:Array.from(Object.keys(e))}}async function qU(r,e,t){let{newVersion:n,steps:o}=await mg({metadata:r,steps:e,logger:t});try{return{steps:Vt.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new fa(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function eu({rawSteps:r,onFetchModule:e,logger:t,metadata:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await qU(n,r,t),s=[];for(let c of a)s.push(await Vw({rawStep:Vt.parse(c),onFetchModule:e,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function Vw({rawStep:r,onFetchModule:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"MOBILE_MODULE_STEP":{let o=r.moduleId,i=n[o];if(i)return{...Hw(i),...r,type:"RESOLVED_MOBILE_MODULE"};let a=await e(o);if(!a)throw new Error(`Could not find module with id ${o}`);let s;try{s=Vt.array().parse(a.steps)}catch(u){throw t.error({err:u,steps:a.steps,moduleId:o},"Module failed to parse (mobile)"),u}let c=await Promise.all(s.map(u=>Vw({rawStep:u,onFetchModule:e,logger:t,resolvedModuleCache:n}))),l={...a,description:a.description||void 0,steps:c};return n[o]=Hw(l),{...l,...r,type:"RESOLVED_MOBILE_MODULE"}}case"MOBILE_AI_ACTION_STEP":case"MOBILE_PRESET_STEP":return r}}import{diff as Ww}from"deep-object-diff";import{cloneDeep as jw}from"lodash-es";import{v4 as pg}from"uuid";async function $r(r){let e=new Map,t=new Set,n=jw(r.steps),o=await qw({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});return{stepsToSave:o.stepsToSave,cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates}}function KU({newEntries:r,originalCachesMap:e}){let t=[];for(let n of r){let o=e[n.key],i=n.value.cache;if(!i)continue;if(!o||!o.cache){t.push(n);continue}if(n.value.type!==o.type){t.push(n);continue}let a=bn.safeParse(i),s=bn.safeParse(o);if(a.success&&s.success&&a.data.memory){let m=s.data.memory,p=a.data.memory;Xc(m,p)&&(n.value.cache={...s.data,memory:p,updatedAt:a.data.updatedAt},t.push(n));continue}let c=xn.safeParse(i),l=xn.safeParse(o);if(c.success&&l.success){let m=Ss({originalCache:l.data,newCache:c.data,targetGetter:p=>p.target});m.changed&&(n.value.cache=m.result,t.push(n));continue}let u=xl.safeParse(i),d=xl.safeParse(o);if(u.success&&d.success){let m=Ss({originalCache:d.data,newCache:u.data,targetGetter:g=>g.fromTarget}),p=Ss({originalCache:{...d.data,fromTarget:m.result.fromTarget},newCache:u.data,targetGetter:g=>g.toTarget});(m.changed||p.changed)&&(n.value.cache=p.result,t.push(n));continue}}return t}async function $w({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let{cachesToSave:a}=await $r({steps:o,cacheCreationParams:{testId:n,orgId:t}}),s={};for(let u of a)s[u.key]=u.value;let{cachesToSave:c}=await $r({steps:i,cacheCreationParams:{testId:n,orgId:t}}),l=KU({newEntries:c,originalCachesMap:s});if(l.length){r.debug({prunedCaches:l},"Saving pruned mobile memory post-failure");try{await e.saveEntries({logger:r,testId:n,entries:l})}catch(u){r.error({err:u},"Failed to save mobile memory post-failure. This is not critical, but can impact future performance.")}}}async function qw({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:c}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(u.id=c?pg():u.id,u.type){case"MOBILE_PRESET_STEP":{let d=u.command;d.id=c?pg():d.id,"cache"in d&&d.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(sg({id:d.id,orgId:n.orgId,testId:n.testId,value:Mn.parse(d),moduleIdParents:o,moduleStepParents:i}))),delete d.cache),l.stepsToSave.push({...u,command:d});break}case"RESOLVED_MOBILE_MODULE":{let d=c?pg():u.id,m=u.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(u),a.set(u.moduleId,m));let{cachesToSave:p,stepsToSave:g,moduleUpdates:h}=await qw({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,d],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(h),l.cachesToSave=l.cachesToSave.concat(p),t.has(m)||(t.add(m),l.moduleUpdates.push({...Xy.parse(u),steps:Vt.array().parse(g),moduleId:m}));let f=La.parse({...u,type:"MOBILE_MODULE_STEP",moduleId:m,inputs:u.inputs,id:d});l.stepsToSave.push(f);break}case"MOBILE_AI_ACTION_STEP":{l.stepsToSave.push(u);break}default:{let d=u}}return l}function Ss({originalCache:r,newCache:e,targetGetter:t}){let n=t(r),o=t(e),i=jw(r),a=t(i),s=!1;if(o.memory){let c=n.memory,l=Object.keys(Ww(c??{},o.memory??{}));Object.keys(l).length>0&&(a.memory=o.memory,i.updatedAt=new Date,s=!0)}if(a.type==="WEBVIEW"&&o.type==="WEBVIEW"&&a.browserCache){let c=o.browserCache?.memory,l=n.type==="WEBVIEW"?n.browserCache?.memory:void 0;if(c){let u=Object.keys(Ww(l??{},c??{}));Object.keys(u).length>0&&(a.browserCache.memory=c,i.updatedAt=new Date,s=!0)}}return{result:i,changed:s}}function YU(r){let e={parentChain:[]};return Kw(r,e),e}function Kw(r,e){let{onPreset:t,onModule:n,earlyStop:o}=r;for(let i of r.steps){if(i.type==="RESOLVED_MOBILE_MODULE"){if(n?.(i,e)&&o||(e.parentChain.push(i),Kw({...r,steps:i.steps},e)&&o))return!0;e.parentChain.pop();continue}if(t(i,e)&&o)return!0}return!1}function XU(r,e,t=[]){let n,o=[],i=(a,s)=>{let c=JSON.stringify(s.parentChain.map(u=>u.id)),l=t.length===0?!0:JSON.stringify(t)===c;return a.id===e&&l?(n=a,o=s.parentChain,!0):!1};return YU({steps:r,earlyStop:!0,onPreset:i,onModule:i}),{result:n,parentChain:o}}function Yw({currentStep:r,currentParentChain:e,desiredStepId:t,desiredStepParentChain:n}){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==n[s])return!1;i.shift()}return!!XU([r],t,i).result}function Xw(r){let e=r[0],t=r[0],n=!1;for(;!n&&t;)switch(t.type){case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":if(!t.steps.length){e=t,n=!0;break}t=t.steps[0];break;case"MOBILE_PRESET_STEP":e=t,n=!0;break;default:{let s=t}}let o=r[r.length-1],i=r[r.length-1],a=!1;for(;!a&&i;)switch(i.type){case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":if(!i.steps.length){o=i,a=!0;break}i=i.steps[i.steps.length-1];break;case"MOBILE_PRESET_STEP":o=i,a=!0;break;default:{let s=i}}return{firstMetadata:e,lastMetadata:o}}function Jw({result:r,firstMetadata:e,lastMetadata:t}){e&&(r.beforeSnapshot=e.beforeSnapshot),t&&(r.data=t.data,r.afterSnapshot=t.afterSnapshot,t.status!=="SUCCESS"&&(r.message=t.message))}import{cloneDeep as mhe}from"lodash-es";import ghe from"truncate-json";import{v4 as Ahe}from"uuid";import{cloneDeep as rhe,unset as nhe}from"lodash-es";import{cloneDeep as Mhe}from"lodash-es";import{diff as pfe}from"deep-object-diff";import{diff as $he}from"deep-object-diff";import{cloneDeep as Khe}from"lodash-es";import{v4 as cfe}from"uuid";import{cloneDeep as bfe}from"lodash-es";import{cloneDeep as Dfe}from"lodash-es";import{stringify as qfe}from"yaml";async function j(r,e){if(!(r<=0))return new Promise((t,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}async function hg({promiseGenerator:r,signal:e,codePath:t,logger:n}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}n?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,c)=>{function l(){clearInterval(a),e?.removeEventListener("abort",l),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",l,{once:!0}),(async()=>{try{s(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",l)}})()})}async function ys({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",s),!i&&a.abort()},e);o?.addEventListener("abort",s,{once:!0});try{return await hg({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function tu(r){let e;return r>10*60*1e3?e=2*60*1e3:r>60*1e3?e=20*1e3:r>10*1e3?e=2*1e3:e=1e3,e}import JU from"picomatch";var ru=(r,e,t)=>{t?.caseInsensitive&&(r=r.toLowerCase());let n;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;n=r.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;n=r===e.glob||JU(o)(r);break}case"REGEX":{n=new RegExp(e.regex).test(r);break}case"DOMAIN":{let o=t?.caseInsensitive?e.domain.toLowerCase():e.domain;n=new URL(r).hostname===o;break}}return t?.negated?!n:n},nu=(r,e)=>{try{let{hostname:t,pathname:n}=new URL(r),{hostname:o,pathname:i}=new URL(e);return t!==o||n!==i}catch{return!1}},Li=r=>{try{return new URL(r),!0}catch{return!1}},Qw=r=>!r.toLowerCase().startsWith("http"),Ni=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Co(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}import{v4 as Zw}from"uuid";function fg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var ou=class{reporter;asyncWork;metadata;creditsUsedV1=0;creditsUsedV2=0;constructor({logger:e,reporter:t,runType:n,runId:o,testMetadata:i,suiteMetadata:a}){this.reporter=t,this.metadata={testId:i.id,testName:i.name,suiteId:a?.id,suiteName:a?.name},this.asyncWork=[t.reportBillableEvents(e,[{event:n,timestamp:new Date().toISOString(),transactionId:o,properties:fg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(Jy(e.type)){this.creditsUsedV2+=1;return}let t=Mm(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=_m(e.command);this.creditsUsedV1+=n??0}}async flush(e){this.creditsUsedV1>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:Zw(),properties:fg({creditsUsed:this.creditsUsedV1},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),this.creditsUsedV2>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used-v2",timestamp:new Date().toISOString(),transactionId:Zw(),properties:fg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as MSe}from"lodash-es";import{remote as ZU}from"webdriverio";var eF=["If you see 'device offline' in ADB output, the emulator likely reset or crashed. Please start a new editor session by refreshing the page.","If Appium /status does not respond, the Appium server may not have started correctly. Please inspect the log output above for errors."];async function tF(r,e){try{let t=await QU.promises.open(r,"r");try{let{size:n}=await t.stat(),o=Math.max(0,n-e),i=Buffer.alloc(n-o);return await t.read(i,0,i.length,o),i.toString("utf8")}finally{await t.close()}}catch{return}}async function rF(r){try{let e=await fetch(`http://localhost:${r}/status`,{method:"GET",signal:AbortSignal.timeout(5e3)}),t=await e.text();return{ok:!0,statusCode:e.status,body:t}}catch(e){return{ok:!1,error:ul(e)}}}function nF(r){let e=ul(r);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function eC(r,e){if(!r||!e)return;let t=r.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0);for(let n of t){if(n.startsWith("List of devices attached")||!n.startsWith(e))continue;let i=n.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function oF(r){return r&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(r)||/^localhost:\d+$/.test(r))?r:null}function iF(r){let e=(r??"").toLowerCase();return{deviceOffline:e.includes("device offline"),instrumentationCrashed:e.includes("instrumentation process has been unexpectedly terminated"),uiAutomatorCrashed:e.includes("uiautomator2")&&(e.includes("instrumentation")||e.includes("not running")||e.includes("socket hang up"))}}async function aF(r){return{adbSerial:r,devices:await ht(["devices","-l"],{timeoutMs:2500}),state:r?await ht(["get-state"],{serial:r,timeoutMs:5e3}):void 0,bootCompleted:r?await ht(["shell","getprop","sys.boot_completed"],{serial:r,timeoutMs:5e3}):void 0}}async function sF({logger:r,adbSerial:e,adbSnapshot:t,appiumLogHints:n,transportMode:o}){let i=eC(t.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=o==="tunneled"?oF(e):void 0;if(r.warn({adbSerial:e,deviceState:i,appiumLogHints:n,transportMode:o},"Attempting best-effort recovery of Android transport"),o==="tunneled"&&s?(await ht(["start-server"],{timeoutMs:5e3}),await j(500),await ht(["disconnect",s],{timeoutMs:5e3}),await j(500),await ht(["connect",s],{timeoutMs:5e3}),await j(500)):(await ht(["kill-server"],{timeoutMs:5e3}),await j(500),await ht(["start-server"],{timeoutMs:5e3}),await j(500),await ht(["reconnect","offline"],{timeoutMs:5e3}),await j(500)),e){let c=await ht(["get-state"],{serial:e,timeoutMs:5e3});typeof c=="string"&&c.trim()==="device"&&(await ht(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await ht(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}))}}async function tC({logger:r,onStatusUpdate:e,wdOpts:t,appiumPort:n,appiumLogFile:o,appiumServerClose:i,startAppiumServer:a,adbSerial:s,transportMode:c}){let l=i,u=o;for(let d=1;d<=2;d++)try{return d>1&&e("Retrying Appium session creation..."),{driver:await ZU(t),appiumLogFile:u,appiumServerClose:l}}catch(m){let p=await rF(n),g=await aF(s),h=await tF(u,64*1024),f=iF(h),E=eC(g.devices,s);if(r.error({err:m,appiumPort:n,appiumLogFile:u,appiumStatus:p,adbSnapshot:g,adbDeviceState:E,appiumLogHints:f,appiumLogTail:h},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${ul(m)}`),!(d===1&&(nF(m)||E==="offline"||f.instrumentationCrashed||f.deviceOffline)))throw w.error(`Failed to create Appium WebDriver session. Troubleshooting:
|
|
41
|
-
- ${
|
|
42
|
-
- `)}`),
|
|
43
|
-
`).map(o=>o.trim().split(/\s+/)[0]).filter(o=>!!o?.startsWith("emulator-"));await Promise.all(n.map(async o=>{r.info({emulatorName:o},"Killing emulator");let i=await ht(["emu","kill"],{serial:o,timeoutMs:5e3});i&&r.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...")}))}function
|
|
38
|
+
`,eg(l,e),`To resolve the conflict:
|
|
39
|
+
`,tg(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 VA=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}();De();De();var WA=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new xr}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){V.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)},r}();var jA=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!bs(e)){var o=this._buffer.get(e);if(o==null&&(o=new xr,this._buffer.set(e,o)),typeof t!="number"){V.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Kt.INT&&!Number.isInteger(t)&&(V.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var ng=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())})},og=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}}},$A=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},qA=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))},KA=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(bs));if(n.size===0){V.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(bs)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return ng(this,void 0,void 0,function(){var n,o,i,a;return og(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,$v(qA(qA([],$A(n),!1),$A(o),!1))];case 1:return i=s.sent(),a=i.filter(qv).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 ng(n,void 0,void 0,function(){var s,c;return og(this,function(l){switch(l.label){case 0:return s=new WA(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=Hn(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 ng(n,void 0,void 0,function(){var s,c;return og(this,function(l){switch(l.label){case 0:return s=new jA,c=Promise.resolve(i(s)),t!=null&&(c=Hn(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&&Kv(n.instruments,t)})},r}();var gU=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)}}(),YA=function(r){gU(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 $c(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new qc(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}(jc);var XA=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)}}(),Ni=function(){function r(){}return r.Noop=function(){return fU},r}();var hU=function(r){XA(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Ni);var JA=function(r){XA(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}(Ni);var fU=new hU;var SU=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}}},bU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},QA=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new GA,this.observableRegistry=new KA,this.meter=new FA(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,YA);return t.length===1?t[0]:new VA(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,HA);return t},r.prototype.collect=function(e,t,n){return SU(this,void 0,void 0,function(){var o,i,a;return yU(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(Wv),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=Jv(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=bU(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,Ni.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var EU=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},ZA=function(){function r(e){this.resource=e,this.viewRegistry=new PA,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=jv(e),n=this.meterSharedStates.get(t);return n==null&&(n=new QA(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=EU(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 Kc=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())})},Yc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},TU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},vU=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))},ew=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return Kc(this,void 0,void 0,function(){var t,n,o,i,a=this;return Yc(this,function(s){switch(s.label){case 0:return t=Co(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Kc(a,void 0,void 0,function(){var l;return Yc(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,vU([],TU(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 Kc(this,void 0,void 0,function(){return Yc(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 Kc(this,void 0,void 0,function(){return Yc(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 tw=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())})},rw=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}}},nw=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 AU(r,e){var t=e??Gc.empty();return r?Gc.default().merge(t):t}var ig=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new ZA(AU((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=nw(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=nw(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?(V.warn("A shutdown MeterProvider cannot provide a Meter"),um()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new ew(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return tw(this,void 0,void 0,function(){return rw(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return tw(this,void 0,void 0,function(){return rw(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return t.sent(),[2]}})})},r}();var wU=/[\^$\\.+?()[\]{}|]/g,Xc=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(wU,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Di=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 ow=function(){function r(e){var t;this._nameFilter=new Xc((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Di(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 iw=function(){function r(e){this._nameFilter=new Di(e?.name),this._versionFilter=new Di(e?.version),this._schemaUrlFilter=new Di(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 CU(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Jc=function(){function r(e){var t;if(CU(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Xc.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 JA(e.attributeKeys):this.attributesProcessor=Ni.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:gr.Default(),this.instrumentSelector=new ow({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new iw({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var Yue=process.env.APP||"unknown";De();import{v4 as RU}from"uuid";function xU(){return new Hv({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Ao.DELTA})}var MU=[new Jc({instrumentName:"test_event_duration",instrumentType:be.HISTOGRAM,aggregation:new ys([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new Jc({instrumentName:"test_step_duration",instrumentType:be.HISTOGRAM,aggregation:new ys([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],Zc=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 Mm({[fc]:e.serviceName,[UT]:t,[BT]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:RU()}),o=xU(),i=new Qm({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new ig({resource:n,readers:[i],views:MU}),pc.setGlobalMeterProvider(this.provider),this.meter=pc.getMeter("momentic-serverless")}increment(e,t,n){try{let o=cc(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=cc(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var Tt=new lc;function aw(r){r.disabled||(Tt=new Zc(r))}import{hostname as IU}from"os";import OU from"path";import{_android as LU}from"playwright";async function sw(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:IU(),sessionId:s}),f;try{PU("adb --version"),f="adb"}catch{if(process.env.ANDROID_HOME)f=OU.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new Error("The adb binary was not found in PATH and ANDROID_HOME is not set either")}t.info({emulatorName:p,apkToInstall:n.apkToInstall,region:g,apkDownloadUrl:m,sessionId:s,playwrightServerUrl:h},"Android instance creation ok");let E=await Tt.recordDuration({fn:async()=>await _U({adbUrl:d,endpointUrl:u,token:l,logLevel:i,adbPath:f}),name:"test_event_duration",tags:["name:limbar-client-creation",`orgId:${a}`]});c&&E.onConnectionStateChange(c);let b=["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&&b.push(m);let C=n.apkToInstall?.channel,R=n.apkToInstall?.tag;o(`Installing APK${C?` with channel ${C}`:""}${R?` and tag ${R}`:""}`),await Promise.all(b.map(I=>E.sendAsset(I))),o("Starting ADB tunnel");let v=await Tt.recordDuration({fn:async()=>await E.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),M=()=>{v.close(),E.disconnect()},A;return h&&(o("Opening Playwright connection"),A=await Tt.recordDuration({fn:async()=>await LU.connect(h),name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:v.address.port,close:M,limbarToken:l,limbarUrl:u,emulatorName:p,playwrightDevice:A,client:E}}import eF from"fs";function ft(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var mn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},gn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},ag={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},sg={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function cw(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?gn[r.operation]:mn[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?gn[r.operation]:mn[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?gn[r.operation]:mn[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?gn[r.operation]:mn[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?sg[r.condition]:ag[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 qde={CONTENT:"The page"};function uw(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 lg(r){return`${r.negated?gn.CONTAINS:mn.CONTAINS} '${r.value}'`}function dw(r){switch(r.type){case"CONTENT":return lg(r);default:return r.type,""}}function NU(r){return typeof r=="object"&&r!==null}function Mo(r){if(Array.isArray(r))return r.map(Mo);if(NU(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=Mo(n))}),e}return r}function Kr(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 eu(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function hr(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?ag[r.condition]:sg[r.condition]:r.negated?mn[r.operation]:gn[r.operation]}import{diff as DU}from"deep-object-diff";import{cloneDeep as Spe}from"lodash-es";function tu(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(DU(r,e)).length>0}function cg({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=On.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=UU(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(!Ol(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}=cg({...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 kU(r,e){return e?`${e}:${r}`:r}function UU(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 ug(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:kU(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function ru({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"&&Nd(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 Es(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;tu(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 dg(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 mw(r,e){return r?tu(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:dg(e.target),updatedAt:e.updatedAt}}function FU(r){switch(r.type){case"AI_CHECK":return`AI check: ${r.assertion}`;case"TAP":return`Tap on element: ${ui(r.target)}`;case"TYPE":return`Type ${r.text} ${r.target?`into ${ui(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 ${ui(r.fromTarget)} to ${ui(r.toTarget)}`;case"SCREEN_CHECK":return`Check that the screen ${dw(r.assertion)}`;case"ELEMENT_CHECK":return`Check that the element ${ui(r.target)} ${cw(r.assertion)}`;case"OPEN_APP":return`Open app: ${r.packageName}`;case"OPEN_NOTIFICATION_DRAWER":return"Open notification drawer";case"JAVASCRIPT":return`Execute JavaScript: ${r.code}`;case"REQUEST":return`Make API request to ${r.url}`;case"WAIT":return`Wait ${r.timeoutSecs} seconds`;case"ADD_FILE":return`Add file: ${r.file} to ${r.storageLocation}`;case"INSTALL_APP":return`Install app: ${r.uri}`;case"UNINSTALL_APP":return`Uninstall app: ${r.packageName}`;case"TOGGLE_SETTINGS":{let e;switch(r.settingsType){case"AIRPLANE_MODE":e="airplane mode";break;case"DATA":e="data connection";break;case"WIFI":e="Wi-Fi";break;case"LOCATION":e="location services";break;default:{let t=r.settingsType;e=String(r.settingsType)}}return`Toggle ${e}`}case"ADB":return`ADB command: ${r.command}`;case"KILL_APP":return"Kill active app";case"STATE":return"Send debug state to Momentic";default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}function pg(r){switch(r.type){case"MOBILE_PRESET_STEP":return FU(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 Vw}from"lodash-es";import mg from"semver";function nu(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(!mg.valid(t.toVersion)||!mg.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!mg.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 BU from"diff-lines";import zU,{gte as HU}from"semver";function GU(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function gg({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>zU.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&&HU(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 gw(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=BU(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 gw(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)||GU(i)&&(n[o]=await gw(i,e))}return t}var hw={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 fw=[hw];nu(lo,fw);async function hg({metadata:r,steps:e,logger:t,toVersion:n}){return await gg({metadata:r,steps:e,logger:t,toVersion:n,migrations:fw})}var Sw={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 yw={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 VU=["target","fromTarget","toTarget"];function bw(r){for(let e of VU){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var Ew={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 bw(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])bw(n);return e}default:return e}})};import{v4 as WU}from"uuid";var Tw={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=WU()),e;default:return e}})};import{v4 as vw}from"uuid";var Aw={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??vw(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??vw()}})),delete e.commands),e;default:return e}})};var ww={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 jU}from"uuid";var Cw={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=jU()),e))};import{v4 as Rw}from"uuid";var xw={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=Rw())}return e.id=Rw(),e})};var Mw={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 $U}from"uuid";var _w={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=$U()),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 Pw={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 Iw={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&&Ow(t),e})};function Ow(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){Ow(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 Lw={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 Nw={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 Dw={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 kw={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 Uw={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 Fw={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 Bw={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 ou=new Set(["CLICK","TYPE","SELECT_OPTION"]),zw={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||ou.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||ou.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||ou.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||ou.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var Hw={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 Gw={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 qU=[Bw,Hw,Gw,zw,Sw,yw,Ew,Tw,Aw,ww,Cw,xw,Mw,_w,Pw,Iw,Lw,Nw,Dw,kw,Uw,Fw];nu(Mn,qU);async function Ww(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 YU(r,e,t){let{newVersion:n,steps:o}=await hg({metadata:r,steps:e,logger:t});try{return{steps:Vt.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new Ta(`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 YU(n,r,t),s=[];for(let c of a)s.push(await jw({rawStep:Vt.parse(c),onFetchModule:e,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function jw({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{...Vw(i),...r,type:"RESOLVED_MOBILE_MODULE"};let a=await e(o);if(!a)throw new Error(`Could not find module with id ${o}`);let s;try{s=Vt.array().parse(a.steps)}catch(u){throw t.error({err:u,steps:a.steps,moduleId:o},"Module failed to parse (mobile)"),u}let c=await Promise.all(s.map(u=>jw({rawStep:u,onFetchModule:e,logger:t,resolvedModuleCache:n}))),l={...a,description:a.description||void 0,steps:c};return n[o]=Vw(l),{...l,...r,type:"RESOLVED_MOBILE_MODULE"}}case"MOBILE_AI_ACTION_STEP":case"MOBILE_PRESET_STEP":return r}}import{diff as $w}from"deep-object-diff";import{cloneDeep as qw}from"lodash-es";import{v4 as fg}from"uuid";async function Yr(r){let e=new Map,t=new Set,n=qw(r.steps),o=await Yw({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});return{stepsToSave:o.stepsToSave,cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates}}function XU({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=vn.safeParse(i),s=vn.safeParse(o);if(a.success&&s.success&&a.data.memory){let p=s.data.memory,m=a.data.memory;tu(p,m)&&(n.value.cache={...s.data,memory:m,updatedAt:a.data.updatedAt},t.push(n));continue}let c=In.safeParse(i),l=In.safeParse(o);if(c.success&&l.success){let p=Ts({originalCache:l.data,newCache:c.data,targetGetter:m=>m.target});p.changed&&(n.value.cache=p.result,t.push(n));continue}let u=Il.safeParse(i),d=Il.safeParse(o);if(u.success&&d.success){let p=Ts({originalCache:d.data,newCache:u.data,targetGetter:g=>g.fromTarget}),m=Ts({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 Kw({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let{cachesToSave:a}=await Yr({steps:o,cacheCreationParams:{testId:n,orgId:t}}),s={};for(let u of a)s[u.key]=u.value;let{cachesToSave:c}=await Yr({steps:i,cacheCreationParams:{testId:n,orgId:t}}),l=XU({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 Yw({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?fg():u.id,u.type){case"MOBILE_PRESET_STEP":{let d=u.command;d.id=c?fg():d.id,"cache"in d&&d.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(ug({id:d.id,orgId:n.orgId,testId:n.testId,value:On.parse(d),moduleIdParents:o,moduleStepParents:i}))),delete d.cache),l.stepsToSave.push({...u,command:d});break}case"RESOLVED_MOBILE_MODULE":{let d=c?fg():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 Yw({...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({...Xy.parse(u),steps:Vt.array().parse(g),moduleId:p}));let f=Fa.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 Ts({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($w(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($w(l??{},c??{}));Object.keys(u).length>0&&(a.browserCache.memory=c,i.updatedAt=new Date,s=!0)}}return{result:i,changed:s}}function JU(r){let e={parentChain:[]};return Xw(r,e),e}function Xw(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),Xw({...r,steps:i.steps},e)&&o))return!0;e.parentChain.pop();continue}if(t(i,e)&&o)return!0}return!1}function QU(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 JU({steps:r,earlyStop:!0,onPreset:i,onModule:i}),{result:n,parentChain:o}}function Jw({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!!QU([r],t,i).result}function Qw(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 Zw({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 The}from"lodash-es";import Ahe from"truncate-json";import{v4 as Ohe}from"uuid";import{cloneDeep as dhe,unset as phe}from"lodash-es";import{cloneDeep as Uhe}from"lodash-es";import{diff as vfe}from"deep-object-diff";import{diff as tfe}from"deep-object-diff";import{cloneDeep as nfe}from"lodash-es";import{v4 as yfe}from"uuid";import{cloneDeep as Mfe}from"lodash-es";import{cloneDeep as Wfe}from"lodash-es";import{stringify as rSe}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 yg({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 vs({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 yg({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function au(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 ZU from"picomatch";var su=(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||ZU(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}},ki=r=>{try{return new URL(r),!0}catch{return!1}},eC=r=>!r.toLowerCase().startsWith("http"),Ui=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function _o(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 tC}from"uuid";function bg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var cu=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:bg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(Jy(e.type)){this.creditsUsedV2+=1;return}let t=Ip(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=Op(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:tC(),properties:bg({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:tC(),properties:bg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as USe}from"lodash-es";import{remote as tF}from"webdriverio";var rF=["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 nF(r,e){try{let t=await eF.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 oF(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:gl(e)}}}function iF(r){let e=gl(r);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function rC(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 aF(r){return r&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(r)||/^localhost:\d+$/.test(r))?r:null}function sF(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 lF(r){return{adbSerial:r,devices:await ht(["devices","-l"],{timeoutMs:2500}),state:r?await ht(["get-state"],{serial:r,timeoutMs:5e3}):void 0,bootCompleted:r?await ht(["shell","getprop","sys.boot_completed"],{serial:r,timeoutMs:5e3}):void 0}}async function cF({logger:r,adbSerial:e,adbSnapshot:t,appiumLogHints:n,transportMode:o}){let i=rC(t.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=o==="tunneled"?aF(e):void 0;if(r.warn({adbSerial:e,deviceState:i,appiumLogHints:n,transportMode:o},"Attempting best-effort recovery of Android transport"),o==="tunneled"&&s?(await ht(["start-server"],{timeoutMs:5e3}),await j(500),await ht(["disconnect",s],{timeoutMs:5e3}),await j(500),await ht(["connect",s],{timeoutMs:5e3}),await j(500)):(await ht(["kill-server"],{timeoutMs:5e3}),await j(500),await ht(["start-server"],{timeoutMs:5e3}),await j(500),await ht(["reconnect","offline"],{timeoutMs:5e3}),await j(500)),e){let c=await ht(["get-state"],{serial:e,timeoutMs:5e3});typeof c=="string"&&c.trim()==="device"&&(await ht(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await ht(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}))}}async function nC({logger:r,onStatusUpdate:e,wdOpts:t,appiumPort:n,appiumLogFile:o,appiumServerClose:i,startAppiumServer:a,adbSerial:s,transportMode:c}){let l=i,u=o;for(let d=1;d<=2;d++)try{return d>1&&e("Retrying Appium session creation..."),{driver:await tF(t),appiumLogFile:u,appiumServerClose:l}}catch(p){let m=await oF(n),g=await lF(s),h=await nF(u,64*1024),f=sF(h),E=rC(g.devices,s);if(r.error({err:p,appiumPort:n,appiumLogFile:u,appiumStatus:m,adbSnapshot:g,adbDeviceState:E,appiumLogHints:f,appiumLogTail:h},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${gl(p)}`),!(d===1&&(iF(p)||E==="offline"||f.instrumentationCrashed||f.deviceOffline)))throw w.error(`Failed to create Appium WebDriver session. Troubleshooting:
|
|
41
|
+
- ${rF.join(`
|
|
42
|
+
- `)}`),p;try{await cF({logger:r,adbSerial:s,adbSnapshot:g,appiumLogHints:f,transportMode:c})}catch(C){r.warn({err:C},"Android transport recovery failed")}try{await l()}catch(C){r.warn({err:C},"Failed to close Appium server after session start failure")}({close:l,logFile:u}=await a())}throw new Error("Failed to create Appium WebDriver session")}async function uu({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 sw({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)}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(E=>f.message.includes(E)))continue;n.warn({err:f},"Error running cleanup task")}},g=async()=>{if(a&&!a.connected)throw await m(),new Error("Client disconnected before Appium driver could be started, cleaning up...")};await g();try{let h=await hF({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 Error(`Failed to start Appium driver: ${h}`)}}async function hF({logger:r,driverLogLevel:e="warn",emulatorStart:t,appiumPort:n,emulatorCreationParams:o,onStatusUpdate:i,creationOpts:a}){let s=[],{adbPort:c,emulatorName:l}=o,u,d="tunneled";if(!c){d="local";let I=0;for(;I<10;){let k=5555+Math.floor(Math.random()*30);if(k%2!==0&&(k=Math.min(k+1,5584)),await sc(k)&&await sc(k+1)){u=k,c=k+1;break}I+=1}if(!c)throw new Error(`Failed to find an available ADB port after ${I} attempts`)}l||(l=`emulator-${u}`,i("Killing existing emulators..."),await iC(r),s.push(()=>iC(r)),i("Starting new emulator..."));let p=Date.now(),{close:m,logFile:g}=await oC({logger:r,logLevel:e,appiumPort:n}),h={platformName:"Android","appium:automationName":"UiAutomator2","appium:deviceName":"Android","appium:udid":`127.0.0.1:${c}`,"appium:adbExecTimeout":3e4,"appium:newCommandTimeout":3600,"appium:skipDeviceInitialization":!0,"appium:skipServerInstallation":!0,"appium:androidInstallTimeout":6e4,"appium:autoWebview":!1,"appium:autoWebviewTimeout":0,"appium:clearDeviceLogsOnStart":!0,"appium:ensureWebviewsHavePages":!0},f={hostname:"localhost",port:n,logLevel:e,capabilities:h,connectionRetryTimeout:15e3,connectionRetryCount:2};if("avdId"in o){h["appium:avd"]=o.avdId,h["appium:avdLaunchTimeout"]=18e4,h["appium:avdReadyTimeout"]=18e4,h["appium:skipDeviceInitialization"]=!1,h["appium:skipServerInstallation"]=!1,h["appium:udid"]=void 0;let I=fF();h["appium:avdArgs"]=`-port ${u} -memory ${I} -no-snapshot-save -no-boot-anim -noaudio`,f.connectionRetryTimeout=12e4,f.connectionRetryCount=3}let E="avdId"in o?l:`127.0.0.1:${c}`,b=Date.now(),{driver:C,appiumLogFile:R,appiumServerClose:v}=await nC({logger:r,onStatusUpdate:i,wdOpts:f,appiumPort:n,appiumLogFile:g,appiumServerClose:m,transportMode:d,startAppiumServer:async()=>await oC({logger:r,logLevel:e,appiumPort:n}),adbSerial:E});if(g=R,m=v,await C.updateSettings({enableMultiWindows:!0}),"avdId"in a){let I=a.apkFilePath?.trim();if(I){let k=gF.resolve(I);if(!dF.existsSync(k))throw new Error(`APK not found at path: ${k}`);i("Installing local APK...");let W=Date.now();try{await C.installApp(k),r.info({apkFilePath:k,installDurationMs:Date.now()-W},"Installed local APK")}catch(ie){throw r.error({err:ie,apkFilePath:k},"Failed to install local APK"),new Error(`Failed to install APK from ${k}: ${ie.message}`)}}}let M=new Map;return C.on("command",I=>{M.set(I.command,Date.now())}),C.on("result",I=>{let k=M.get(I.command);if(!k)return;let W=Date.now()-k;I.result instanceof Error?r.warn({err:I.result,command:I.command,args:I.body,durationMs:W},"Appium cmd failed"):W>1e4&&r.warn({command:I.command,args:I.body,durationMs:W},"Appium cmd took very long"),M.delete(I.command)}),r.info({timings:{emulatorDuration:p-t,appiumDuration:b-p,wdioDuration:Date.now()-b},capabilities:h,emulatorName:l},"Started Appium driver"),{driver:C,appiumClose:async()=>{await m(),await Promise.all(s.map(I=>I()))},appiumPort:n,appiumLogFile:g,emulatorName:l,adbPort:c}}async function oC({logger:r,logLevel:e,appiumPort:t}){let n=`${pF()}/appium-port-${Date.now()}.log`,o=await uF.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 iC(r){let n=(await ht(["devices"],{timeoutMs:5e3})??"").split(`
|
|
43
|
+
`).map(o=>o.trim().split(/\s+/)[0]).filter(o=>!!o?.startsWith("emulator-"));await Promise.all(n.map(async o=>{r.info({emulatorName:o},"Killing emulator");let i=await ht(["emu","kill"],{serial:o,timeoutMs:5e3});i&&r.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...")}))}function fF(){let r=Math.floor(mF()/1024/1024),e=Math.floor(r/4);return Math.max(2048,Math.min(8192,Math.floor(e/256)*256))}import aC from"crypto";import SF from"fs";async function du({tag:r,channel:e,filePath:t,apiClient:n,logger:o}){let i=await SF.promises.readFile(t),a=aC.createHash("md5").update(i).digest("base64"),s=aC.createHash("md5").update(i).digest("hex"),c=await n.generateAndroidAssetUrls({channel:e,tag:r??"latest",md5:a});if(c.md5&&(c.md5===a||c.md5===s)){o.info({channel:e,tag:r,md5:a,md5Hex:s},`Asset ${t} already exists on emulator platform`);return}if(c.uploadUrl){o.info({channel:e,tag:r,md5:a,uploadUrl:c.uploadUrl},`Uploading asset ${t} to emulator platform...`);try{let l=await fetch(c.uploadUrl,{headers:{"Content-Length":i.length.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:i});if(l.status!==200)throw new Error(`Got error response from emulator platform: ${l.status} ${await l.text()}`);o.info({channel:e,tag:r,md5:a},`Asset ${t} was uploaded successfully!`);return}catch(l){try{await n.deleteAndroidAsset(e,r??"latest")}catch(u){o.warn({err:u,tag:r,channel:e},"Failed to cleanup asset metadata for failed upload. Please contact Momentic support.")}throw o.error({err:l},"Failed to upload asset"),l}}throw new Error(`No upload URL was given for asset ${t}`)}import{execSync as sC}from"child_process";import{existsSync as yF}from"fs";import{platform as lC}from"os";import{dirname as bF,join as EF,resolve as TF}from"path";import{fileURLToPath as vF}from"url";var cC,AF=vF(import.meta.url),wF=bF(AF);cC=TF(wF,"..");var As=cC;w.info(`Setting APPIUM_HOME to ${As}`);process.env.APPIUM_HOME=As;var CF="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.",RF="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.",xF="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",uC="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",dC="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function MF(){if(!process.env.JAVA_HOME)w.warn("JAVA_HOME is not set. Some Appium drivers and Android tools may not work as expected.");else{process.platform==="darwin"&&/\.jdk\/?$/.test(process.env.JAVA_HOME)&&w.warn("JAVA_HOME appears to point at a *.jdk bundle, which is incorrect. The correct path should be formatted like '<bundle>/Contents/Home'.");let e=((t,n)=>EF(t,"bin",process.platform==="win32"?`${n}.exe`:n))(process.env.JAVA_HOME,"java");yF(e)||w.warn(`JAVA_HOME does not appear to point to a valid Java installation: expected the 'java' binary to exist at ${e}`)}try{sC("java --version",{stdio:"pipe",encoding:"utf-8"})||(w.error(`Could not find a Java installation. ${CF}`),process.exit(1))}catch(r){w.error(`Got error while checking if the Java JDK is installed: ${r}`),process.exit(1)}}function _F(){process.env.ANDROID_HOME||(w.error(`The ANDROID_HOME environment variable is not set. ${xF} ${lC()==="darwin"?uC:dC}`),process.exit(1))}function PF(){let r=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{sC(`${r} version`,{stdio:"pipe",encoding:"utf-8"})||(w.error(`Could not find the Android Debug Bridge (ADB) tool locally. This tool is included with Android Studio. ${RF} Finally, ensure that the 'adb' command is available in your shell. ${lC()==="darwin"?uC:dC}`),process.exit(1))}catch(e){w.error(`Got error while checking if ADB is installed: ${e}`),process.exit(1)}}function pC(){MF(),_F(),PF()}import{create as IF,windowedFiniteBatchScheduler as OF}from"@yornaath/batshit";import LF from"ws";var NF=100,DF=2500,mC=4e3,kF="\u2026";async function pu({driver:r,onLogs:e}){await r.execute("mobile: startLogsBroadcast");let t=IF({fetcher:async l=>{e(l)},resolver:()=>{},scheduler:OF({windowMs:DF,maxBatchSize:NF})}),{hostname:n="localhost",port:o=4723,protocol:i="http"}=r.options,s=`${i==="https"?"wss":"ws"}://${n}:${o}/ws/session/${r.sessionId}/appium/device/logcat`,c=new LF(s);return c.on("message",l=>{let u=l.toString().trim();u.length!==0&&(u.length>mC&&(u=u.slice(0,mC)+kF),t.fetch(u).catch(()=>{}))}),async()=>{try{c.close()}catch{}try{await r.execute("mobile: stopLogsBroadcast")}catch{}try{t.next()}catch{}}}import{Server as lG}from"socket.io";import IH from"path";import{randomUUID as qF}from"crypto";import{faker as UF}from"@faker-js/faker";import FF from"assert";import BF from"axios";import*as zF from"child_process";import HF from"moment";import*as GF from"otpauth";import VF from"pg";async function gC(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=zl(n,e);t.push(...o)}),t}function WF(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 jF(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 $F=Object.getPrototypeOf(async function(){}).constructor;async function hC(r,e,t){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(C,R)=>{o[C]=R,l[C]=R},d={},p=(C,R)=>{o[C]=R,d[C]=R},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 $F("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(BF,HF,c.fakerInstance??UF,FF,VF,m,g,GF,zF,gC,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,R=>c.sms.send(R),R=>c.sms.fetchLatest(R),c.email,c.sms,c.ai,WF(a,s),...Object.values(i??{}))),f=!0,E,b;try{let C=await z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});E=await jF(e.options.responseSerialization??"RAW",C)}catch(C){t.error({err:C,env:o,evalCode:n},`[${r}] Error executing code: ${C}`),f=!1,C instanceof Un?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=C instanceof Error?C.message:`${C}`}return{result:E,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function fC({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=Ln,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=qF(),p=await hC(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return w.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as KF,randomUUID as YF}from"crypto";import XF from"fetch-retry";var JF=XF(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}}),SC=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,yC=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function bC({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=Ln,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!SC)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!yC)throw new Error("Missing lambda auth secret.");let h=KF("sha256",yC).update(r).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let E={id:YF(),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(JF(SC,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(E)}),{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(b){m=b}}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=hb.parse(await p.json())}catch(E){throw new Error(`Code evaluation server returned invalid response: ${E}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Xr(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await bC(r);else if(r.localTools)e=await fC({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
|
|
44
44
|
${e.error}
|
|
45
45
|
Code received:
|
|
46
|
-
${r.code}`;throw r.logger.error({err:e.error,code:r.code,env:r.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,n]of Object.entries(e.variableUpdates))r.context.setVariable(t,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await r.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,n]of Object.entries(e.persistentVariableUpdates))r.context.setVariable(t,n)}return e.result}import{set as XF}from"lodash-es";async function Es(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=_n,allowUndefined:c=!1}=r,l=/{{(.*?)}}/g,u=t.matchAll(l),d=t;for(let m of u){if(m.length<2)continue;let p=m[1].trim(),g;try{g=await qr({orgId:e,code:p,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:r.localTools,signal:i})}catch(f){throw o.error({err:f,value:t},"Error evaluating template string"),f}if(g===void 0&&!c)throw new x("UserConfigurationError",`Template fragment '${p}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let h=typeof g=="string"?g:`${g}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(m[0],h)}return d}async function lu(r){return yC(r)}async function yC({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in r){if(e.includes(s))continue;let c=!1;if(t)if(t.includes(s))c=!0;else continue;let l=r[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await Es({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),r[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await yC({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function cu(r,e){for(let{path:t,original:n}of e)XF(r,t,n)}import JF from"fetch-retry";var Hbe=process.env.MAILINATOR_API_KEY,Gbe=JF(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import RH from"fetch-cookie";import xH from"path";import{CookieJar as MH}from"tough-cookie";var Sg={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
|
|
46
|
+
${r.code}`;throw r.logger.error({err:e.error,code:r.code,env:r.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,n]of Object.entries(e.variableUpdates))r.context.setVariable(t,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await r.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,n]of Object.entries(e.persistentVariableUpdates))r.context.setVariable(t,n)}return e.result}import{set as QF}from"lodash-es";async function ws(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=Ln,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 Xr({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 x("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 mu(r){return EC(r)}async function EC({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 ws({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 EC({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function gu(r,e){for(let{path:t,original:n}of e)QF(r,t,n)}import ZF from"fetch-retry";var Xbe=process.env.MAILINATOR_API_KEY,Jbe=ZF(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import MH from"fetch-cookie";import _H from"path";import{CookieJar as PH}from"tough-cookie";var Eg={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
|
|
47
47
|
var momenticConstants = {
|
|
48
48
|
bannedClassSubstrings: [
|
|
49
49
|
"relative",
|
|
@@ -4308,15 +4308,15 @@ function registerAllMomenticListeners() {
|
|
|
4308
4308
|
|
|
4309
4309
|
// src/html/index.ts
|
|
4310
4310
|
registerAllMomenticListeners();
|
|
4311
|
-
`};var
|
|
4311
|
+
`};var fr={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 TC="BoundingBoxMovedError",vC="ZeroOpacityError",hu="visual_actions",hn="data-momentic-id";function AC(r,e,t){if(r.length<t)return r;let n=r.indexOf(e);if(n===-1)return r;let o=Math.max(0,n-t/3),i=Math.min(n+t/3,r.length),a=r.indexOf(`
|
|
4312
4312
|
`,o);a>0&&a<n&&(o=a);let s=i,c=0;for(;c<1e3&&s>n&&r[s]!==`
|
|
4313
4313
|
`;)c++,s--;return s>n&&r[s]===`
|
|
4314
|
-
`&&(i=s),r.slice(o,i)}function
|
|
4315
|
-
`,""),t=t.replaceAll(" ","");let n=
|
|
4316
|
-
`,";").replace(/\s+/g," ");let a="",s=await
|
|
4317
|
-
${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let l=await e.boundingBox({timeout:re});l?l.height===0?c="The element you attempted to interact with has zero height.":l.width===0&&(c="The element you attempted to interact with has zero width."):c="The element you attempted to interact with has no bounding box."}catch{}return new x("ActionFailureError",`${c} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}})}return i.includes("element is outside of the viewport")?new x("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):r}function xB(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new x("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:r}});return r}import{execSync as NB}from"child_process";import $C from"dedent";import{existsSync as As,mkdirSync as Ug,readdirSync as DB,rmSync as qC}from"fs";import{homedir as YC}from"os";import{basename as kB,join as Vn,resolve as UB}from"path";import{chromium as KC}from"playwright-core";function GC(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:s}of r)(!s||s.matches({url:n.url(),method:n.method()}))&&(o[i]=a);await t.fallback({headers:o})}catch(o){e.warn({err:o},"Failed to apply custom headers to request, continuing")}}}import{randomUUID as _B}from"crypto";function VC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function WC(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c,isBrowserClosed:l}=r;await gu(i,n,void 0,!0);let u={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(h=>[h.name,h.value]),body:n.request.postData?.text}},d;if(t.fetchOriginalResponse){let h=await e.fetch();d={body:await h.text(),options:{status:h.status(),statusText:h.statusText(),headers:Object.entries(await h.headers())}}}let m=await MB(t,u,d),p={};m.headers.forEach((h,f)=>{p[f]=h});let g={body:await m.text(),contentType:m.headers.get("content-type")||"text/plain",headers:p,status:m.status};await e.fulfill(g);try{n.response={status:g.status,statusText:m.statusText,headers:Object.entries(g.headers).map(([h,f])=>({name:h,value:f})),cookies:[],content:{mimeType:g.contentType,text:g.body},_mocked:!0},o?.(a,n);for(let h of Object.values(s))h.matches(n)&&h.onRequestComplete(a,n)}catch(h){!h.message.includes("has been closed")&&!l&&c.warn({err:h},"Failed to add response to HAR")}}async function MB(r,e,t){try{return await r.generateResponse(e,t)}catch(n){let o=n instanceof Error?n.message:`${n}`;return new Response(o,{status:500,headers:{"Content-Type":"text/plain"}})}}async function Og(r){try{await PB(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function PB(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s,isBrowserClosed:c}=r,l=_B(),u=!1,d=await Ig(e,n);try{o?.(l,d);for(let p of Object.values(a))p.matches(d)&&(u=!0,p.onRequestStart(l,d))}catch(p){c()||i.warn({err:p},"Failed to add request to HAR")}let m=VC(n,s);m?await WC({logger:i,route:t,mock:m,entry:d,onHarEntry:o,request:n,requestId:l,requestRecorders:a,isBrowserClosed:c}):await IB({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:d,requestId:l,neverRedact:u,isBrowserClosed:c})}async function IB({route:r,request:e,onHarEntry:t,logger:n,requestRecorders:o,entry:i,requestId:a,neverRedact:s,isBrowserClosed:c}){await r.continue();try{let l=await e.response(),u;try{await l?.finished()}catch{}try{u=await e.sizes()}catch{}if(i&&await gu(e,i,u,s),!l||!i)return;await FC(i,e,l,u,s),t?.(a,i);for(let d of Object.values(o))d.matches(i)&&d.onRequestComplete(a,i)}catch(l){!l.message.includes("has been closed")&&!c()&&n.warn({err:l},"Failed to add response to HAR")}}async function OB(r){let e=r.postData();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:r.postDataJSON()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function LB(r){let e=await r.text();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:await r.json()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}function hu(r){return{request:{url:r.request.url,method:r.request.method,headers:r.request.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.request.postData?r.request.postData.mimeType.includes("json")?{json:JSON.parse(r.request.postData.text)}:{text:r.request.postData.text}:{}},response:r.response?{status:r.response.status,headers:r.response.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.response.content?r.response.content.mimeType?.includes("json")&&r.response.content.text?{json:JSON.parse(r.response.content.text)}:{text:r.response.content.text}:{}}:void 0}}async function Lg(r){let e=r.request(),t=r.status(),n=r.headers(),o=await LB(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await OB(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Gn=class{requestMatcher;constructor(e){this.requestMatcher=e}matches(e){let{url:t,method:n}=e;return this.requestMatcher.method&&this.requestMatcher.method.toLowerCase()!==n.toLowerCase()?!1:ru(t,this.requestMatcher.urlMatcher)}};function vs(r){let e=new URL(r.request().url());if(/^127\./.test(e.hostname)||/^192\.168\./.test(e.hostname)||/^10\./.test(e.hostname)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(e.hostname)||e.hostname==="localhost"||e.hostname==="0.0.0.0")return r.abort();if(e.hostname.startsWith("[")&&e.hostname.endsWith("]")){let t=e.hostname.slice(1,-1).toLowerCase();if(t==="::1"||t.startsWith("fe80:")||t.startsWith("fc")||t.startsWith("fd"))return r.abort()}return r.fallback()}import{homedir as Ng,platform as Dg}from"os";import{join as kg}from"path";function fu(){let r=[];if(Dg()==="linux"){let e=Ng();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(kg(e,".config",t,"Crash Reports"))})}else if(Dg()==="darwin"){let e=Ng();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(kg(e,"Library","Application Support",t,"Crashpad"))})}else if(Dg()==="win32"){let e=Ng();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(kg(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function jC(){return[{name:"fs_optout",value:"1",domain:".fullstory.com",path:"/",expires:Date.now()/1e3+365*24*60*60,httpOnly:!1,secure:!0,sameSite:"None"}]}var Fg=Vn(YC(),"momentic","chromium"),FB=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],BB=["--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],zB=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-webgl2","--disable-audio-input","--disable-audio-output"];async function XC({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,iconKnowledgeBase:a,callbacks:s,videoOptions:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let l;switch(o.browserType){case"Google Chrome":l="chrome";break;case"Chrome for Testing":l=void 0;break;case"Chromium":l="chromium";break;default:l="chromium";break}let u=[...BB];!wr&&GB()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},m={...i??{},geolocation:i?.geolocation||fl,locale:i?.locale||QS,timezoneId:i?.timezoneId||ZS,colorScheme:i?.colorScheme,httpCredentials:o.basicAuthorization?{username:o.basicAuthorization.username??"",password:o.basicAuthorization.password??""}:void 0,javaScriptEnabled:o.disableJavaScript?!1:void 0,ignoreHTTPSErrors:o.ignoreHttpsErrors??!1,userAgent:o.userAgent??mu,viewport:i?.viewport??Rn,serviceWorkers:"block",storageState:{cookies:[...jC()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(m.storageState.origins=Object.entries(o.initialLocalStorage).map(([b,C])=>({origin:b,localStorage:Object.entries(C).map(([R,v])=>({name:R,value:v}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let p=null,g,h,f={systemDevicePixelRatio:i?.deviceScaleFactor,isNewHeadless:!1};(l==="chrome"||l==="chromium")&&(f.isNewHeadless=!0,d.headless&&u.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&u.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`);try{let b=fu();b.forEach(C=>{if(!As(C))return;["new","pending","completed"].forEach(v=>{let M=Vn(C,v);if(!As(M))return;let A=DB(M);for(let I=0;I<A.length;I++){let k=Vn(M,A[I]);qC(k,{force:!0})}})}),b.forEach(C=>{As(C)||Ug(C,{recursive:!0});let R=Vn(C,`write-test-${Date.now()}`);Ug(R,{recursive:!0}),qC(R,{recursive:!0,force:!0})}),u.push(...FB)}catch(b){e.warn({err:b},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...zB);let E=o.localChromeExtensionPaths?.map(b=>b.startsWith("~")?Vn(YC(),b.slice(1)):b);if(E?.length){if(l===void 0)throw new x("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of E){let M=Vn(v,"manifest.json");if(!As(M))throw new x("UserConfigurationError",`Chrome extension path ${M} does not exist.`)}if(wr)throw new x("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let b=Vn(Fg,`momentic-session-${Date.now()}`);if(!As(b))try{Ug(b,{recursive:!0})}catch(v){throw new x("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Fg} folder: ${v}`)}let C=[...u],R=E.map(v=>UB(v)).join(",");C.push(`--disable-extensions-except=${R}`),m?.deviceScaleFactor&&C.push(`--force-device-scale-factor=${m.deviceScaleFactor}`,`--device-scale-factor=${m.deviceScaleFactor}`),m.viewport&&C.push(`--window-size=${m.viewport.width},${m.viewport.height}`),g=await KC.launchPersistentContext(Vn(Fg,`momentic-session-${Date.now()}`),{...d,...m,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:C,baseURL:r}),e.info({sharedContextOptions:m,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:C,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),h=g.pages()[0]}else{p=await KC.launch({...d,args:u});let b={...m,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};g=await p.newContext(b),e.info({contextArgs:b,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),h=await g.newPage()}if(c){let b=await h.video()?.path();if(b){let C=kB(b);c.onVideoPageChange({videoName:C})}}wr&&await g.route("**",vs);try{let b=p?.version();e.info({browserVersion:b},"Got browser version")}catch(b){e.warn({err:b},"Could not get browser version string")}return{browser:p,context:g,page:h,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:m.viewport||Rn,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function HB(){if(process.platform!=="linux")return null;try{let e=NB("df -k /dev/shm",{encoding:"utf8"}).trim().split(/\r?\n/),n=e[e.length-1]?.trim().split(/\s+/)??[];if(!n||n.length<2)return null;let o=parseInt(n[1],10);return Number.isNaN(o)||o<=0?null:o/1024}catch{return null}}function GB(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=HB();return t==null?!1:t<128}function Bg(r,e=!1){let t=$C`window._MOMENTIC_BROWSER = true;
|
|
4314
|
+
`&&(i=s),r.slice(o,i)}function Mr(r){let e=typeof r=="string"?r:r.toString();return`[${hn}="${e}"]`}import{execSync as Kz}from"child_process";import{randomUUID as rh}from"crypto";import{diff as nh}from"deep-object-diff";import{existsSync as Mu,readFileSync as Yz,readdirSync as Xz,statSync as zR,writeFileSync as Jz}from"fs";import{Jimp as HR}from"jimp";import Qz from"js-beautify";import{cloneDeep as Hi}from"lodash-es";import Zz from"mime";import{platform as e1}from"os";import{basename as GR,extname as t1,join as r1}from"path";import{v4 as n1}from"uuid";import{rmSync as aR}from"fs";import{basename as YB,join as XB}from"path";import{errors as JB}from"playwright-core";import{devices as tB}from"playwright-core";var wC=2,Fi=8e3;var Po=250,dt=500;var CC=5e3,RC=250,ne=3e3,Te=2e3,oe=1e3,Tg=3e4,fu=8e3,xC=10,vg=.05;var MC=new Set(["about:blank","chrome-error://chromewebdata/"]);var Ag=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],wg=1e4,Cs=500,Su=tB["Desktop Chrome"].userAgent,_C=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as rB,rmSync as PC,statSync as nB}from"fs";import*as Mg from"node:fs";import oB from"nodejs-file-downloader";import{tmpdir as iB}from"os";import Wn,{basename as aB,dirname as sB}from"path";var _g="file://",xg=Wn.join(iB(),"momentic","downloads"),Rg=1e4,lB=50*1024*1024;async function IC(r){let{uri:e}=r;if(e.startsWith(_g))return uB(r);if(e.startsWith("http"))return pB(r);if(_b)return dB(r);throw new x("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function cB(r,e){let t=Wn.join(xg,r,e.slice(_g.length)),n=Wn.join(xg,r),o=t.startsWith(n);if(!Mg.existsSync(t)||!o)throw new x("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function uB({uri:r,orgId:e}){let t=cB(e,r);return{filePath:t,cleanup:()=>{PC(sB(t),{recursive:!0,force:!0})}}}async function dB({uri:r}){let e=Wn.resolve(r);if(!Mg.existsSync(e))throw new x("UserConfigurationError",`The referenced file (${r}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function pB({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=aB(n.href),i=Ig(o),a=Wn.extname(i);if(Ab.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=Pg(t),c,l;for(let g=1;g<=3;g++){let h=new oB({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:Rg});try{let{downloadStatus:f,filePath:E}=await z(h.download(),{milliseconds:Rg,message:`Download timed out after ${Rg}ms`});if(f!=="COMPLETE"||!E)throw new Error(`Download ended in non-success status: ${f}`);c=E;break}catch(f){l=f}}if(!c)throw new Error(`Download failed after 3 attempts. Last error: ${l instanceof Error?l.message:l}`);let u=c,p=nB(u).size;if(p>lB)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(()=>PC(s,{recursive:!0,force:!0}),10*60*1e3)}}}function OC(r,e){return`${_g}${r}/${e}`}function Pg(r){let e=Math.random().toString(36).substring(4),t=Wn.join(xg,r,e);return rB(t,{recursive:!0}),t}function Ig(r){let e=Wn.extname(r),t=Wn.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function _r(r,e,t){try{return await r.evaluate((o,{truncateToLength:i})=>window.serializeElementOnlyWithText?.(o,{truncateToLength:i}),{truncateToLength:t},{timeout:oe})}catch(n){e.debug({err:n},"Failed to get HTML from locator for Playwright error translation");return}}var jn=3.1783027;function mB(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(Og(r)/jn)}function Og(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
|
|
4315
|
+
`,""),t=t.replaceAll(" ","");let n=mB(t);return t.length-n+jn*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+=Og(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*jn:e+=85*jn:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*jn:e+=Og(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 yu=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 LC(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:ne});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function NC(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:ne})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function DC(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:ne})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function kC(r,e,t,n,o){try{await gB(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function gB(r,e,t,n){let o=n.text();o.length>Cs&&(o=o.slice(0,Cs)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let s=await a.jsonValue(),c=JSON.stringify(s);c.length>Cs?i.push(c.slice(0,Cs)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}Lg(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function Lg(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>wg&&(i[t]=i[t].slice(Math.floor(wg/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 Sr({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await yg({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import hB from"truncate-json";var fB="[redacted due to size]",SB=5e3,yB=1e6,FC=1e3;function BC(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 Ng(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([s,c])=>({name:s,value:c})),i={...await HC(e),url:n.toString(),method:e.method(),queryString:o};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:GC(t).timings}}async function zC(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 CB({response:t,mimeType:s,sizes:n,neverRedact:o})}catch{}let c={...await HC(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}=GC(l);r.time=d,r.timings=u}function UC(r){try{return new Date(r).toISOString()}catch{return}}function bB(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=Jr(i,!1),e.value=Jr(a,!1);continue}i==="Domain"&&(e.domain=Jr(a,!1)),i==="Expires"&&(e.expires=UC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=UC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=Jr(a,!1)),i==="Secure"&&(e.secure=!0)}return e}async function HC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(bB)??[];return{headers:Object.entries(e).map(([n,o])=>({name:Jr(n,!1),value:Jr(o,!1)})),cookies:t}}async function bu(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>FC){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:Jr(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:Jr(c,n),value:l?Jr(l,n):void 0})}e.request.postData=a}var EB=["image","font","video","audio"],TB=["javascript"],vB=["text"],AB=["json","xml","html"];function wB(r){let[e,t]=r.split("/");return e&&EB.includes(e)||t&&TB.some(n=>t.includes(n))?!1:!!(e&&vB.includes(e)||t&&AB.some(n=>t.includes(n)))}async function CB({response:r,mimeType:e,sizes:t,neverRedact:n}){let o={mimeType:e,encoding:await r.headerValue("content-encoding")??void 0};return!n&&(!e||!wB(e))?o._redactedReason="Body redacted because it's not a viewable MIME type":!n&&t.responseBodySize>=FC?o._redactedReason="Response body redacted due to size":o.text=Jr(await r.text(),n),o}function Jr(r,e){let t=e?yB:SB;try{let n=JSON.parse(r),{jsonString:o}=hB(r,t);return o}catch{return r.length>t?r.slice(0,t)+fB:r}}function Io(r){return r<0?0:r}function GC(r){return{timings:{blocked:Io(r.domainLookupStart),dns:Io(r.domainLookupEnd-r.domainLookupStart),connect:Io(r.connectEnd-r.connectStart),send:Io(r.responseStart-r.requestStart),wait:0,receive:Io(r.responseEnd-r.responseStart),ssl:Io(r.connectEnd-r.secureConnectionStart)},total:Io(r.responseEnd)}}function VC(){return async r=>{let{fragment:e,code:t,context:n}=r,{env:o}=n||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function st({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await z(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}import{errors as RB}from"playwright-core";async function Oo({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 RB.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await xB(c,i.locator,n,t);else throw c}throw s instanceof x?s:new x("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function xB(r,e,t,n){return r.message.includes("attempt #")?MB(r,e,t,n):_B(r)}async function MB(r,e,t,n){let o=r.message.split(/- retrying \w+ action, attempt #\d+/).filter(c=>c.length>0);if(!o.length)return n.warn({err:r},"Failed to parse Playwright error message for translation, returning raw message"),r;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
|
|
4316
|
+
`,";").replace(/\s+/g," ");let a="",s=await _r(e,n,150);if(s&&(a=`Target element HTML: ${ft(s,100,!0)}`),i.includes("element is not enabled"))return new x("ActionFailureError",`The element you attempted to interact with was disabled for the entire timeout duration. Please explicitly wait for the element to be enabled, change the element description to target an interactive element, or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}});if(i.includes("intercepts pointer events")){let c="",l=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(l){let u=(await t.state.getRoot()).locator(Mr(l)),d=await _r(u,n,150);d&&(c=`Covering element HTML: ${ft(d,100,!0)}`)}return new x("ActionFailureError",`The element you attempted to interact with was covered by another element such as dropdown, popup, or dialog for the entire timeout duration. Please add a step to hide the covering element or turn on the 'disable stability checks' option. ${a}
|
|
4317
|
+
${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let l=await e.boundingBox({timeout:ne});l?l.height===0?c="The element you attempted to interact with has zero height.":l.width===0&&(c="The element you attempted to interact with has zero width."):c="The element you attempted to interact with has no bounding box."}catch{}return new x("ActionFailureError",`${c} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}})}return i.includes("element is outside of the viewport")?new x("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):r}function _B(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new x("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:r}});return r}import{execSync as kB}from"child_process";import KC from"dedent";import{existsSync as xs,mkdirSync as zg,readdirSync as UB,rmSync as YC}from"fs";import{homedir as JC}from"os";import{basename as FB,join as qn,resolve as BB}from"path";import{chromium as XC}from"playwright-core";function WC(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 IB}from"crypto";function jC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function $C(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c,isBrowserClosed:l}=r;await bu(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 PB(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 PB(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 Dg(r){try{await OB(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function OB(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s,isBrowserClosed:c}=r,l=IB(),u=!1,d=await Ng(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=jC(n,s);p?await $C({logger:i,route:t,mock:p,entry:d,onHarEntry:o,request:n,requestId:l,requestRecorders:a,isBrowserClosed:c}):await LB({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:d,requestId:l,neverRedact:u,isBrowserClosed:c})}async function LB({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 bu(e,i,u,s),!l||!i)return;await zC(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 NB(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 DB(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 Eu(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 kg(r){let e=r.request(),t=r.status(),n=r.headers(),o=await DB(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await NB(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var $n=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:su(t,this.requestMatcher.urlMatcher)}};function Rs(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 Ug,platform as Fg}from"os";import{join as Bg}from"path";function Tu(){let r=[];if(Fg()==="linux"){let e=Ug();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(Bg(e,".config",t,"Crash Reports"))})}else if(Fg()==="darwin"){let e=Ug();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(Bg(e,"Library","Application Support",t,"Crashpad"))})}else if(Fg()==="win32"){let e=Ug();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(Bg(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function qC(){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 Hg=qn(JC(),"momentic","chromium"),zB=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],HB=["--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"],GB=["--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 QC({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=[...HB];!Rr&&WB()&&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||El,locale:i?.locale||QS,timezoneId:i?.timezoneId||ZS,colorScheme:i?.colorScheme,httpCredentials:o.basicAuthorization?{username:o.basicAuthorization.username??"",password:o.basicAuthorization.password??""}:void 0,javaScriptEnabled:o.disableJavaScript?!1:void 0,ignoreHTTPSErrors:o.ignoreHttpsErrors??!1,userAgent:o.userAgent??Su,viewport:i?.viewport??Pn,serviceWorkers:"block",storageState:{cookies:[...qC()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(p.storageState.origins=Object.entries(o.initialLocalStorage).map(([b,C])=>({origin:b,localStorage:Object.entries(C).map(([R,v])=>({name:R,value:v}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let 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 b=Tu();b.forEach(C=>{if(!xs(C))return;["new","pending","completed"].forEach(v=>{let M=qn(C,v);if(!xs(M))return;let A=UB(M);for(let I=0;I<A.length;I++){let k=qn(M,A[I]);YC(k,{force:!0})}})}),b.forEach(C=>{xs(C)||zg(C,{recursive:!0});let R=qn(C,`write-test-${Date.now()}`);zg(R,{recursive:!0}),YC(R,{recursive:!0,force:!0})}),u.push(...zB)}catch(b){e.warn({err:b},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...GB);let E=o.localChromeExtensionPaths?.map(b=>b.startsWith("~")?qn(JC(),b.slice(1)):b);if(E?.length){if(l===void 0)throw new x("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of E){let M=qn(v,"manifest.json");if(!xs(M))throw new x("UserConfigurationError",`Chrome extension path ${M} does not exist.`)}if(Rr)throw new x("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let b=qn(Hg,`momentic-session-${Date.now()}`);if(!xs(b))try{zg(b,{recursive:!0})}catch(v){throw new x("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Hg} folder: ${v}`)}let C=[...u],R=E.map(v=>BB(v)).join(",");C.push(`--disable-extensions-except=${R}`),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 XC.launchPersistentContext(qn(Hg,`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 XC.launch({...d,args:u});let b={...p,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};g=await m.newContext(b),e.info({contextArgs:b,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),h=await g.newPage()}if(c){let b=await h.video()?.path();if(b){let C=FB(b);c.onVideoPageChange({videoName:C})}}Rr&&await g.route("**",Rs);try{let b=m?.version();e.info({browserVersion:b},"Got browser version")}catch(b){e.warn({err:b},"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||Pn,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function VB(){if(process.platform!=="linux")return null;try{let e=kB("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 WB(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=VB();return t==null?!1:t<128}function Gg(r,e=!1){let t=KC`window._MOMENTIC_BROWSER = true;
|
|
4318
4318
|
window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(r)};
|
|
4319
|
-
window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`;return e&&(t
|
|
4319
|
+
window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`;return e&&(t+=KC`
|
|
4320
4320
|
window._fs_namespace = window._fs_namespace || 'FS';
|
|
4321
4321
|
function FSNoop() {}
|
|
4322
4322
|
FSNoop.q = [];
|
|
@@ -4325,33 +4325,33 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
|
|
|
4325
4325
|
writable: false,
|
|
4326
4326
|
configurable: false,
|
|
4327
4327
|
});`),`${t}
|
|
4328
|
-
//# sourceURL=momentic-injected/extra-scripts.js`}function zg(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var VB=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],WB=["local-network-access"];function JC(r){return wr?r.filter(e=>!WB.includes(e)):r}function QC(r){return JC(r||VB)}async function ZC(r){try{return await jB(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function jB({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:ne}),o=await xr(r,e,500),i=await r.boundingBox({timeout:ne});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5||n!=="input")return;if(t)try{let c=r.page().locator(`label[for=${JSON.stringify(t)}]`);return await c.waitFor({state:"visible",timeout:ne}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let l=window,u=c.parentElement;if(!u)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.getBoundingClientRect(),m=u.getBoundingClientRect();if(m.width===0||m.height===0)return{type:"error",error:"Parent element has no width or height"};let p={x:Math.min(Math.max(1,d.left-m.left),m.width-1),y:Math.min(Math.max(1,d.top-m.top),m.height-1)},g=l._MOMENTIC_FEATURE_FLAGS?.[uu],h=c.getAttribute(mn),f=!g&&h?Rr(h):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:p,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:ne});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:ne}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var tR=["date","datetime-local","month","time","week"],eR={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function rR(r){try{await z($B(r),{milliseconds:re})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function $B({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await st({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:ne,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!eR[i])return;eR[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as $t}from"zod";var nR=$t.object({doubleClick:$t.boolean().optional(),rightClick:$t.boolean().optional(),force:$t.boolean().optional(),waitForDownload:$t.boolean().optional(),delayMs:$t.number().optional(),downloadTimeoutMs:$t.number().optional(),relativePosition:$t.object({x:$t.number(),y:$t.number()}).optional()}),uve=$t.object({repeat:$t.number().optional(),convertMeta:$t.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:$t.number().optional()});async function Su({locator:r,callbacks:e,logger:t,timeoutMs:n=ne}){try{await Hg(e,n);let o=r.evaluate(i=>{let a=window;a.momenticIsEligible=d=>{let p=window.getComputedStyle(d,null).getPropertyValue("display");if(p==="none"||p==="contents")return!1;let g=d.getBoundingClientRect();return!(!g.height||!g.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let c=i.style.getPropertyValue("outline"),l=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let u=`momentic${Math.floor(Math.random()*1e7)}`;a[u]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",c,l),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[u](),a.removeHighlightFunctions?.[u]&&delete a.removeHighlightFunctions[u]},5e3)),a.removeHighlightFunctions[u]=a[u]},void 0,{timeout:n});return await z(o,{milliseconds:n}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Hg(r,e=ne){let t=await r.state.getRoot();await st({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:r.waitForPageLoad,codePath:"removing element highlights"})}async function Gg(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Mo({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>iR({...r,targetingResult:t,useVisualClick:e})})}async function XB(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await JB(r,e)}catch(n){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:n,originalError:r},"Error handling click error, rethrowing original error"),r):n}}async function JB(r,e){let{logger:t,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(r.message.includes("label")&&r.message.includes("for=")&&r.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:ne});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:ne}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),iR({...e,targetingResult:{locator:a},redirectionAttempts:n+1})}else throw t.error({err:r},"Click error does not match any known recoverable patterns, rethrowing"),r}async function QB(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=nR.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await tz({targetingResult:t,position:n,options:o,logger:e,isAndroid:r.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function ZB(r){let{actionSource:e,targetingResult:t,options:n,logger:o}=r,i=r.targetingResult.locator,a=n?.relativePosition??r.position;if(e==="click"&&!a){let l=await ZC({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=n?.force||t.hints?.force||!1;s&&!a&&t.hints?.relativeXYToLocator&&(a=t.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:re,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:re,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(nz(u))o.warn({err:u},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:u},"Error clicking on locator, attempting to recover..."),XB(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function iR(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??yg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof YB.TimeoutError?new x("ActionFailureError",`Download did not complete in ${u}ms`):new x("ActionFailureError",`Download failed: ${d.message}`)}})());try{await Su({locator:a.locator,callbacks:n,logger:t,timeoutMs:ne})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await QB(r):l=(await ZB(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new x("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let u=await z(s,{milliseconds:e.downloadTimeoutMs??yg});if(u instanceof Error)throw u;return{downloadedFile:await rz(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function ez(r,e){let t=await r.locator.boundingBox({timeout:re});if(!t){let i=await xr(r.locator,e,500);throw new x("ActionFailureError",`${Fd}${i?`: ${i}`:""}`)}if(r.hints?.relativeXYToLocator){let i=t.x+r.hints.relativeXYToLocator.x,a=t.y+r.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function tz({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:re}),d=r.relativePosition.x,m=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(m=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+m,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:re});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await ez(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=r?.rightClick?"right":"left",l=r?.delayMs??25;return r?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l}),{clickX:o,clickY:i,reason:a}}async function rz(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=Mg(r.suggestedFilename()),i=e();await r.saveAs(KB(i,o)),oR(n,{force:!0}),setTimeout(()=>{oR(i,{recursive:!0,force:!0})},5*60*1e3);let a=PC(qB(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function nz(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as oz}from"os";var iz={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function az(){let r=oz();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function aR(r){return JSON.stringify(r.split("+").sort())}function yu(r,e){let t=az(),n=aR(r);for(let o of Object.values(iz))if(Object.values(o).some(i=>aR(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function Vg({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!t&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await st({root:r,fn:([d,m,p,g])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*p,window.scrollY+(m??window.innerHeight)*g),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"scrolling page"});else{let d=e.viewportSize()||Rn,m=await st({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"computing page height"}),[p,g,h]=await st({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let E=f.getBoundingClientRect();return[f.scrollTop,E.x,E.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<Ee;){a?.throwIfAborted();let E=await z(e.evaluate(()=>document.body.scrollHeight),{milliseconds:ne}),[b,C,R]=await z(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let M=v.getBoundingClientRect();return[v.scrollTop,M.x,M.y]}),{milliseconds:ne});if(E===m&&b===p&&C===g&&R===h)break;m=E,p=b,g=C,h=R,await j(dt)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Wg(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await j(dt)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function sR(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,delayMs:s}=r;if(a){await sz(e,t,n,o,s,i);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(t+i.x,n+i.y,{steps:o}),await j(s??Ro),await e.mouse.up()}async function lR(r,e,t,n){await r.mouse.move(e.x,e.y,{steps:3}),await r.mouse.down(),await r.mouse.move(t.x,t.y,{steps:3}),await j(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,du):500),await r.mouse.up()}async function sz(r,e,t,n,o,i){let a=Math.max(1,n??1),s=i.x,c=i.y,l=i.x+e,u=i.y+t;await r.evaluate(async({startX:d,startY:m,endX:p,endY:g,stepCount:h,delayMs:f})=>{let E=document.elementFromPoint(d,m)??document.body??document.documentElement,C=window._momenticMobileUtilities.dispatchTouch;C(E,"touchstart",d,m);for(let R=1;R<=h;R+=1){let v=d+(p-d)*R/h,M=m+(g-m)*R/h;C(E,"touchmove",v,M),await new Promise(A=>setTimeout(A,Math.floor((f??500)/h)))}C(E,"touchend",p,g)},{startX:s,startY:c,endX:l,endY:u,stepCount:a,delayMs:o})}import{randomUUID as hz}from"crypto";import{cloneDeep as qg}from"lodash-es";function Wn(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as lz}from"crypto";var cz="v1";function jg(r,e){if(r.tagName.toLowerCase()==="svg"&&!dz(r))try{let t=cR(r,e),n=uz(JSON.stringify(t));return{version:cz,json:t,hash:n}}catch{return}}function uz(r){return lz("md5").update(r).digest("hex")}function cR(r,e){let t=r.tagName.toLowerCase(),n=mz(r);if(t==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:n,children:[]};for(let i of r.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=cR(a,e);s&&o.children.push(s)}}return o}function dz(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function mz(r){let e={},t=r.attributes;for(let n of Object.keys(t))hr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var _o={r:147,g:196,b:125,a:.55},dR={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:_o,paddingColor:_o,borderColor:_o,marginColor:_o,eventTargetColor:_o,shapeColor:_o,shapeMarginColor:_o,showInfo:!0,showAccessibilityInfo:!0};function mR({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=pz({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function pz({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=r[o],l=c.layout,u={};l.nodeIndex.forEach((A,I)=>{u[A]=I});let d=l.styles,m=l.bounds??[],p=c.nodes,g=p.contentDocumentIndex??{index:[],value:[]},h=p.backendNodeId??[],f=p.attributes??[],E=p.parentIndex??[],b=p.nodeName??[],C=p.nodeType??[],R=p.pseudoType??{index:[],value:[]},v=p.inputChecked??{index:[]},M=e[c.frameId];for(let A=0;A<h.length;A++){let I=h[A],k=C[A],W=f[A]??[],oe=E[A]!==void 0&&E[A]>=0?E[A]:void 0,Te=oe!==void 0?h[oe]:void 0,At=Te!==void 0?a[Te]:void 0,G=R.index.indexOf(A),$=G!==-1?e[R.value[G]]:void 0,he=u[A],se;he?se=m[he]??[]:se=[];let Ce=b[A]!==void 0?e[b[A]]?.toLowerCase():void 0;if(!Ce){s.warn({backendNodeId:I,frameId:M,frameIndex:o,nodeBounds:se},"DOM node has no tag name");continue}let Me={backendNodeId:I,psuedoType:$,nodeType:k,frameIndex:o,parentFrameId:M,ownedFrameId:void 0,bounds:{x:se[0]??null,y:se[1]??null,width:se[2]??null,height:se[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:Te??null,tagName:Ce,parent:At??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};At&&At.childrenBackendIds.push(I);let Jt=g.index.indexOf(A);if(Jt!==-1){let _e=g.value[Jt];i[_e]=Me;let $e=r[_e]?.frameId;Me.ownedFrameId=$e!==void 0?e[$e]:void 0}for(let _e of Object.keys(Me.bounds)){let $e=_e;Me.bounds[$e]!==null&&(Me.bounds[$e]/=n)}let qt=he!==void 0?d[he]??[]:[];for(let _e=0;_e<qt.length&&!(_e>=t.length);_e++){let $e=qt[_e];if($e===void 0||isNaN($e))continue;let lt=e[$e];if(lt===void 0)continue;let Pt=t[_e];Me.computedStyles[Pt]=lt}for(let _e=0;_e<W.length;_e+=2){let $e=W[_e],lt=W[_e+1];if(!$e||!lt)continue;let Pt=e[$e],Gt=e[lt];!Pt||!Gt||(Me.attributes[Pt]=Gt)}v.index.includes(A)&&(Me.attributes.checked="true"),a[Me.backendNodeId]=Me}return a[h[0]]}function $g(r,e){if(r.mPathSelector)return r.mPathSelector;let t=r.parent,n;if(!t)n=r.tagName;else if(r.tagName==="body")n="body";else{let i=t.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(r.backendNodeId),a=` > ${r.tagName}:nth-child(${i+1})`;n=`${$g(t,e)}${a}`}return r.mPathSelector=n,n}function uR(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var gz=["html","#document","#document-fragment"];function pR({node:r,domGraph:e}){let t=[],n=r,o=uR(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=uR(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,gz.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],m=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else m?.nodeType===1&&!m.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function gR(r,e){let t=r.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(n.length&&(t=t.locator(n.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function hR(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Ee});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Ee}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Ee})).attributes,i=Wn(o,mn);if(!i)throw new Error(`Could not find attribute ${mn} for object ${e}`);return i}var fz=["focusable","keyshortcuts","controls","live","relevant","orientation"],Sz=["selected","readonly","modal","required","invalid"],yz=["id","name","role","content"],fR=["absolute","fixed","sticky"],bz=["i","label"],Ez=["path"],Tz=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],bR=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],ER=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],vz=["menulistpopup","statictext","inlinetextbox"],Az=80,SR=100,TR=50,Xg=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],wz=["cite"],Cz={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},Rz={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},yR={indentLevel:0},Kg=class r{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&t.length<TR?t:""),this.role=this.role||(e.domNode.attributes.role??""),Pz(this.properties,e.domNode,e.importantProperties)}Oz(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&Ez.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>ER.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>RR(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>xR(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&bz.includes(this.domNode.tagName)||Tz.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||hr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>CR(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}serialize(e=yR){let t=Object.assign({},yR,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=qg(this.properties),u=" ".repeat(n),d=this.role||"",m=this.tagName??"unknown",p=this.name;d==="heading"&&p==="heading"&&(p=""),this.nameSources?.find(v=>!v.superseded&&v.type==="contents")&&this.children.length>0&&(p="");let h=this.nameSources?.find(v=>!v.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let v=h.attributeValue?.relatedNodes??[];v.length===1&&v[0].text&&v[0].text===p&&(p="")}let f=Xg.includes(this.role)||wz.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${p}
|
|
4329
|
-
`;let E=`${u}<${
|
|
4330
|
-
`;else{let v="";for(let A of this.children)v+=A.serialize({...e,indentLevel:n+2,neighbors:0});let M=v.trim();M.length<=
|
|
4331
|
-
`)?E+=`>${M}</${
|
|
4328
|
+
//# sourceURL=momentic-injected/extra-scripts.js`}function Vg(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var jB=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],$B=["local-network-access"];function ZC(r){return Rr?r.filter(e=>!$B.includes(e)):r}function eR(r){return ZC(r||jB)}async function tR(r){try{return await qB(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function qB({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:oe}),o=await _r(r,e,500),i=await r.boundingBox({timeout:oe});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:oe}),{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?.[hu],h=c.getAttribute(hn),f=!g&&h?Mr(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:oe});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:oe}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var nR=["date","datetime-local","month","time","week"],rR={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 oR(r){try{await z(KB(r),{milliseconds:ne})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function KB({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await st({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:oe,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!rR[i])return;rR[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as $t}from"zod";var iR=$t.object({doubleClick:$t.boolean().optional(),rightClick:$t.boolean().optional(),force:$t.boolean().optional(),waitForDownload:$t.boolean().optional(),delayMs:$t.number().optional(),downloadTimeoutMs:$t.number().optional(),relativePosition:$t.object({x:$t.number(),y:$t.number()}).optional()}),bve=$t.object({repeat:$t.number().optional(),convertMeta:$t.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:$t.number().optional()});async function vu({locator:r,callbacks:e,logger:t,timeoutMs:n=oe}){try{await Wg(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 Wg(r,e=oe){let t=await r.state.getRoot();await st({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:r.waitForPageLoad,codePath:"removing element highlights"})}async function jg(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Oo({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>sR({...r,targetingResult:t,useVisualClick:e})})}async function QB(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await ZB(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 ZB(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:oe});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:oe}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),sR({...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 ez(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=iR.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await nz({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 tz(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 tR({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:ne,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:ne,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(iz(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..."),QB(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function sR(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??Tg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof JB.TimeoutError?new x("ActionFailureError",`Download did not complete in ${u}ms`):new x("ActionFailureError",`Download failed: ${d.message}`)}})());try{await vu({locator:a.locator,callbacks:n,logger:t,timeoutMs:oe})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await ez(r):l=(await tz(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new x("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let u=await z(s,{milliseconds:e.downloadTimeoutMs??Tg});if(u instanceof Error)throw u;return{downloadedFile:await oz(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 rz(r,e){let t=await r.locator.boundingBox({timeout:ne});if(!t){let i=await _r(r.locator,e,500);throw new x("ActionFailureError",`${Gd}${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 nz({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:ne}),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:ne});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await rz(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 oz(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=Ig(r.suggestedFilename()),i=e();await r.saveAs(XB(i,o)),aR(n,{force:!0}),setTimeout(()=>{aR(i,{recursive:!0,force:!0})},5*60*1e3);let a=OC(YB(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function iz(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as az}from"os";var sz={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 lz(){let r=az();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function lR(r){return JSON.stringify(r.split("+").sort())}function Au(r,e){let t=lz(),n=lR(r);for(let o of Object.values(sz))if(Object.values(o).some(i=>lR(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function $g({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!t&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await st({root:r,fn:([d,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:Te,codePath:"scrolling page"});else{let d=e.viewportSize()||Pn,p=await st({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Te,codePath:"computing page height"}),[m,g,h]=await st({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let E=f.getBoundingClientRect();return[f.scrollTop,E.x,E.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Te,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<Te;){a?.throwIfAborted();let E=await z(e.evaluate(()=>document.body.scrollHeight),{milliseconds:oe}),[b,C,R]=await z(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let M=v.getBoundingClientRect();return[v.scrollTop,M.x,M.y]}),{milliseconds:oe});if(E===p&&b===m&&C===g&&R===h)break;p=E,m=b,g=C,h=R,await j(dt)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function qg(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await j(dt)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function cR(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,delayMs:s}=r;if(a){await cz(e,t,n,o,s,i);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(t+i.x,n+i.y,{steps:o}),await j(s??Po),await e.mouse.up()}async function uR(r,e,t,n){await r.mouse.move(e.x,e.y,{steps:3}),await r.mouse.down(),await r.mouse.move(t.x,t.y,{steps:3}),await j(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,fu):500),await r.mouse.up()}async function cz(r,e,t,n,o,i){let a=Math.max(1,n??1),s=i.x,c=i.y,l=i.x+e,u=i.y+t;await r.evaluate(async({startX:d,startY:p,endX:m,endY:g,stepCount:h,delayMs:f})=>{let E=document.elementFromPoint(d,p)??document.body??document.documentElement,C=window._momenticMobileUtilities.dispatchTouch;C(E,"touchstart",d,p);for(let R=1;R<=h;R+=1){let v=d+(m-d)*R/h,M=p+(g-p)*R/h;C(E,"touchmove",v,M),await new Promise(A=>setTimeout(A,Math.floor((f??500)/h)))}C(E,"touchend",m,g)},{startX:s,startY:c,endX:l,endY:u,stepCount:a,delayMs:o})}import{randomUUID as Sz}from"crypto";import{cloneDeep as Xg}from"lodash-es";function Kn(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as uz}from"crypto";var dz="v1";function Kg(r,e){if(r.tagName.toLowerCase()==="svg"&&!mz(r))try{let t=dR(r,e),n=pz(JSON.stringify(t));return{version:dz,json:t,hash:n}}catch{return}}function pz(r){return uz("md5").update(r).digest("hex")}function dR(r,e){let t=r.tagName.toLowerCase(),n=gz(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=dR(a,e);s&&o.children.push(s)}}return o}function mz(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function gz(r){let e={},t=r.attributes;for(let n of Object.keys(t))fr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var Lo={r:147,g:196,b:125,a:.55},mR={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Lo,paddingColor:Lo,borderColor:Lo,marginColor:Lo,eventTargetColor:Lo,shapeColor:Lo,shapeMarginColor:Lo,showInfo:!0,showAccessibilityInfo:!0};function gR({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=hz({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function hz({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=r[o],l=c.layout,u={};l.nodeIndex.forEach((A,I)=>{u[A]=I});let d=l.styles,p=l.bounds??[],m=c.nodes,g=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],f=m.attributes??[],E=m.parentIndex??[],b=m.nodeName??[],C=m.nodeType??[],R=m.pseudoType??{index:[],value:[]},v=m.inputChecked??{index:[]},M=e[c.frameId];for(let A=0;A<h.length;A++){let I=h[A],k=C[A],W=f[A]??[],ie=E[A]!==void 0&&E[A]>=0?E[A]:void 0,ge=ie!==void 0?h[ie]:void 0,At=ge!==void 0?a[ge]:void 0,G=R.index.indexOf(A),$=G!==-1?e[R.value[G]]:void 0,fe=u[A],se;fe?se=p[fe]??[]:se=[];let Ce=b[A]!==void 0?e[b[A]]?.toLowerCase():void 0;if(!Ce){s.warn({backendNodeId:I,frameId:M,frameIndex:o,nodeBounds:se},"DOM node has no tag name");continue}let Me={backendNodeId:I,psuedoType:$,nodeType:k,frameIndex:o,parentFrameId:M,ownedFrameId:void 0,bounds:{x:se[0]??null,y:se[1]??null,width:se[2]??null,height:se[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:ge??null,tagName:Ce,parent:At??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};At&&At.childrenBackendIds.push(I);let Jt=g.index.indexOf(A);if(Jt!==-1){let _e=g.value[Jt];i[_e]=Me;let $e=r[_e]?.frameId;Me.ownedFrameId=$e!==void 0?e[$e]:void 0}for(let _e of Object.keys(Me.bounds)){let $e=_e;Me.bounds[$e]!==null&&(Me.bounds[$e]/=n)}let qt=fe!==void 0?d[fe]??[]:[];for(let _e=0;_e<qt.length&&!(_e>=t.length);_e++){let $e=qt[_e];if($e===void 0||isNaN($e))continue;let lt=e[$e];if(lt===void 0)continue;let Pt=t[_e];Me.computedStyles[Pt]=lt}for(let _e=0;_e<W.length;_e+=2){let $e=W[_e],lt=W[_e+1];if(!$e||!lt)continue;let Pt=e[$e],Gt=e[lt];!Pt||!Gt||(Me.attributes[Pt]=Gt)}v.index.includes(A)&&(Me.attributes.checked="true"),a[Me.backendNodeId]=Me}return a[h[0]]}function Yg(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=`${Yg(t,e)}${a}`}return r.mPathSelector=n,n}function pR(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var fz=["html","#document","#document-fragment"];function hR({node:r,domGraph:e}){let t=[],n=r,o=pR(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=pR(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++,fz.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 fR(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 SR(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Te});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Te}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Te})).attributes,i=Kn(o,hn);if(!i)throw new Error(`Could not find attribute ${hn} for object ${e}`);return i}var yz=["focusable","keyshortcuts","controls","live","relevant","orientation"],bz=["selected","readonly","modal","required","invalid"],Ez=["id","name","role","content"],yR=["absolute","fixed","sticky"],Tz=["i","label"],vz=["path"],Az=["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"],TR=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],vR=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],wz=["menulistpopup","statictext","inlinetextbox"],Cz=80,bR=100,AR=50,Zg=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],Rz=["cite"],xz={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"]},Mz={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},ER={indentLevel:0},Jg=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<AR?t:""),this.role=this.role||(e.domNode.attributes.role??""),Oz(this.properties,e.domNode,e.importantProperties)}Nz(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&&vz.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>vR.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>MR(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>_R(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&&Tz.includes(this.domNode.tagName)||Az.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)||fr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>xR(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=ER){let t=Object.assign({},ER,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=Xg(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(v=>!v.superseded&&v.type==="contents")&&this.children.length>0&&(m="");let h=this.nameSources?.find(v=>!v.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let v=h.attributeValue?.relatedNodes??[];v.length===1&&v[0].text&&v[0].text===m&&(m="")}let f=Zg.includes(this.role)||Rz.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
|
|
4329
|
+
`;let E=`${u}<${p}`;!a&&!f&&(E+=` id="${this.id}"`);let b=s??!1;if((l.multiline||l.contenteditable)&&this.children.length>0&&(b=!0),d&&d!=="generic"&&d!==p&&!(xz[d]??[]).includes(p)&&(E+=` role=${JSON.stringify(d)}`),m&&(E+=` name=${JSON.stringify(m)}`),this.content&&!b&&(E+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isIneligible()&&(E+=` ${fr.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let v=this.domNode.bounds,M=Math.round(v.x??0),A=Math.round(v.y??0),I=Math.round((v.x??0)+(v.width??0)),k=Math.round((v.y??0)+(v.height??0));E+=` bounds=[${M} ${A} ${I} ${k}]`}let C=Date.now();if(Object.keys(l).length>0&&!i){if(Date.now()-C>1e3)throw new Error(`Serialization for the HTML element with tag ${p} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([v,M])=>{if(!yz.includes(v)){{if(bz.includes(v)&&(!M||M==="false"))return;if(v==="value"&&b&&(l.type==="text"||this.role==="textbox"))return;if(v==="level"&&`${M}`=="1")return;if(v==="url"&&l.src&&p==="img")return;if(v==="url"&&l.href&&p==="a")return;if(v==="editable"&&M==="plaintext")return;if(v==="type"&&M===p)return;if(c&&!Mz[v])return}typeof M=="string"?E+=` ${v}="${ft(M,bR,!0)}"`:typeof M=="boolean"?M?E+=` ${v}`:E+=` ${v}={false}`:typeof M<"u"&&(E+=` ${v}={${ft(JSON.stringify(M),bR,!0)}}`)}})}if(p==="::before"||p==="::after"){let v="";for(let M of this.children)v+=M.serialize({...e,indentLevel:n,neighbors:0});return v}let R=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||R)E+=` />
|
|
4330
|
+
`;else{let v="";for(let A of this.children)v+=A.serialize({...e,indentLevel:n+2,neighbors:0});let M=v.trim();M.length<=Cz&&!M.includes(`
|
|
4331
|
+
`)?E+=`>${M}</${p}>
|
|
4332
4332
|
`:E+=`>
|
|
4333
|
-
${v}${u}</${
|
|
4333
|
+
${v}${u}</${p}>
|
|
4334
4334
|
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let v=this.parent.children.findIndex(I=>I.id===this.id),M=v>0?this.parent.children[v-1]?.serialize({...e,neighbors:0}):"",A=v<this.parent.children.length-1?this.parent.children[v+1]?.serialize({...e,neighbors:0}):"";return`${M||""}
|
|
4335
4335
|
${E}
|
|
4336
|
-
${A||""}`}return E}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:qg(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=qg(this.properties),e}},Yg=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let m=a(d);m&&(u.push(m),m.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(t);return new r(s,n,o,i)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let m of l){let p=n(m,s||u);p&&(d.push(p),p.parent=c,u=!0)}if(c.children=d,s||u)return c;if(Xg.includes(i.role)&&a)return c}let o=n(t);return new r(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}pruneToSerializedCharLimit(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n=c=>c.role==="StaticText"||c.role==="ListMarker",o=new WeakMap,i=(c,l)=>{if(o.has(c))return o.get(c);let u=c.serialize({indentLevel:l,noChildren:!0});return o.set(c,u),u},a=(c,l,u)=>{let d=c.shallowClone();d.children=[];let m=i(c,l).length;if(u<=m)return{clone:d,used:m};if(n(c)||c.children.length===0)return{clone:d,used:m};let p=m,g=u-p;for(let h of c.children){let f=l+2,E=i(h,f).length;if(g<E)break;let{clone:b,used:C}=a(h,f,g);if(C>g)break;d.children.push(b),b.parent=d,p+=C,g-=C}return{clone:d,used:p}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function xz(r){return r.name?.value?`"${r.name.value}"`:r.role?.value&&r.role.value!=="none"&&r.role.value!=="generic"?`"${r.role.value}"`:`"${r.nodeId}"`}function Mz(r,e,t,n){return r.bounds.x===null||r.bounds.y===null||r.bounds.height===null||r.bounds.width===null||r.bounds.width===0||r.bounds.height===0?!0:r.bounds.x+r.bounds.width<e.leftBound||r.bounds.x>e.rightBound?($l({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):r.bounds.y+r.bounds.height<e.upperBound||r.bounds.y>e.lowerBound?($l({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):r.computedStyles.display==="none"?(t.debug({domNode:r},"Filtering out node since it has display none"),!1):!0}async function vR({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:s,showZeroOpacityElements:c,filterByViewport:l,viewportDetails:u,useMPaths:d,importantProperties:m,allowedA11yIgnoreReasonsOverride:p,cdpClient:g,logger:h,callId:f}){if(!e&&r.parentId)throw new Error(`Got no parent for accessibility node ${r.nodeId}: ${JSON.stringify(r)}`);let E=($,he={})=>{},b=r.backendDOMNodeId,C=vz.includes(r.role?.value?.toLowerCase()??"");if(!C&&b===void 0)return E("Filtering out node since it doesn't exist in the DOM"),[];let R=b?i.backendIdToNode[b]:void 0;if(!C&&!R)try{let $=await z(g.send({method:"DOM.describeNode",params:{backendNodeId:b}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if($&&$.node.nodeName.toLowerCase()==="slot"&&$.node.distributedNodes?.length)h.debug({redirectedDomNode:R,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:$},"Redirecting node to assigned slot");else return E("Filtering out node since it doesn't exist in the DOM",{cdpResult:$}),[]}catch($){return E("Filtering out node since it doesn't exist in the DOM",{err:$}),[]}if(R&&e&&l&&u&&r.backendDOMNodeId&&!Mz(R,u,h,f))return R.momenticIgnored=!0,[];if(R&&R.computedStyles.display==="none")return R.momenticIgnored=!0,[];if(R&&R.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&R.tagName.toLowerCase()!=="input")return R.momenticIgnored=!0,[];if(c===!1)return R.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",M=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",A=new Kg({domNode:R,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:M,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter($=>(p??bR).includes($.name)||ER.includes($.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+xz(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:m,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),I=n,k=a[t],W=t;if(R?.tagName.toLowerCase()==="iframe"&&R.ownedFrameId){let $=n.childFrames.find(Ce=>Ce.frameId===R.ownedFrameId),he=o[$?.frameId??""]?.root,se=a[$?.frameId??""];if($&&he&&se){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Ce=he;r.childIds=Ce.childIds,I=$,k=se,W=$.frameId}}let oe=R?.childrenBackendIds?.length??0,Te=(r.childIds??[]).filter($=>!!k.get(parseInt($))).length;if(oe>Te){let $=r.childIds?.map(se=>k.get(parseInt(se))).filter(Boolean).map(se=>se?.backendDOMNodeId).filter(se=>se!==void 0)??[],he=0;for(let se of R?.childrenBackendIds??[]){if($.includes(se)){he=(r.childIds?.findIndex(_e=>k.get(parseInt(_e))?.backendDOMNodeId===se)??0)+1;continue}let Ce=i.backendIdToNode[se];if(!Ce||Ce?.tagName.toLowerCase()!=="svg")continue;let Me=Math.floor(-1*Math.random()*1e7),Jt={nodeId:Me.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:se,frameId:W,role:{type:"string",value:"graphics-symbol"}};k.set(Me,Jt),r.childIds||(r.childIds=[]),r.childIds.splice(he,0,Me.toString()),he++}}if(r.childIds?.length===1&&R){let $=k.get(parseInt(r.childIds[0])),he=$?.role?.value,se=R.childrenBackendIds;if($&&he==="StaticText"&&se.length===1){let Ce=i.backendIdToNode[se[0]];if(Ce?.tagName?.toLowerCase()==="span"){let Me=Math.floor(-1*Math.random()*1e7).toString(),Jt={nodeId:Me,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Ce.backendNodeId,frameId:W,childIds:[$.nodeId]};$.parentId=Me,k.set(parseInt(Me),Jt),r.childIds=[Me]}}}for(let $ of r.childIds??[]){if(!$)continue;let he=k.get(parseInt($));if(!he)continue;let se=await vR({node:he,parent:A,domGraph:i,axGraph:o,frameId:W,frameContext:I,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:m,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});se.length&&(A.children=A.children.concat(se))}if(A.role==="StaticText"&&(A.children=[]),A.children.length===1&&A.children[0].role==="StaticText"){let $=A.name,he=A.children[0]?.name;($===he||!he)&&(A.children=[])}let At=[];for(let $=A.children.length-1;$>=0;$--){let he=A.children[$];if(he.role!=="StaticText"){At.push(he);continue}if($===0||A.children[$-1].role!=="StaticText"){At.push(he);continue}A.children[$-1].name+=he.name}if(A.children=At.reverse(),!A.isInteresting(m)&&r.parentId)return R&&(R.momenticIgnored=!0),A.children;for(let $ of A.children)$.parent=A;return Iz(A),R&&d&&$g(R,i),[A]}function AR({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:c,startId:l=1}){r.id=l,l+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:Xg.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(s[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let m=jg(d,i),p=m?c[m.hash]:void 0,g=p?p.description:void 0;p&&(r.properties["data-momentic-description"]=g)}for(let m of r.children)l=AR({node:m,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function wR({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:m,allowedA11yIgnoreReasonsOverride:p}){let g=t??"root",h=r[g]?.root;if(!h)throw new Error("A11y tree has no root");let f=hz(),E=A=>{let I=A.allNodes.filter(W=>!W.ignoredReasons?.find(Te=>(p??bR).includes(Te.name))),k=new Map;return I.forEach(W=>{k.set(parseInt(W.nodeId),W)}),k},b={};Object.entries(r).forEach(([A,I])=>{b[A]=E(I)});let C=await vR({node:h,domGraph:e,parent:null,inputNodeMap:b,axGraph:r,frameId:g,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:p});if(C.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(C)}`);if(C.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let R={},v={},M={};return AR({node:C[0],a11yIdNodeMap:R,dataMomenticIdMap:v,selectorToNodeMap:M,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:m}),new Yg(C[0],R,v,M)}function _z(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<TR&&!hr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(CR(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=Number(e);if(!Number.isNaN(o))return o}catch{}return r==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function Pz(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||yz.includes(a);if((hr.relevantElementAttributes.includes(a)||RR(a,t))&&!c){let u=_z(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&fR.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of fR)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of t?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],m=`${c}: ${d}`;o.includes(m)||o.push(m)}}o.length>0&&(r.style=o.join("; "))}function Iz(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(ft(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of r.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let p=u.children.filter(g=>g.tagName==="th");if(p.length){if(i=p.map(g=>ft(g.name,100,!1)),i.length===p.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(p=>p.tagName==="td"||p.tagName==="th"),m=d.length===i?.length;d.forEach((p,g)=>{p.tagName!=="th"&&(p.properties["col-index"]||(p.properties["col-index"]=g+1),m&&(p.properties.col||(p.properties.col=i[g])))})}}}function Oz(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function CR(r,e){if(e&&xR(r,e))return!0;if(hr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(hr.alwaysInterestingClassNames.includes(r))return!0;for(let t of hr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function RR(r,e){if(e?.attributes?.includes(r))return!0;for(let t of e?.attributes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}function xR(r,e){if(e?.classes?.includes(r))return!0;for(let t of e?.classes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}var bu=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await z(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new x("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await j(dt),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await z(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new x("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await z(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new x("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await z(this.session.send(e,t),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await z(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new x("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await z(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await z(t.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};var ki="<empty>";function Lz(r){return r.includes("doubleclick.net")||r.includes("googletagmanager.com")||r.includes("googlesyndication.com")||r.includes("s.amazon-adsystem.com")||r.includes("smartadserver.com")||r.includes("omnitagjs.com")||r.includes("x.adroll.com")}function PR(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||Lz(r.url)}async function Nz(r,e){let t=await r.send({timeout:re,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:re,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:re,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Ui({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:Di,method:"Page.getFrameTree",params:{}}),r.send({timeout:Di,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,m)=>{if(PR(d.frame))return null;try{return await IR({cdpClient:r,rawFrameTree:d,indices:[m],parent:n,warnings:o,logger:t})}catch(p){return o.push(`Failed to get child frame: ${p}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function IR({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await Nz(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Wn(c,g);h&&(u.push(`${g}=${JSON.stringify(h)}`),g==="src"&&(l=h))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},p=(e.childFrames??[]).map(async(g,h)=>{if(PR(g.frame))return null;try{return await IR({cdpClient:r,rawFrameTree:g,indices:[...t,h],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(p)).filter(g=>g!==null),d}async function Dz(r){try{return await r.owner().count()===1}catch{return!1}}async function kz(r){try{return await r.count()===1}catch{return!1}}async function Yr(r,e){let t=[],n=r;for(;n.parent.type==="frame";)t.push(n.parent),n=n.parent;t.reverse();let o=e,i=[];for(let l of t){let u=!1;for(let d of[...l.locationData.attributeSelectors,ki]){let m=o.frameLocator(d===ki?"iframe":`iframe[${d}]`);if(await Dz(m)){u=!0,o=m,i.push(d);break}}if(!u)throw new x("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...r.locationData.attributeSelectors,ki]){let u=o.locator(l===ki?"iframe":`iframe[${l}]`);if(await kz(u)){a=u,i.push(l);break}}if(!a)throw new x("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${r.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l,{timeout:ne}),c=await s.asElement().contentFrame();if(!c)throw new x("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function MR(r,e){let t=[...r],n=[];for(;t.length;){let o=t.shift();e(o)&&n.push(o),t.push(...o.childFrames)}return n}async function OR({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===ki?s=s.length===1?s[0].childFrames:[]:s=s.filter(m=>m.locationData.attributeSelectors.includes(d)).map(m=>m.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===ki?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),c=MR(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),c=MR(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let a=o;for(let s=0;s<t.indices.length-1;s++)a=a[t.indices[s]]?.childFrames??[];if(n=a[t.indices[t.indices.length-1]],n)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Nr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function Eu(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function Jg(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function LR(r){let e=Jg(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function NR(r){return r.type==="auto"?{type:"auto",frameId:r.handle.frameId,url:r.handle.url,src:r.handle.src??"",mPathSelectorTokens:r.mPathSelectorTokens.join(" > ")}:{type:"url",url:r.url}}async function DR({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await Uz({frameElementHandle:n,logger:e,signal:t})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function Uz({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await ys({promiseGenerator:async()=>r.evaluate(async i=>{let a=i.scrollTop;i.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(c=>setTimeout(c,250));let s=Date.now();for(;Date.now()-s<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(l=>setTimeout(l,250))}}),timeoutMs:Ee,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}import{create as Fz,windowedFiniteBatchScheduler as Bz}from"@yornaath/batshit";import{reduce as zz}from"lodash-es";var Hz=100,Gz=2e3;function kR(r){return Fz({fetcher:async t=>{r(zz(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:Bz({windowMs:Gz,maxBatchSize:Hz})})}async function UR({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=r.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(g=>g.url());i.debug({frameUrl:l,...r},"Passive click event captured on element");let m,p;if(l)try{let g=await n.frameElement();m=await z(g?.boundingBox(),{milliseconds:re})??void 0;let h=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)p={type:"url",url:`/${h.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(h)}`)}catch(g){i.warn({err:g},"Failed to construct iframe details for recorded action, using hardcoded URL only"),p={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:p,frameBoundingBox:m})}catch(g){i.error({err:g},"Failed to transform passive click action")}})()}import{randomUUID as Xr}from"crypto";import Vz from"js-beautify";var Wz=["Dead"],Tu=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:Xr(),type:"PRESET_ACTION",command:tn(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let h=tn(i);a={id:Xr(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let h=tn(i);a={id:Xr(),type:"PRESET_ACTION",command:{...h,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let h=tn(i);a={id:Xr(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:be(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=Vz.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=TC(d,"data-momentic-interacted",4e4)}catch{}let m;try{m=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...be(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),m=s}let p=this.recordedSteps.get(u)?.step??a,g=p?.command;g&&"target"in g&&g.target?(g.target={type:"description",elementDescriptor:m},this.callbacks.onStepRecorded({...p,command:g},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:n}=e;if(Wz.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=tn("TYPE");i={id:Xr(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=tn("PRESS");i={id:Xr(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,m=i.command.value;i={id:Xr(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${m}`:`${d}${m}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:Xr(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=tn(l);u.deltaY=Math.abs(i);let d={id:Xr(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=tn(l);u.deltaX=Math.abs(i);let d={id:Xr(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&n())}};import{z as Qg}from"zod";var Twe=Qg.object({type:Qg.literal("url"),url:Qg.string()});var vu=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let m of this.userControlledBrowserSettings.importantStyles){let p=m.split(":");if(p.length!==2){this.logger.warn({style:m},"Invalid style property passed to importantStyles");continue}let g=p[0]?.trim(),h=p[1]?.trim();if(g===void 0||h===void 0){this.logger.warn({style:m},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(g)||this.computedStylesToFetch.push(g)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),n=Jg(e),{frame:o,mPathSelectorTokens:i}=await Yr(e,t),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),n=await Ui({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await OR({page:t,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(Eu(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Eu(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await DR({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Ui({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[z(n.evaluate(e,t),{milliseconds:Ee})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Yr(c,n).then(({frame:u})=>z(u.evaluate(e,t),{milliseconds:Ee})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await Ui({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(t.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:n??this.logger})}async getA11yTree(e){let t={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await fr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new x("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await fr({fn:()=>Ui({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await fr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let l=await fr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await fr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await fr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:t,signal:o,logger:n});return Object.values(t).some(m=>m>750)&&n.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:On,filterByViewport:!1,flagNotActionableNodes:!1}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=pR({node:o,domGraph:this.domGraph});return gR(e,i)}else return this.getLocatorFromBackendId(t,n.backendNodeId)}async getLocatorFromBackendId(e,t){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:Ee});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await hR(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute"),i}return e.locator(Rr(o))}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await Ui({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof x&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await j(dt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Eu(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=Wn(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Yr(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Yr(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new x("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await wR({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Yr(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.userControlledBrowserSettings.visualActions)return t;let n=this.logger;return await st({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:Ee,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let n=t.hostname.split("."),o=n.length>2?n.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return t?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let t=e.attributes??[];if(Wn(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Wn(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:re,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:re,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:re,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[];try{await this.pageGetter().waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(p){i.warn({err:p},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let c,l;for(let p=0;p<3;p++)try{l=await fr({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(g){c=g,i.warn({err:g},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),m=[];for(;d.length>0;){let p=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:p,warnings:s});if(!h)continue}catch(h){if(h.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${p.frameId} with url ${p.url}, allowing it to be fetched: ${h}`)}d.push(...p.childFrames);let g=async()=>{try{let h=await fr({fn:()=>this.getRawA11yTreeForFrame({frameId:p.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${p.frameId}`,logObject:o,logger:i});u[p.frameId]=h}catch(h){i.warn({err:h,url:p.url,src:p.src},`Error getting raw a11y tree for child frame ${p.frameId}, continuing...`)}};m.push(g())}return await Promise.all(m),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Ee}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:t,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:re}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await j(dt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new x("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return mR({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=LR(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};var ws=class r{static USER_AGENT=mu;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;pageLoadAbortControllers=new Set;pageLoadAbortListenerCleanup;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:m,onVideoPageChange:p}){OE(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=m,this.onVideoPageChange=p}registerAbortSignal(e){if(this.pageLoadAbortListenerCleanup&&(this.pageLoadAbortListenerCleanup(),this.pageLoadAbortListenerCleanup=void 0),this.abortSignal=e,!this.abortSignal)return;let t=()=>{for(let n of this.pageLoadAbortControllers)n.abort();this.pageLoadAbortControllers.clear()};if(this.abortSignal.aborted){t();return}this.abortSignal.addEventListener("abort",t),this.pageLoadAbortListenerCleanup=()=>{this.abortSignal?.removeEventListener("abort",t)}}async initialize({grantPermissions:e,permissionsToGrant:t,runInitScripts:n,timingRecorder:o}){if(this.contextInitialized)return;let i={[uu]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(QC(t))),a.push(this.context.addInitScript({content:`${Sg.htmlUtilsLibJs}
|
|
4337
|
-
//# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:
|
|
4338
|
-
//# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Bg(i,this.userBrowserSettings.disableFullStory)})])}catch(p){if(p instanceof Error&&p.message.includes("Content Security Policy"))this.logger.warn({err:p},"Content Security Policy error from adding Momentic scripts, reloading page instead"),c=!0;else throw p}(o??{})["add-init-scripts"]=Date.now()-m};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&Qz()==="darwin"&&$z("system_profiler SPDisplaysDataType").toString().includes("Retina"))w.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let d=async()=>{let m=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-m};a.push(d())}let l=Date.now();await z(Promise.all(a),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let u=Date.now();(o??{})["ops-attach"]=u-l,c&&await this.page.reload(),this.cdpClient=await bu.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(o??{})["cdp-init"]=Date.now()-u,await this.initializeScreencast(),this.stateManager=new vu({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init(e){let t=await XC(e),n=new r(t);return await n.initialize({grantPermissions:!0,permissionsToGrant:e.userBrowserSettings.grantedPermissions,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let m=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-m}let u=c?.url(),d=new r({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await Wg(this.context,{getTitles:!0}),t=this.page.url();this.clientCallbacks?.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let n=Zg(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await z(t(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!Co(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Zg(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{NC(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(UC(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=kR(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await Og({pageId:t,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks,isBrowserClosed:()=>this.closed})}),await e.route("**/*",GC(this.customHeaders,this.logger))),wr&&await e.route("**/*",vs),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let t=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)} (${n})`;if(!t||t==="about:blank"||!Co(t)||this.recentFrameNavigations[o]&&Date.now()-this.recentFrameNavigations[o]<1e3)return;this.recentFrameNavigations[o]=Date.now();let i=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(s){this.logger.warn({err:s},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(a){a.name!=="AbortError"&&this.logger.warn({err:a,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await z(Hg(this.getBrowserCallbacks()),{milliseconds:ne})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<Di;){a++,n?.throwIfAborted();try{if(await st({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:ne,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){t.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await j(dt),a%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),st({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:re,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),t.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of t)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:t=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:t});if(a.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(t<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await j(Ro),this.screenshot({...e,retries:t-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??Ee}),c=Buffer.from(s.data,"base64"),l=await BR.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&Yz(n,c),this.lastScreenshotForRecording=c,!e)return c;let m=await e.boundingBox({timeout:re});if(!m)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:p,y:g,width:h,height:f}=m;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");p=Math.floor(p),g=Math.floor(g),h=Math.floor(h),f=Math.floor(f);try{let E=await BR.fromBuffer(c),b=E.bitmap.width,C=E.bitmap.height;p=Math.max(0,Math.min(p,b-1)),g=Math.max(0,Math.min(g,C-1)),h=Math.max(1,Math.min(h,b-p)),f=Math.max(1,Math.min(f,C-g)),c=await E.crop({x:p,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(E){throw new Error(`Failed taking element screenshot at coordinates (${p}, ${g}) with size (${h}, ${f}): ${E}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:n=this.pageLoadTimeout}){Qw(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await j(dt),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:ne})}if(!i)throw new x("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(RC.has(s))throw new x("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await st({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:ne,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},n=!1){let o=await this.getActivePageOrFrame();await rR({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await j(Ro),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(t.clearContent)if(a||t.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:t.delay??wf}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Ee})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:Ee})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return Su({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:ne}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await LC(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let a=await this.setCookie(i);t=t.concat(a)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:ne});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:ne,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.info(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await OC(this.page,o,this.logger),this.logger.info(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await IC(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new x("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Wg(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,delete t.serializedForm,delete t.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:t,locator:n,startingBoundingBox:o,allowNotActionableNodesOverride:i,logger:a=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),n)try{let s=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});s?(t.generatedSelectors=s.generatedSelectors,t.serializedHtml=s.serializedHtml,t.nodeOnlySerializedHtml=s.nodeOnlySerializedHtml,t.hybridSelector=s.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(s){if(s instanceof Dr)throw a.warn({err:s},"Cache attributes disqualify found element"),s;a.warn({err:s},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(s){a.debug({err:s},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!Eg.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:re})),!o||!o.width||!o.height)return n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0,{scrollPerformed:!0};let{x:i=0,y:a=0,width:s=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-c)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1)return{scrollPerformed:!0};e.boundingBox=o;let l=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(l),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,locator:t,requirements:n}){let o={},i=!!n?.position&&n.position!=="irrelevant",a=!!n?.shape&&n.shape!=="irrelevant";if(i||a){let s=await t.boundingBox({timeout:re});if(!s||!s.width||!s.height)throw new x("ActionFailureError","Element does not have a bounding box as required");a&&(o.shape={width:s.width,height:s.height,tolerance:n.shape}),i&&(o.position={x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height,tolerance:n.position})}if(n?.text){let s=await t.textContent({timeout:re});o.text=s?.trim()}if(n?.attributes&&n.attributes.length>0){let s={};for(let c of n.attributes){let l=c.trim().toLowerCase();if(!(!l||hr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:re});u!==null&&(s[c]=u)}catch(u){e.warn({err:u,attr:c},"Failed to fetch required attribute, continuing...")}}o.attributes=s}return o}async getAdditionalElementDetails({mainLocator:e,additionalElement:t,root:n,logger:o}){let i=this.stateManager.a11yIdToNodeMap[t.id];if(!i)return;let a=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:n,node:i});if(e.contentFrame!==a.contentFrame)return;let s=await this.fetchHtmlAttributes({locator:a,logger:o});if(!s?.generatedSelectors||s.generatedSelectors.length===0)return;let c={selectors:s.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({logger:o,locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,s=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let l=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!l)continue;s.push(l)}catch(l){this.logger.warn({err:l,additionalElement:c},"Failed to fetch additional element details, continuing...")}return s}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:s}){if(t)try{o.requirements=await this.getElementRequiredValues({logger:s,locator:i,requirements:t})}catch(c){s.warn({err:c},"Failed to generate required values for target")}n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:s}){if(e<0)throw new x("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new x("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let l=this.stateManager.frameConfig,u,d,m,p;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let b=c.parentFrame,{cache:C,config:R}=await this.stateManager.getAutoFrameDetailsFromHandle(b);d=C,m=R,u=R.frame,p="auto iframe"}else c.parentFrame&&l?(m=l,u=await this.getActivePageOrFrame(),p="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),p="should not be possible");let g=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:u,node:c}),h={id:e,inputDescription:t??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:be(i),frameCache:d},f,E=!1;o||(m&&(i.info({frameConfigSource:p,frameConfig:NR(m)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(m),E=!0),await this.updateCacheWithNewNodeDetails({node:c,target:h,locator:g,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:s,target:h,root:u,locator:g,logger:i}));try{return{resolution:{locator:g,a11yNode:c,displayString:c.getNodeOnlySerializedForm(),decisions:[]},target:h,frameConfig:m,frameConfigSource:p}}finally{E&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:s}=n;if(t.frameCache&&this.userBrowserSettings.autoExpandIframes){let p,g=!1,h=Date.now();for(;Date.now()-h<this.smartWaitingTimeout;)try{let f=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(f),g=!0;break}catch(f){p=f,await j(dt,a)}if(!g)throw p}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,m;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let p=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{m=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:p,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(g){if(g instanceof Sa)break;if(g instanceof Dr){if(d++,d>2)throw i.error({err:g},"Got multiple cache disqualification errors, giving up"),g;i.warn({err:g},"Got cache disqualification error, waiting and retrying resolution"),await j(dt,a)}a?.throwIfAborted(),p&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await j(dt,a)}}return m||(m=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:m.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:m?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),m}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=Fi(t),l=[],u,d=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),m;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(g){m=g,g instanceof Nr&&(l.push(...g.decisions),u=g.cacheMissReason)}if(p)return{...p,pageState:void 0,decisions:[...l,...p.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:m?.message,selectors:Fi(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw m;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:d,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(p)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=be(o),p;u=u??"secondary-resolution-failed"}throw new Nr(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l,u)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Sa("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:On,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:bg,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles}},{css:l,hybrid:u}=await st({fn:v=>window.evaluatePrimaryCaches(v),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c},hybridParams:s&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c}:void 0},root:e,timeout:re,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,m,p=[];if(s==="prefer"&&u?.result){d=u.result;let v={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};p.push(v),m="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let v=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,M=d.workingSelectors.slice(0,5);p.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:v,selectors:M}),n.debug({reason:v,workingSelectors:M},"Resolved with CSS selectors"),m="CSS_SELECTOR"}else throw p.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),u&&p.push({type:"HYBRID_SELECTOR",matched:!1,reason:u.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:u.logs}),l?.error&&n.error({err:new Error(l.error)},"Cache evaluation errored unexpectedly (CSS)"),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new Nr("Cache evaluation failed",p,l.cacheMissReason);let g,h,f;if(this.userBrowserSettings.visualActions){let v=d.mPath;if(!v)throw new Error("Found element did not have an mPath despite using visual actions");let M=v.join(" > ");g=e.locator(M),h=this.stateManager.getNodeUsingMPathSelector(M)}else if(d.dataMomenticId!==void 0)f=parseInt(d.dataMomenticId),h=this.stateManager.dataMomenticIdToNodeMap[f],"workingSelectors"in d?g=e.locator(d.workingSelectors[0]):g=e.locator(Rr(f));else throw new x("InternalWebAgentError","Received an element resolution result with no identifying attributes");s&&t.hybridSelector&&(u?.logs.length===1?a.warn({hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution rejected, continuing..."):u?.result?l?.result&&u?.result&&u.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(u.result.mPath)?n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==u.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):a.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[E,b]=await Promise.all([g.textContent(),g.boundingBox()]);if((E??"")!==(d.textContent??""))throw n.warn({currentTextContent:E,originalTextContent:d.textContent},"Retrying cache resolution because element's text content has changed since resolution"),new Error("Element's text has changed since cache was resolved");if(!b||Math.abs(b.height-d.boundingBox.height)>1||Math.abs(b.width-d.boundingBox.width)>1||Math.abs((b.x??0)-(d.boundingBox.x??0))>1||Math.abs((b.y??0)-(d.boundingBox.y??0))>1)throw n.warn({currentBoundingBox:b,originalBoundingBox:d.boundingBox},"Retrying cache resolution because element's bounding box has changed since resolution"),new Error("Element's bounding box has changed since cache was resolved");let C=Fi(t);await this.updateCacheWithNewNodeDetails({node:h,target:t,locator:g,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let R=eh(C,t);return R&&Object.keys(R).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(n),t.cacheResolutionUpdateSource=m),{a11yNode:h,displayString:d.serializedElement,locator:g,decisions:p}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,s=await this.getActivePageOrFrame(),c=Date.now(),l=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),l++;let m=s.locator(n),p;try{return await m.waitFor({state:"attached",timeout:ne}),p=await xr(m,o,500)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:m,displayString:p,decisions:d}}catch(g){let h=g.message;u=new x("ActionFailureError",`CSS selector '${n}' failed to resolve after ${l} attempts: ${h.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":h}`),await j(dt,i)}}throw u}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:t,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:re});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!t||!n||!c||!l){this.logger.debug({oldX:t,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:t,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<CC){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let l=await st({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:Ee,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(bg*t.nodeOnlySerializedHtml.length);if(l&&l.closestDistance&&l.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${l.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:l.closestDistance,closestElement:l.closestNodeSerialized})}else{if(l?.error)throw new Error(l.error);if(l?.dataMomenticId||l?.mPathSelector){let d=l.dataMomenticId?parseInt(l.dataMomenticId):void 0,m,p;if(d)m=this.stateManager.dataMomenticIdToNodeMap[d],p=e.locator(Rr(d));else if(l.mPathSelector)m=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),p=e.locator(l.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let g=l.closestNodeSerialized??await xr(p,o,500)??"unknown element";o.warn({result:l,originalTarget:t,displayString:g},"Resolved cached target to new node with pure html levenshtein distance");let h=Fi(t);await this.updateCacheWithNewNodeDetails({node:m,target:t,locator:p,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=eh(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:l},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${u} string comparison distance of the saved element.`,logs:l.logs,distance:l.closestDistance,closestElement:g,savedElement:t.nodeOnlySerializedHtml}),{locator:p,a11yNode:m,displayString:g,decisions:n,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(l)}`)}}catch(l){o.info({err:l},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${l}`})}let s=t.screenshotUrl,c=t.role??"";if(s&&Eg.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions],pageState:void 0}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`,elementImageUrl:s}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshotUrl:e,oldTarget:t,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(e)).arrayBuffer(),l=t1(),u=await this.enricher.runTemplateMatching({id:l,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:d,locator:m}=await this.getTargetFromPositionPercentages({percentX:u.x,percentY:u.y,allowNotActionableNodesOverride:o}),p=d.boundingBox?.width,g=d.boundingBox?.height;if(!p||!g)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let h=d.id,f=this.stateManager.a11yIdToNodeMap[h],E=Fi(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:m,allowNotActionableNodesOverride:o});let b=eh(E,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:b,templateMatch:u},"Updated cache after template matching resolution")),{locator:m,a11yNode:f,displayString:d.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:e}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:ne})??"",i=tR.some(a=>a===o.toLowerCase());return await Gg({targetingResult:t,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return Gg({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),ru(s,t,n)){a=!0;break}await j(dt,this.abortSignal)}if(!a)throw new x("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${lw(t)} in ${o}ms.
|
|
4339
|
-
Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,n={}){await this.highlight(e),await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:re});if(!o)throw new x("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=n.steps??5;await this.page.mouse.move(i,a,{steps:s}),await j(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,Ee):500),await this.highlight(t),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:re});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+t,{steps:n}),await j(Ro),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Mo({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:re});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Mo({func:t=>t.locator.focus({timeout:Ee}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await st({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:ne,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Mo({func:t=>t.locator.blur({timeout:Ee}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,n=!1){await this.highlight(e.locator),await Mo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${t.index} is not a number`)}await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?Number(t.index):void 0},{force:n,timeout:re})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=yu(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async keyDown(e,t){if(t.convertMeta){let n=yu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of zg(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=yu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of zg(e))await this.page.keyboard.up(n)}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForDOMStability()}async getBrowserState(e){let{maxAttempts:t=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:On;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:s});let d=0,m;for(;d<t;){d++;try{return await z(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(p){if(s?.throwIfAborted(),m=p instanceof Error?p.message:`${p}`,d>=t)throw p;u.warn({err:p,url:this.url()},"Error getting a11y tree, retrying...")}}throw new x("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${m}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await st({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:re,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:t,lowerBound:t+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=m=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>c);let l=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",l);let u=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",u);let d=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForDOMStabilityHelper(i,t,n,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",l),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,n,o){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0;for(;Date.now()-a<n;){if(o?.throwIfAborted(),await j(Ro,this.abortSignal),s)try{let d=await this.screenshot(c);if(!d.equals(s)){s=d,l=!1;continue}l=!0}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<wC)){i=!0;break}}i||t.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await lR(this.page,e,t,n)}async mouseDragUsingVisualCoordinates(e,t,n,o,i){await sR({page:this.page,deltaX:e,deltaY:t,steps:n,delayMs:o,visualTarget:i,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:re}),n=await z(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:Ee});process.platform==="darwin"&&n===1&&(n=vC);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let b=0;b<s.length;b++)if(c[b]===e){d=l.indexOf(b);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[m=0,p=0,g=0,h=0]=u[d];m/=n,p/=n,g/=n,h/=n;let f=m+g/2,E=p+h/2;return{centerX:f,centerY:E}}async scrollVertical(e){return Vg({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return Vg({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,t){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=await e.video()?.path();if(n){let o=zR(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await j(dt)}}throw o}async switchToPageHelper(e,t){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
|
|
4340
|
-
Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Co(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,t?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let t;return typeof e=="string"?t=Dl(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,t],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await z(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&UR({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];Co(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},dt);let s=async()=>{clearInterval(t)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,t,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let a=window;a._MOMENTIC_RECORDING_ACTIVE=!0,a._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!1,i._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:ne})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:t,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await ys({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new x("UserInfrastructureError",`The page with URL ${ft(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await ys({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return Xz.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:n}=await st({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:Ee,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new x("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t,n,o=Ee){let i=await this.getActivePageOrFrame();return st({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=_n}){let i=HC(),a={code:e,fragment:t,context:n},{result:s}=await z(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new x("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:Ee});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:ne})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:n}){if(t<0||t>1||n<0||n>1)throw new x("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*t),d=Math.ceil(i*n),m=u+l,p=d+c;return this.getDomNodeFromPixelPosition(m,p)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:ne,params:{highlightConfig:dR,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:ne,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:ne})}catch{}}async getTargetFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(t,e);return this.getTargetFromBackendNodeId({root:t,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:t,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[mn],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Rr(a)),c;o.bounds.x!==null&&o.bounds.y!==null&&(c={x:o.bounds.x,y:o.bounds.y,width:o.bounds.width??0,height:o.bounds.height??0});let l=await this.fetchHtmlAttributes({locator:s,logger:this.logger,startingBoundingBox:c,allowNotActionableNodesOverride:n}),u={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:u},"Tied backend ID to HTML node"),{target:u,locator:s}}async performTargetRedirection(e,t,n){try{return await this.scrollIntoViewIfNeeded(e),await z(this.performTargetRedirectionHelper(e,t,n),{milliseconds:re})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now();if(n===void 0&&(n=await e.boundingBox({timeout:re})??void 0),!n){let C=await xr(e,t,500);t.error(`Attempted to click on element with no bounding box: ${C}`);return}let{x:i,y:a,width:s,height:c}=n,l=this.getViewport();if(i<0||a<0||!l||i+s>l.width||a+c>l.height){t.info("Skipping locator redirection because the element is outside the viewport");return}let u=await this.getActivePageOrFrame(),{dataMomenticId:d,mPathSelector:m,error:p,serializedElement:g,foundElementRelativePoint:h,force:f,logs:E}=await e.evaluate(C=>{let R=window;if(!R.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return R.performTargetRedirection(C)},void 0,{timeout:ne}),b=Date.now()-o;if(p){t.warn({error:p,serializedElement:g,duration:b,force:f,logs:E},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:g,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(Rr(d)),hints:{relativeXYToLocator:h,force:f}};if(m)return t.info({newMPathSelector:m,serializedElement:g,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with mPath"),{locator:u.locator(m),hints:{relativeXYToLocator:h,force:f}};if(h)return t.info({foundElementRelativePoint:h,serializedElement:g,duration:b,force:f,logs:E},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:g,duration:b,force:f,logs:E},"Forcing click on original element"),{locator:e,hints:{force:f}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:Ee});if("error"in s&&s.error)throw s.error.startsWith(bC)?new ll(s.error):s.error.startsWith(EC)?new cl(s.error):new Error(s.error);return s.warnings.length&&t.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,t){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,t,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*t),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:ne})}async scrollFromPositionPercentages(e,t,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!xC}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,Pg(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Au(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(c),this.logToUserConsole(this.page,"error",c);return}let n=t?.trim()||zR(e),o=qz(e),i=Zz(e),a=Om[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Au(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:Jz.getType(e)||"application/octet-stream"},{timeout:du})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=l;let m=atob(l),p=new Array(m.length);for(let h=0;h<m.length;h++)p[h]=m.charCodeAt(h);let g=new Uint8Array(p);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([g],{type:u})}isSameEntry(h){return h.name===this.name}queryPermission(h){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(h){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let h=new Blob([g]);return new File([h],d.momenticFileName,{type:u})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){this.cdpClient.loadEventLogs.length>0&&(this.cdpClient.loadEventLogs=[]);let t={...this.debugData};return this.debugData={logsPerPage:[]},t}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e,"copying text to clipboard")}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(t=>{let n=t.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,t){this.requestRecorders[e]=t}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,n){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:n})}registerMock(e,t,n,o){let i=e??Zg();return this.mocks[i]={matcher:t,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??AC}get userBrowserSettings(){return Fi(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Di}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=fu();for(let t of e)if(!(!Au(t)||!FR(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=e1(t,o);return Au(i)&&FR(i).isDirectory()&&Kz(i).length>0})))return t}};import P1 from"fetch-cookie";import{cloneDeep as cx}from"lodash-es";import{CookieJar as I1}from"tough-cookie";async function Sr({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var r1=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function HR({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(r1.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),l=0;for(;l===0||Date.now()-c<s;){await j(250),l++;let u=(await t.getOpenPages()).map(m=>m.url),d=t.url();if(u.length!==e.length)for(let m=u.length-1;m>=e.length;m--){let p=u[m];if(Co(p,o)&&p!==r&&p!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(m)});break}}}}async function Jr(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}import{randomUUID as l1}from"crypto";var VR={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},WR={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},GR=/<(\S+) id="(\d+)".*?>/g,n1=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,jR=["h1","h2","section","footer","nav","aside","form","label","dialog"],o1=[...jR,"span","div","h3"],i1=["table","select","form","ul","ol","menu","pre","code","dialog"],a1=["table","form","dialog","nav","section","ul","select"];function wu(r){return s1(r)}function s1({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
|
|
4341
|
-
`),l=0,u=[],d=0,
|
|
4342
|
-
`),tokenLength:d}),u=[],d=0,m
|
|
4343
|
-
`),tokenLength:d}),s.forEach((h,f)=>{let E=h.ids[0],b=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:E,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var
|
|
4344
|
-
${r}`;case"ELEMENT_CHECK":return`${
|
|
4345
|
-
${r}`;default:return r}}var f1=15;async function Ru({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=f1}){if(!r.assertion.trim())throw new x("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=tu(c),u=0,d=Date.now(),m,p,g;try{await Sr({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(f){t.warn({err:f},"Failed to clear highlights before AI check, continuing...")}let h;for(;u<a&&(!h||h-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await j(l,n.abortSignal),h=Date.now();let f=!1;try{if(m=await Sr({action:async()=>{let b=await JR(s,t,n.abortSignal);return p&&p.serializedTree===b.serializedTree&&p.screenshotBuff.equals(b.screenshotBuff)?(f=!0,m):(p=b,QR({command:r,state:b,fixtures:n,useMemory:i,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:o}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),m?.success){m?.updatedMemory&&fs(r,m.updatedMemory,t);break}else throw m?.thoughts?new x("AssertionFailureError",m.thoughts):new x("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(E){n.abortSignal.throwIfAborted(),g=E instanceof Error?E:new Error(`${E}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:E},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!m?.success)try{m=await Sr({action:async()=>QR({command:r,state:await JR(s,t,n.abortSignal),fixtures:n,useMemory:i,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(f){n.abortSignal.throwIfAborted(),g=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(m?.updatedMemory&&fs(r,m.updatedMemory,t),!m?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new x("AssertionFailureError",f)}return{...m,succeedImmediately:!1,urlAfterCommand:s.url()}}async function JR(r,e,t){let[n,o]=await Promise.all([Jr(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function QR({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:m}=t,p={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,E=f.toString("base64"),b=u.url(),C=r.contextChoice??"MULTIMODAL",R=g;C!=="VISION_ONLY"&&(R=await Po({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:E,options:{aiPageFiltering:a},fixtures:{generator:d,signal:m,logger:l,orgId:t.orgId}}),R!==g&&(p.ragUsed=!0),p.pageState=R);let v={goal:r.assertion,url:b,memory:o?r.cache?.memory:void 0,browserState:R,screenshot:E,contextChoice:C,source:c},A=await(C==="VISION_ONLY"?(I,k)=>d.getVisualAssertionResult(I,k):(I,k)=>d.getAssertionResult(I,k))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:m,logger:l,loggerTags:be(l)});return(A.result||i)&&A.relevantElements&&(p.relevantElementsSerialized=A.relevantElements.map(I=>u.getSerializedFormFromA11yId(I)).filter(I=>!!I),await S1(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function S1(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await z(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var y1=75e4,xu=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function ZR(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await b1(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof xu?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await j(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function b1(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await j(o.smartWaitingTimeout,n);return}if(!e.description)throw new x("UserConfigurationError","Cannot locate element with empty description");await z(E1(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function E1(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await Sr({action:async()=>T1(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function T1(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await Es({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:m}=await Jr(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Mr(m)>y1)throw new xu;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new x("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let E=await u.getSmartWaitingDecision({browserState:m,description:d,screenshot:f},{abortSignal:s,loggerTags:be(n)});return n.debug({result:E},"Got smart waiting result"),E.isPageReady}import{cloneDeep as tx}from"lodash-es";async function rx(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>uf(e.cache)?e.cache:void 0,a=i(),s=tx(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=dw(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,m=500,p=!1;for(;u<2||Date.now()-l<t;){u++,u>1&&await j(m,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await ex({cacheToUse:a,params:r});if(d=h,p=f,h.success)break;c(),m=Math.min(m*2,1e4)}if(!d)throw new x("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Ks(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await ex({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!p&&(g.target=lg(g.target),g.updatedAt=new Date),d}async function ex({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!yn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=Yc(t.assertion),l,u=!1,d=tx(r);try{let{elementInteractedDisplayString:m,result:p,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>v1(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ea(t),targetName:"target"}});return l={success:p.success,data:p.data,err:p.err,elementInteractedDisplayString:m,thoughts:g},u=!0,p.success||(s.warn({aiThoughts:g,elementString:m,err:p.err},"Element check found an element but failed"),l={...p,thoughts:g}),{result:l,elementWasFound:u}}catch(m){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${m.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(m instanceof x)||m.reason!="ActionFailureError")throw m;return l={success:!1,err:m,data:void 0,thoughts:void 0},s.warn({err:m},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function v1(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await A1(r,e.assertion)}async function A1(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:ft(a,500,!0)},!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,n=new x("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ft(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await r.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new x("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),t=!1;break}if(!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new x("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},Lt*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:Lt*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:Lt*1e3});break}case"FOCUSED":{t=await r.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(t=e.negated?!t:t,!t){let a=gr(e);n=new x("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=gr(e);t=!1,n=new x("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The style property ${e.property} ${s}`):n=new x("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:t,data:o,err:n}}function nx(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as w1}from"jimp";async function Cs(r,e){let t=await r.screenshot(e),n=await w1.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as ox}from"jimp";import nh from"jpeg-js";import C1 from"pixelmatch";async function ix({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!yn(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;t.target?.elementDescriptor?l=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async oe=>Cs(o,{locator:oe.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await Cs(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let W=`${l.width}x${l.height}`,oe=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${W}) does not match saved screenshot dimensions (${oe}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await ox.fromBuffer(l.buffer),m={width:l.width,height:l.height},p=await ox.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=m.width*m.height,E=g.width*g.height,b=Math.abs(m.height-g.height),C=Math.abs(m.width-g.width);if(f>E){let W=d.cover({w:g.width,h:g.height});l.buffer=await W.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(E>f){let W=p.cover({w:m.width,h:m.height});u.buffer=await W.getBuffer("image/jpeg"),h="saved"}let R={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=t.threshold??.1,A=C1(nh.decode(u.buffer).data,nh.decode(l.buffer).data,R.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=A>v*100,k=`Visual diff of ${A.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${v*100}%.`;if(h&&(k+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${C} pixels.`),I)throw new x("ActionFailureError",k);return{fail:I,thoughts:k,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:nh.encode(R,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var R1=3e4;function x1(r){if(!r.body)return{};switch(r.body.type){case"json":return{content:r.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(r.body.content).forEach(([t,n])=>{e.append(t,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function Mu({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??R1/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(Li(r.url)&&(c=r.url),t&&Ni(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await z((async()=>{let g=s?`${l}?${s}`:l;try{let h=x1(r),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:r.method,body:h.content})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new x("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new x("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let m={};d.headers.forEach((g,h)=>{m[h]=g});let p={status:d.status,headers:m,request:{url:d.url,method:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{p.request.json=JSON.parse(r.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{p.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(p.text=await d.text());return p}var M1=5e3;async function sx({timeout:r=Lt,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await _u(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await j(s,e.signal),s=Math.min(Math.floor(s*1.5),M1);else return i}return i=await _u(e),i}async function _u({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(ax,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(ax,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?un.CONTAINS:dn.CONTAINS;a=new x("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new x("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function ax({value:r,negated:e,returnHtml:t}){let n=document.documentElement.outerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var _1=3e4;async function lx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??_1/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Li(r.url)&&(s=r.url),t&&Ni(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=await z((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new x("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,m=await l.text();try{d=JSON.parse(m)}catch{throw new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${m}`)}let u={};return l.headers.forEach((d,m)=>{u[m]=d}),{status:l.status,headers:u,json:await l.json()}}var Pu=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=t,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Jr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await Po({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),m={url:this.browser.url(),browserState:d,startingScreenshot:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...be(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Jr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,m=await Po({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),p={url:c,browserState:m,startingScreenshot:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(p,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...be(a)},langfuseSessionId:s})}catch(g){throw new x("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Jr(this.browser,e)}async locateElement(e){return await rh({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return Sr({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let m=i[d],p=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:m,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(p)}try{let d=await s(...u.map(g=>g.result)),m=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",p=u.map((g,h)=>g.thoughts?`${m(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:p}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new x("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await Sr({action:()=>this.wrapElementTargetingCommandHelper({...e,originalCache:e.originalCache??e.cache}),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&kd(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Bd(i)||Ud(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(zd(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof Dr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof x?n:new x("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new x("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await j(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:n,target:o,originalCache:i,action:a,options:s,command:c}=e,{disableCache:l,useSelector:u,targetName:d,targetHealingInProgress:m,source:p}=s,g=this.logger.child({commandId:c.id}),h=this.shouldUseMemory(),f=s.retriesWithAI??1,E=!1,b=cx(e.cache);if((!b||l)&&!Ad(o))throw new x("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(g.info("Cache explicitly disabled for this step"),E=!0,b=void 0),b&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&b.targetSource==="HEURISTIC_HEALED"&&(E=!0,b=void 0),b?.inputDescription&&!XR(o.elementDescriptor,b.inputDescription)&&(g.warn({old:b.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),E=!0,b=void 0);let C=v=>!!v&&Ks(v),R=!0;if(!C(b)){R=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:m,cacheBustedBeforeAction:E,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(E||!i)&&await ZR({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:p,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let v;try{v=await rh({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:p,useMemory:h,memory:h?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:g},this.getControllerFixtures(t))}catch(I){if(I instanceof vn&&I.updatedLocatorMemory){let k={id:-1,...i,memory:I.updatedLocatorMemory};Jc({cmd:c,key:d,newTarget:k,logger:g,updatedWithAI:!0})}throw new x("ActionFailureError",I.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let M=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,g),A=await a(M);return Jc({cmd:c,key:d,newTarget:v.target,logger:g,updatedWithAI:!0}),m&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=be(g)),{result:A,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,b,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let M=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,g),A=await a(M);if(Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.13.2"]),Jc({cmd:c,key:d,newTarget:b,logger:g,updatedWithAI:!1}),R){let I=v.decisions.filter(k=>k.matched);if(I.length!==1)g.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let k=I[0].type;n.recordTargetAutoHeal({healType:k})}}return{result:A,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let M="unknown";v instanceof Nr&&v.cacheMissReason&&(M=v.cacheMissReason),Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.13.2",`missReason:${M}`]);let A=!1;if((v instanceof Dr||kd(v)||Bd(v)||zd(v)||fS(v)||Ud(v)||SS(v))&&(A=!0),v instanceof x&&!A)throw g.error({err:v},"Failed to execute action with cached target (fatal)"),v;if(f>0&&o){g.info({err:v},"Failed to execute action with cached target, retrying with AI");let I;return b.memory&&of(b.memory)&&(I=b.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:I,retriesWithAI:f,targetHealingInProgress:!0}})}throw new x("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Cs(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await j(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new x("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&Df(n)?await this.browser.waitForDOMStability({timeout:Ee}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:ne}),this.options?.autoFollowNewTabs&&await HR({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{cu(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>xg(e)}}async resolveCommandTemplateStrings(e,t){return lu({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?Ru({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new x("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new x("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Ru({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new x("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=IE(n.schema);if(h)throw new x("UserConfigurationError",h)}let p=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:p,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:be(a)});if(h.result==="NOT_FOUND")throw new x("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new x("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new x("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new x("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!Li(n.url)&&!Ni(n.url,this.browser.baseUrl))throw new x("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new x("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let p,g;if(n.target&&Ir(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:E,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:C=>this.browser.hover(C),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});p=E,g=b}let h=this.browser.getViewport()?.height??Rn.height,f=this.browser.getViewport()?.width??Rn.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??h));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??h);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new x("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let p=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:p},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new x("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await j(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Ir(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let p=this.browser.url(),{elementInteractedDisplayString:g,result:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),E={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return nu(p,E.urlAfterCommand)&&(E.succeedImmediately=!0,E.succeedImmediatelyReason="URL changed"),E}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Ir(n.fromTarget)&&Ir(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(Ir(n.fromTarget)||Ir(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:p,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(h,f)=>this.browser.dragAndDrop(h.locator,f.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p[0],thoughts:g}}case"MOUSE_DRAG":{let p=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(p)||isNaN(g))throw new x("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Ir(n.target)){await this.browser.mouseDragUsingVisualCoordinates(p,g,h,void 0,n.target.pixels);break}let f,E;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:C}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async R=>this.browser.mouseDrag(p,g,h,R.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,E=C}else await this.browser.mouseDrag(p,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:E}}case"SELECT_OPTION":{if(!yn(n.target))throw new Error("Select with x/y is not supported yet");let p=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:p},cache:n.cache?.target,action:E=>this.browser.selectOption(E,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ea(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let p={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,p);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let p;try{n.environment==="BROWSER"?(p=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:p},"Executed JavaScript in browser")):p=await qr({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new x("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(p)}catch(g){throw new x("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:p}}case"TYPE":{if(n.target&&Ir(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let p=this.browser.url(),g,h,f=cx(n.target),E=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:C,thoughts:R}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!E,source:Ea(n)}});g=C,h=R}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return nu(p,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(Ir(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:p,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.hover(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"FOCUS":{if(!yn(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:p,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.focus(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"BLUR":{if(n.target&&!yn(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:p,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:h=>this.browser.blur(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return nu(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let p=new I1,g=P1(fetch,p),h;try{h=new URL(n.url).hostname}catch{}let f=await Mu({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Zs.parse({...f,cookies:kl(p,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await lx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return ix({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:p=>this.wrapElementTargetingCommand(p)});case"FILE_UPLOAD":{let p,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,p=await _C({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,p=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!p)throw new x("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...p,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let p;if(!n.storageState.trim())p=void 0;else if(p=await qr({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof p!="object")throw new x("ActionFailureError",`Credentials must evaluate to an object (received ${typeof p} instead)`);let g;try{g=mb.optional().parse(p)}catch(h){throw new x("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let p=(n.timeout??Lt)*1e3,g=this.generator.getAgentConfig()?.assertion;if(nx(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let E=await Ru({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),source:"NEGATED_CHECK"});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${E.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:E.afterScreenshotOverride}}finally{f.cache?.memory&&fs(n,f.cache?.memory.traces,a)}}let h=await rx({command:n,tracer:t,timeoutMs:p,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let p=await Sr({action:async()=>sx({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!p.success,data:p.data,thoughts:p.success?"Page assertion passed.":p.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let p=new Gn(n.requestMatcher),g=this.browser.registerRequestListener(p);return this.registeredListeners[n.key]=g.then(async h=>await Lg(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let p=this.registeredListeners[n.key];if(!p)throw new x("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await z(p,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let p=new Gn(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>p.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=hu(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=hu(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let p=this.recordedRequests[n.key];if(!p)throw new x("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(p),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let p;return n.requestMatcher&&(p=new Gn(n.requestMatcher)),this.browser.setHeader(n.name,n.value,p),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Gn(n.requestMatcher),async(g,h)=>{let f=await qr({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),E=pb.parse(f);return new Response(E.body,{status:E.status,headers:E.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(p=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new Tu({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})}};import{cloneDeep as O1}from"lodash-es";import gx from"truncate-json";var ux=1e3,dx=5e6,L1=5*1024*1024;function hx(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=gx(JSON.stringify(n.data),1e3);n.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${o}`}switch(n.type){case"MOBILE_PRESET_STEP":mx(n);break;case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":mx(n),hx(n.steps,e);break;default:{let o=n;throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")}}}}function mx(r){if(r.type==="MOBILE_PRESET_STEP"){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}}function px(r,e){let t=JSON.stringify(r),n=t.replaceAll("\\u0000","");if(t.length!==n.length){let o=t.indexOf("\\u0000");e.warn({input:t.slice(Math.max(0,o-500),Math.min(t.length,o+500))},"Database content violation: stripped unicode character from input")}return n}function Iu(r,e){let t=O1(r);if(hx(t,e),t.length>ux)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,ux);let n=px(t,e);if(n.length>dx)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>dx;)t.pop(),n=px(t,e);let{jsonString:o}=gx(n,L1);try{return zt.array().parse(JSON.parse(o))}catch(i){throw e.error({serialized:n,err:i},"Could not parse serialized results into JSON structure after processing"),i}}import{AsyncLocalStorage as N1}from"async_hooks";var Rs=new N1;function D1(r){Rs.enterWith({activeTracers:[r]})}function k1(r,e){let t=Rs.getStore()?.activeTracers;if(!t)return e();t.push(r);try{return e()}finally{t.pop()}}async function U1(r,e){let t=Rs.getStore()?.activeTracers;if(!t)return e();let n=[...t,r];return Rs.run({activeTracers:n},e)}var pn={globalAls:Rs,initializeRootTracerContext:D1,withChildTracer:k1,withChildTracerAsync:U1};var Io=class r{spans;parentSection;finished=!1;startTime;endTime;constructor(e){this.startTime=e?.startTime??Date.now(),this.spans=e?.subSpans??[],this.parentSection=e}startSection(e,t){let n={type:"SECTION",name:e,startTime:Date.now(),endTime:void 0,subSpans:[],attributes:{}},o=new r(n);try{return pn.withChildTracer(o,()=>t(o,n))}catch(i){throw n.error=i instanceof Error?i.message:String(i),i}finally{o.finish(),this.addSpan(n)}}async startAsyncSection(e,t,n){let o={type:"SECTION",name:e,startTime:Date.now(),endTime:void 0,subSpans:[],attributes:{}},i=new r(o);this.addSpan(o);try{let a;return n?.signal||n?.timeoutMs?a=await pn.withChildTracerAsync(i,()=>z(t(i,o),{milliseconds:n?.timeoutMs??1/0,signal:n?.signal,message:n?.timeoutMsg??`Operation timed out after ${n?.timeoutMs??1/0}ms (${e})`})):a=await pn.withChildTracerAsync(i,()=>t(i,o)),a}catch(a){throw o.error=a instanceof Error?a.message:String(a),a}finally{i.finish()}}finish(){if(!this.finished){this.endTime=Date.now();for(let e of this.spans)e.endTime||(e.endTime=this.endTime,e.durationMs=e.endTime-e.startTime);this.parentSection&&(this.parentSection.endTime=this.endTime,this.parentSection.durationMs=this.parentSection.endTime-this.parentSection.startTime),this.finished=!0}}addSpan(e){this.spans.push(e)}startSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{a=t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}async startAsyncSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{i?.signal||i?.timeoutMs?a=await z(t(o),{milliseconds:i?.timeoutMs??1/0,signal:i?.signal,message:i?.timeoutMsg??`Operation timed out after ${i?.timeoutMs??1/0}ms${"name"in i?` (${i.name})`:""}`}):a=await t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}getRootSpan(){return this.finished||this.finish(),{type:"SECTION",name:"root step span",startTime:this.startTime,endTime:this.endTime,subSpans:this.spans,attributes:{},durationMs:this.endTime?this.endTime-this.startTime:void 0}}};function ee(){let r=pn.globalAls.getStore()?.activeTracers,e;return!r||r.length===0?e=void 0:e=r[r.length-1],e||new Io}async function fx(r){let{driver:e,abortSignal:t,logger:n,packageName:o}=r,i;try{i=await z(e.execute("mobile: shell",{command:"dumpsys",args:["activity","recents"]}),{signal:t,milliseconds:1e4})}catch(s){t?.throwIfAborted(),n.warn({err:s,packageName:o},"Failed to read recents output while removing package");return}if(typeof i!="string"){n.warn({packageName:o,outputType:typeof i},"Unexpected dumpsys output when removing package from recents");return}let a=F1(i,o);if(a.length!==0)for(let s of a){t?.throwIfAborted();try{await e.execute("mobile: shell",{command:"am",args:["stack","remove",s.toString()]}),n.info({packageName:o,taskId:s},"Removed task from recents")}catch(c){t?.throwIfAborted(),n.warn({err:c,packageName:o,taskId:s},"Failed to remove task from recents")}}}function F1(r,e){let t=r.split("Task{");if(t.length<=1)return[];let n=new Set;for(let o of t.slice(1)){let i=`Task{${o}`;if(!i.includes(e)||i.includes("app.lawnchair/.LawnchairLauncher"))continue;let a=i.match(/taskId=(\d+)/);if(!a)continue;let[,s]=a;if(!s)continue;let c=Number.parseInt(s,10);Number.isNaN(c)||n.add(c)}return Array.from(n)}function xs(r){let e=[],t=r.getAttribute("text")??"",n=r.getAttribute("hint")??"",o=r.getAttribute("showing-hint")==="true";t.trim()&&!o&&t.trim()!==n.trim()&&e.push(t.trim());for(let i of Array.from(r.childNodes??[]))if(i.nodeType===3){let a=i.nodeValue??"";a.trim()&&e.push(a.trim())}else if(i.nodeType===1){let a=xs(i);a.trim()&&e.push(a.trim())}return e.join(" ").trim()}import{mkdirSync as sH}from"fs";import{tmpdir as lH}from"os";import Cx from"path";import{diff as aH}from"deep-object-diff";import{cloneDeep as wx}from"lodash-es";import Ex from"fontoxpath";import B1 from"@prettier/plugin-xml";import z1 from"prettier";import{DOMParser as H1,XMLSerializer as G1}from"slimdom";var V1=new Set(["android.webkit.webview","com.facebook.react.views.webview.reactwebview","com.tencent.smtt.sdk.webview","com.tencent.smtt.sdk.x5webview","org.xwalk.core.xwalkview","com.uc.webview.export.webview"]);function Ms(r){let e=r.toLowerCase();return e.endsWith("webview")||V1.has(e)}function W1(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}var j1=new Set(["index","package","a11y-important","screen-reader-focusabl"]),$1=new Set(["selected","checked","checkable","clickable","enabled","focusable","focused","long-clickable","password","scrollable","selected","showing-hint","context-clickable","multiline","text-entry-key","heading","dismissable","screen-reader-focusable","content-invalid","a11y-focused"]),q1=new Set(["text","hint"]),K1=new Set(["live-region","drawing-order"]),Y1=new Set(["displayed","enabled"]);function X1(r,e){let t={};for(let[n,o]of Object.entries(e))j1.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||$1.has(n)&&o==="false"||q1.has(n)&&o===""||Y1.has(n)&&o==="true"||K1.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function Sx(r,e,t){let{prunedDocument:n,idToElement:o,prunedIdToElement:i,idCounter:a,opts:s}=r,c=a.value++;t.setAttribute("id",String(c));let l={};for(let m of e.attributes){let p=m.name,g=m.value;g!=null&&(l[p]=String(g))}let u=X1(e.tagName,l);for(let[m,p]of Object.entries(u))t.setAttribute(m,p);if(o.set(c,e),i.set(c,t),Ms(e.tagName)){let m=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&m.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);m.trim().length>0&&t.appendChild(n.createCDATASection(`
|
|
4346
|
-
${
|
|
4347
|
-
`));return}}let d=Array.from(e.childNodes??[]);for(let m of d){let p=m.nodeType;if(p===3){let g=m.nodeValue;g&&g.trim().length>0&&t.appendChild(n.createTextNode(g));continue}if(p===1){let g=m;if(!Z1(g,s?.viewportBounds))continue;let h=n.createElement(W1(g.tagName));Sx(r,g,h),t.appendChild(h)}}}function J1(r,e,t,n){let o=r.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:t,prunedIdToElement:i,idCounter:{value:0},opts:n},s=o.documentElement;Sx(a,e,s);let c=new G1().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function yx(r,e){let t=new H1,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new Error("No root element found in XML");if(i.tagName!=="hierarchy")throw new Error("No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=J1(t,i,o,e);return{xml:await z1.format(c,{parser:"xml",plugins:[B1],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function Q1(r){let e=[],t=r;for(;t;){let n=t.tagName,o=t.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===t){i=s+1;break}}e.unshift(`${n}[${i}]`),t=o}return`/${e.join("/")}`}function Ou(r,e){let t=r.idToElement.get(e);if(t)return Q1(t)}function oh(r,e){let t=r.idToElement.get(e);if(!t)return;let n=t.cloneNode(!0);for(let o of Array.from(n.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a)}return n.outerHTML}function Oo(r){if(!r.hasAttribute("bounds"))return;let e=r.getAttribute("bounds");if(!e)return;let t=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(t){let n=parseInt(t[1],10),o=parseInt(t[2],10),i=parseInt(t[3],10),a=parseInt(t[4],10);if(Number.isFinite(n)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return[n,o,i,a]}}function Z1(r,e){if(!e)return!0;let t=Oo(r);if(!t||t.length<4)return!0;let n=t[0],o=t[1],i=t[2],a=t[3];return!(i<=e.left||n>=e.right||a<=e.top||o>=e.bottom)}function bx(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function Tx({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=Oo(e),!t))throw new Error("ActionFailureError: Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:bx(e,r?.attributesRequired),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:t[0],y1:t[1],x2:t[2],y2:t[3],tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:t[2]-t[0],height:t[3]-t[1],tolerance:r?.shapeSpecificity}:void 0}}function Ax({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new Error(`Could not find node with id: ${r.id}`);let o=Oo(n);if(!o)throw new Error(`Node ${r.id} has no bounding box: ${n.outerHTML}`);let i=Ou(t.graph,r.id)??"",a=oh(t.graph,r.id)??"",s=Tx({requirements:r.requirements,element:n}),c=[];r.additionalElements&&(c=r.additionalElements.map(({id:u,requirements:d})=>{let m=t.graph.idToElement.get(u);if(!m)return;let p=Ou(t.graph,u);return p?{xPath:p,requirements:Tx({requirements:d,element:m})}:void 0}).filter(u=>!!u));let l;if(Ms(n.tagName)&&r.inWebview!==!1?l={type:"WEBVIEW",resolvedDescription:e,xPath:i}:l={type:"NATIVE",bounds:o,resolvedDescription:e,xPath:i,elementOnlySerializedXml:a,requirements:s,requiredRelatedElements:c},r.updatedMemory){let u={type:"GCS_TRACES",traces:r.updatedMemory};l.memory=u}return{target:l,resolvedNode:n}}function ih(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var eH=.1,tH=.25;function Lu(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*eH;case"broad":return o<=Math.abs(e)*tH;case"irrelevant":return!0}}function rH(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!Lu(e.tolerance,n,o,Math.min(1,t)))return!1;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(r[1]+r[3])/2;return Lu(e.tolerance,a,s,Math.min(1,i))}function nH(r,e){return Lu(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?Lu(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var vx=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0){let c=xs(r);if(c!==o)throw new Error(`ActionFailureError: Resolved element text mismatch: expected ${o}, got ${c}`)}if(n)for(let[c,l]of Object.entries(n)){let u=r.getAttribute(c)??void 0;if(u!==l)throw new Error(`ActionFailureError: Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new Error(`ActionFailureError: Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!rH(t.newElementBounds,a))throw new Error(`ActionFailureError: Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!nH(t.newElementBounds,s))throw new Error(`ActionFailureError: Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function Nu(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=ee();if(e.type==="WEBVIEW")return oH(e,r);let a=Ex.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new Error(`ActionFailureError: Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let m=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let p of m){let g=Ex.evaluateXPathToFirstNode(p.xPath,o);if(!g)throw new Error(`ActionFailureError: Required related element not found for XPath: ${p.xPath}`);vx(g,p.requirements)}})}let s=Oo(a);if(!s)throw new Error("ActionFailureError: Resolved native element has no bounding box");vx(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[m,p]of n.idToElement.entries())if(p===a){c=m;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=oh(n,c)??l,u=Ou(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function oH(r,e){let{stateManager:t,logger:n,signal:o}=e,i=ee(),a=await t.getActiveWebview();if(!a||!a.browserController)throw new Error("No browser controller is attached to the requested webview");let s=a.browserController.browser;if(!r.browserCache)throw new Error("No browser target available on cache");let c=r.browserCache,l=await i.startAsyncSection("Resolve target in webview",()=>s.resolveTarget(null,c,{logger:n,signal:o}));return{resolvedTarget:{...r,controller:a.browserController,resolution:l}}}function Lo(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;Ml(e)&&(e[t]={...e[t],[n]:si.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date))}function Du(r){if(r.type==="WEBVIEW")return{type:"WEBVIEW",resolvedDescription:r.resolvedDescription,xPath:r.xPath,browserCache:r.browserCache,memory:r.memory};let{resolvedNode:e,...t}=r;return{...t}}var Je=class{driver;generator;stateManager;logger;fixtures;aborter;orgId;aiSettings;constructor(e){this.stateManager=e.stateManager,this.generator=e.generator,this.driver=e.driver,this.logger=e.logger,this.fixtures=e.fixtures,this.aborter=e.aborter,this.orgId=e.orgId,this.aiSettings=e.aiSettings}shouldUseMemoryForCommand(e){return this.aiSettings?.useMemory&&!e?.disableCache}async findElement({description:e,tracer:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,memory:a,webviewMemory:s}){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let c=await t.startAsyncSection("Get emulator state",async()=>{let g=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),h=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:g,screenshot:h}}),l;try{l=await t.startAsyncSpan("AI_LOCATOR_CALL",async g=>{let h=await this.generator.getMobileElementLocation({description:e,screenXml:c.emulatorState.graph.xml,screenshot:c.screenshot,memory:i?a:void 0},{logger:this.logger,loggerTags:be(this.logger),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["mobile-locator"]});return g.result=h,h})}catch(g){throw this.throwIfAborted(),this.logger.error({err:g},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${g instanceof Error?g.message:g}`)}if(l.id===-1)throw new An(l.thoughts??"No matching element found");let{target:u,resolvedNode:d}=Ax({aiResponse:l,description:e,emulatorState:c.emulatorState});if(u.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:u.elementOnlySerializedXml},attributes:{}}),{resolvedTarget:{...u,resolvedNode:d},thoughts:l.thoughts};let{browserLocateResult:m,browserController:p}=await t.startAsyncSpan("TARGET_RESOLUTION",async g=>{let h=await this.stateManager.getActiveWebview();if(!h||!h.browserController)throw new Error("No browser controller is attached to the requested webview");let f=await h.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger});return g.result={serializedElement:f.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},{browserLocateResult:f,browserController:h.browserController}});return{resolvedTarget:{...u,controller:p,resolution:m.resolution,browserCache:m.target},thoughts:m.thoughts}}async wrapTargetingAction(e){let{action:t,description:n,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:c,skipFetchingFullWebviewContent:l=!1,removeWebviewContent:u=!1}=e,d;if(i==="cache"&&"cache"in o&&o.cache){let f=o.cache;a==="target"&&"target"in f?d=f.target:a==="fromTarget"&&"fromTarget"in f?d=f.fromTarget:a==="toTarget"&&"toTarget"in f&&(d=f.toTarget)}let m=!1,p=wx(d),g;if(o.disableCache&&(this.logger.debug({command:o},"Cache explicitly disabled for command"),m=!0,p=void 0),s&&(m=!0,p=void 0),p&&p?.resolvedDescription!==n&&(this.logger.info({description:n,cacheDescription:p?.resolvedDescription},"Cache description mismatch, clearing it automatically"),m=!0,p=void 0),!p){this.logger.info({description:n,cacheBustedBeforeAction:m},"Prompting AI for a new element location");let f=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(o),memory:d?.memory,webviewMemory:ih(d)});g=f.thoughts;let E=await t(f.resolvedTarget);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:f.resolvedTarget,updatedWithAI:!0}),{result:E,thoughts:g}}let h;try{await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"}),h=await this.stateManager.getDomState();let{resolvedTarget:f,updatedCache:E}=await c.startAsyncSpan("CACHE_RESOLUTION",async C=>{let{resolvedTarget:R}=await Nu({target:p,domState:h,stateManager:this.stateManager,logger:this.logger}),v=Du(R),M=aH(p,v);return M&&Object.keys(M).length>0&&this.logger.info({cacheDiffs:M},"Successfully resolved target with cache"),C.attributes.serializedElement=R.type==="WEBVIEW"?R.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":R.elementOnlySerializedXml,{resolvedTarget:R,updatedCache:v}}),b=await t(f);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:E,updatedWithAI:!1}),p.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:native",`hasRequirements:${!!p.requirements}`,`hasAdditionalElements:${!!p.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.13.2"]),{result:b,thoughts:"Successfully executed preset action with cache"}}catch(f){p.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:native",`hasRequirements:${!!p.requirements}`,`hasAdditionalElements:${!!p.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.13.2"]),this.throwIfAborted(),this.logger.warn({err:f},"Failed to resolve target cache, retrying with AI");let E=this.shouldUseMemoryForCommand(o),b=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:E,memory:p?.memory,webviewMemory:ih(p)});g=b.thoughts;let C=await t(b.resolvedTarget);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:b.resolvedTarget,updatedWithAI:!0}),{result:C,thoughts:g}}}constructPerformerParams(){return{stateManager:this.stateManager,generator:this.generator,driver:this.driver,logger:this.logger,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,aiSettings:this.aiSettings}}getBoundsFromNativeCache(e){let[t,n,o,i]=e.bounds;if(t===void 0||n===void 0||o===void 0||i===void 0)throw new Error(`ActionFailureError: Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return{left:t,top:n,width:o-t,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:t,desiredDelta:n,edgeMarginPercent:o=.1}){let i=e.left+e.width/2,a=e.top+e.height/2;if(t==="up"||t==="down"){let s=e.height*o,c=e.top+s,l=e.top+e.height-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:i,startY:t==="down"?l:c,actualDelta:d}}else{let s=e.width*o,c=e.left+s,l=e.left+e.width-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:t==="right"?l:c,startY:a,actualDelta:d}}}invertDirection(e){if(e==="up")return"down";if(e==="down")return"up";if(e==="left")return"right";if(e==="right")return"left";throw new Error(`Unreachable code: ${e}`)}async performRawSwipe({startX:e,startY:t,deltaPixels:n,direction:o,durationMs:i=300}){let a=Math.abs(n),s=e,c=t;o==="up"||o==="down"?c=o==="up"?t-a:t+a:s=o==="left"?e-a:e+a,await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:100},{type:"pointerMove",duration:i,x:s,y:c},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return wx(this.aiSettings)}};function cH(r){let e={relativePosition:r.relativePosition};if(r.doubleTap&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both doubleTap and longPress");return r.doubleTap?{...e,doubleTap:!0,doubleTapDelayMs:r.doubleTapDelayMs}:r.longPress?{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}:e}var Bi=class extends Je{async tapOnAbsoluteCoordinates(e){let t=e.x,n=e.y;if(this.logger.info({x:t,y:n},"Tap at coordinates"),e.longPress)return await this.driver.executeScript("mobile: longClickGesture",[{x:t,y:n,duration:e.longPressDurationMs??2e3}]);if(e.doubleTap){await this.driver.tap({x:t,y:n});let o=e.doubleTapDelayMs??100;await new Promise(i=>setTimeout(i,o))}await this.driver.tap({x:t,y:n})}async tapOnNativeTarget(e,t){let[n,o,i,a]=e.bounds,s=i-n,c=a-o,l=t?.relativePosition?.x??s/2,u=t?.relativePosition?.y??c/2;l=Math.max(0,Math.min(l,s)),u=Math.max(0,Math.min(u,c));let d=n+l,m=o+u;return await this.tapOnAbsoluteCoordinates({x:d,y:m,...t}),{x:d,y:m}}async tapOnWebviewTarget(e,t){let{controller:n}=e;return(await n.browser.click(e.resolution,{createIsolatedFolder:()=>{let i=Math.random().toString(36).substring(4),a=Cx.join(lH(),"momentic","downloads"),s=Cx.join(a,this.orgId,i);return sH(s,{recursive:!0}),s}},{delayMs:t?.longPress?t?.longPressDurationMs??2e3:void 0,relativePosition:t?.relativePosition,doubleClick:t?.doubleTap})).coordinates}async tapOnTarget({target:e,options:t}){return await ee().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.attributes.options=t,"type"in e&&e.type==="NATIVE"?o.attributes.point=await this.tapOnNativeTarget(e,t):(o.withinWebview=!0,o.attributes.point=await this.tapOnWebviewTarget(e,t))},{name:"Tap on target"})}async executeTap({command:e}){let t=ee(),n=cH(e);if(e.target.type==="coordinates"){let a=await this.driver.getWindowSize(),s=e.target.xPercent*a.width,c=e.target.yPercent*a.height;return await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.tapOnAbsoluteCoordinates({...n,x:s,y:c})},{name:`Tap at coordinates ${s}, ${c}`}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,action:a=>this.tapOnTarget({target:a,options:n}),description:o});return{success:!0,message:i}}};var jn=class extends Je{async doPress({keycode:e,longPress:t}){await ee().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var Rx=25,ku=class extends Je{async doType(e){let t=ee();if(!e.target){if(e.clearContent)throw new Error("UserConfigurationError: clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(e),{success:!0,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:t,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o)},description:e.target.description});return{success:!0,message:n}}async doWebviewType(e,t){await ee().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??Rx};o.attributes.options=i;let{controller:a,resolution:s}=t;await a.browser.typeIntoTarget(e.text,s,i)},{name:"Typing within web view"})}async doNativeType(e,t){let n=new Bi(this.constructPerformerParams());e.clearContent?(await n.tapOnNativeTarget(t,{longPress:!0}),await this.clearContent()):await n.tapOnNativeTarget(t),await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e)}async sendKeys(e){let t=ee(),n=e.keyPressDelayMs??Rx;await t.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<3e3;){if(this.throwIfAborted(),await this.driver.isKeyboardShown())return;await new Promise(s=>setTimeout(s,500))}i.attributes.timedOut=!0}),n?await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.updateSettings({keyInjectionDelay:n}),await this.driver.keys(e.text),await this.driver.updateSettings({keyInjectionDelay:0})},{name:"Typing keys with a delay"}):await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.keys(e.text)},{name:"Typing keys"})}async clearContent(){let e=ee();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper())}catch(t){this.logger.warn({err:t},"Failed to find select all button, continuing...")}}async clearContentHelper(){let e=this.driver.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await e.waitForExist({timeout:750}),await e.click(),await new jn(this.constructPerformerParams()).doPress({keycode:67})}};import Yt from"zod";var xx=.8,$n=.2,uH=Yt.object({navigationBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()}),statusBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()})}),zi=class extends Je{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=uH.parse(await this.driver.executeScript("mobile: getSystemBars",[]));n=this.getInsetBoundsFromViewport(t),o.navigationBar.visible&&(n.height=Math.max(1,n.height-o.navigationBar.height)),o.statusBar.visible&&(n.top+=o.statusBar.height,n.height=Math.max(1,n.height-o.statusBar.height))}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),n=this.getInsetBoundsFromViewport(t)}break;case"OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getInsetBoundsFromBounds(i);break}default:{let o=e;throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getInsetBoundsFromViewport(e){let t=Math.floor(e.width*$n),n=Math.floor(e.height*$n);return{left:e.x+t,top:e.y+n,width:Math.max(1,e.width-t*2),height:Math.max(1,e.height-n*2)}}getInsetBoundsFromBounds(e){let t=e[0],n=e[1],o=e[2],i=e[3],a=o-t,s=i-n,c=Math.floor(a*$n),l=Math.floor(s*$n);return{left:t+c,top:n+l,width:Math.max(1,a-c*2),height:Math.max(1,s-l*2)}}async executeSwipe(e){let t=ee();if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:o,startY:i,deltaPixels:a}=e.scrollableElement;return await t.startAsyncSpan("EMULATOR_INTERACTION",async s=>{s.attributes.startX=o,s.attributes.startY=i,s.attributes.deltaPixels=a,s.attributes.direction=e.direction,await this.performRawSwipe({startX:o,startY:i,deltaPixels:a,direction:e.direction,durationMs:e.durationMs})},{name:`Swipe ${e.direction} using raw coordinates`}),{success:!0,message:"Successfully executed swipe action"}}if(e.scrollableElement.type!=="CUSTOM"){let o=await this.driver.getWindowRect(),i=await this.getHardcodedScrollableElementBounds(e.scrollableElement,o);return await t.startAsyncSpan("EMULATOR_INTERACTION",async a=>{await this.swipeByAbsoluteCoordinates({span:a,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:i})},{name:`Swipe ${e.direction} in the entire ${e.scrollableElement.type.toLowerCase()}`}),{success:!0,message:"Successfully executed swipe action"}}let{thoughts:n}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async o=>ee().startAsyncSpan("EMULATOR_INTERACTION",async a=>"type"in o&&o.type==="NATIVE"?this.scrollInNativeContainer({span:a,cmd:e,target:o}):(a.withinWebview=!0,this.swipeInWebview({span:a,cmd:e,target:o})),{name:`Swipe ${e.direction} in the specified container`}),tracer:t});return{success:!0,message:n}}async scrollInNativeContainer({span:e,cmd:t,target:n}){let o=n.bounds[2]-n.bounds[0],i=n.bounds[3]-n.bounds[1],a=Math.floor(o*$n),s=Math.floor(i*$n);await this.swipeByAbsoluteCoordinates({span:e,direction:t.direction,percent:t.viewportPercent,durationMs:t.durationMs,containerBounds:{left:n.bounds[0]+a,top:n.bounds[1]+s,width:Math.max(1,o-a*2),height:Math.max(1,i-s*2)}})}async swipeInWebview({span:e,cmd:t,target:n}){let{controller:o,resolution:i}=n;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=t.direction==="down"||t.direction==="up",c=await i.locator.boundingBox();if(!c)throw new Error("Failed to get bounds for webview container");let l=Math.floor(c.width*$n),u=Math.floor(c.height*$n),d=Math.max(1,c.width-l*2),m=Math.max(1,c.height-u*2),p={x:c.x+l+d/2,y:c.y+u+m/2},g=(s?m:d)*(t.viewportPercent??xx)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=p,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates(s?0:g,s?g:0,10,t.durationMs,p)}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=xx,durationMs:o=500,containerBounds:i}){e.attributes.containerBounds=i;let a,s;t==="up"||t==="down"?(a=i.height*n,s=Math.floor(a/(o/1e3))):(a=i.width*n,s=Math.floor(a/(o/1e3))),e.attributes.pixelDelta=a,e.attributes.pixelsPerSecond=s,await this.driver.executeScript("mobile: swipeGesture",[{...i,direction:t,percent:n,speed:s}])}};import pH from"pixelmatch";import{_android as gH,chromium as hH}from"playwright";import{PNG as Lx}from"pngjs";import{z as Ve}from"zod";var Mx=Ve.object({"Android-Package":Ve.string(),Browser:Ve.string(),"Protocol-Version":Ve.string(),"User-Agent":Ve.string(),"V8-Version":Ve.string(),"WebKit-Version":Ve.string(),webSocketDebuggerUrl:Ve.string()}),_x=Ve.object({description:Ve.string(),devtoolsFrontendUrl:Ve.string(),id:Ve.string(),title:Ve.string(),type:Ve.string(),url:Ve.string(),webSocketDebuggerUrl:Ve.string()}),Px=Ve.object({proc:Ve.string(),webview:Ve.string(),webviewName:Ve.string()}),Ix=Ve.array(Px.extend({info:Mx.optional(),pages:Ve.array(_x).optional()})),CIe=Ve.array(Px.extend({info:Mx,pages:Ve.array(_x)}));function ah(r,e,t=.01){let n=Buffer.from(r,"base64"),o=Buffer.from(e,"base64"),i=Lx.sync.read(n),a=Lx.sync.read(o);if(i.width!==a.width||i.height!==a.height)return 100;let s=i.width,c=i.height,l=Buffer.alloc(s*c*4);return pH(i.data,a.data,l,s,c,{threshold:t})/(s*c)*100}var Uu=class r{driver;limbarClient;device;currentContext;logger;webviews=new Map;fixtures;orgId;options;aborter;constructor({driver:e,context:t,limbarClient:n,logger:o,device:i,fixtures:a,orgId:s,options:c,aborter:l}){this.driver=e,this.limbarClient=n,this.device=i,this.currentContext=t,this.logger=o,this.fixtures=a,this.orgId=s,this.options=c,this.aborter=l;for(let u of["SIGINT","SIGTERM"])process.on(u,async()=>{await this.cleanupWebviews()})}static async init({driver:e,logger:t,fixtures:n,limbarClient:o,orgId:i,adbPort:a,options:s,aborter:c,playwrightDevice:l}){let u=await e.getContext(),d=typeof u=="string"?u:u.id,m;if(l)m=l;else{let g=(await gH.devices()).filter(h=>h._initializer?.serial?.endsWith(a.toString())||h._initializer?.serial?.endsWith((a-1).toString()));if(t.warn({devices:g.map(h=>({serial:h._initializer?.serial,model:h._initializer?.model}))},"No playwright device provided, using ADB to find device"),g.length===0)throw new Error(`Momentic found no devices listening on port ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);if(g.length>1)throw new Error(`Momentic found multiple devices on the ports ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);m=g[0]}return new r({driver:e,context:d,logger:t,device:m,fixtures:n,orgId:i,options:s,aborter:c,limbarClient:o})}async getContexts(){let e=await this.driver.getContexts({}),t=Array.from(this.webviews.values());return{contexts:e,webviews:t.map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active,hasPlaywright:!!n.browserController,lastSeen:n.lastSeen,socketName:n.socketName}))}}async getRawScreenshotBase64(e=2){let t=ee(),n;for(let o=0;o<e;o++)try{return await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>await this.driver.takeScreenshot(),{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:3e3})}catch(i){if(n=i,o===e-1)throw i}throw new Error(`Failed to take screenshot: ${n}`)}async getCurrentScreenshotPngString(){return`data:image/png;base64,${await this.getRawScreenshotBase64(1)}`}async waitForScreenshotStability({timeoutMs:e,signal:t,reason:n,tolerancePercent:o=1}){await ee().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c=!1;for(;Date.now()-a<e;){if(t?.throwIfAborted(),!s){s=await this.getRawScreenshotBase64();continue}let l=await this.getRawScreenshotBase64();if(ah(s,l)<=o){c=!0;break}s=l,await j(250,t)}c||(i.attributes.timedOut=!0,this.logger.warn({purpose:n},"Timed out waiting for screenshot stability"))})}async getCurrentPackage(){let e=await this.driver.execute("mobile: getCurrentPackage");return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){await this.refreshWebviews();let t=(await this.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph,n=await this.getCurrentPackage(),o=[];for(let[i,a]of t.idToElement.entries()){if(o.some(l=>l.id===i))continue;let s=a.getAttribute("content-desc");(Ms(a.tagName)||n==="com.android.chrome"&&s==="Web View"&&a.tagName.toLowerCase().startsWith("frame"))&&o.push({id:i,originalElement:a,bounds:Oo(a)})}return o}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await ee().startAsyncSpan("EMULATOR_READ_STATE",()=>t.getBrowserState({abortSignal:this.aborter.controller?.signal,serializationOpts:{noId:!0}}),{name:"Get webview content",signal:this.aborter.controller?.signal})).serializedTree}async getDomState(e){return await ee().startAsyncSection("Get emulator state XML",async()=>{let n;if(!e?.skipFetchingFullWebviewContent)try{n=await this.getActiveWebviewContent()}catch(c){this.logger.error({err:c},"Could not get webview info to get the nested DOM state")}this.throwIfAborted();let i=e?.filterOffscreenElements??!0?await this.getViewportBounds():void 0,a=await this.getPageSource();return{graph:await yx(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await ee().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.getPageSource(),{name:"Get Android page source",signal:this.aborter.controller?.signal})}async getViewportBounds(){let e=await this.driver.getWindowRect();return{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}async refreshWebviews(){try{await this.refreshWebviewsHelper()}catch(e){this.logger.warn({err:e},"Error refreshing webviews, continuing...")}}async refreshWebviewsHelper(){await this.getPageSource(),this.throwIfAborted();let e=await this.getCurrentPackage(),t=await this.getDetailedContexts();if(!t){this.logger.warn("No context details, not proceeding with refreshing webviews");return}let n=Date.now(),o=new Set;for(let i of t){if(this.throwIfAborted(),i.webview==="NATIVE_APP")continue;let a=i.info["Android-Package"];if(e&&a!==e&&this.logger.warn({packageName:a,currentPkgName:e},"Ignoring webview not in the active package"),o.add(i.webview),!this.webviews.has(i.webview)||!this.webviews.get(i.webview)?.active){let s={contextId:i.webview,packageName:a,active:!1,lastSeen:n,socketName:i.proc.startsWith("@")?i.proc.substring(1):i.proc};this.logger.info({contextId:s.contextId,packageName:s.packageName,socketName:s.socketName},"New webview detected"),this.webviews.set(i.webview,s);let c;if(a==="com.android.chrome"?(this.logger.info({webviewInfo:s},`Connecting Playwright to Android Chrome: ${i.webview}`),c=await this.connectPlaywrightToChrome(s),this.logger.info(`Connected Playwright to Android Chrome: ${i.webview}`)):(this.logger.info({webviewInfo:s},`Connecting Playwright to webview: ${i.webview}`),c=await this.connectPlaywrightToWebview(a,s.socketName),c&&this.logger.info(`Connected Playwright to webview ${i.webview}`)),!c)continue;s.browserController=c,s.active=!0}}for(let[i,a]of this.webviews.entries())!o.has(i)&&a.active&&(this.logger.info(`Disconnecting dead webview ${i}`),this.disconnectPlaywrightFromWebview(a),a.active=!1)}async getActiveWebview(){await ee().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviews()});let e=await this.driver.execute("mobile: getCurrentPackage");e!==void 0&&typeof e!="string"&&this.logger.warn({currentPkg:e},"Unexpected getCurrentPackage result");let t=[];for(let n of this.webviews.values())n.packageName===e&&n.active&&t.push(n);if(t.length!==0){if(t.length>1)throw new Error("Multiple active webviews in a single package is currently not supported");return t[0]}}async executeRawADBCommand(e){let t=this.driver.capabilities,n=s=>{if(!t||typeof t!="object")return;let c=t[s];return typeof c=="string"?c:void 0},o=n("deviceUDID")||n("udid")||n("appium:udid")||n("appium:deviceUDID"),i=e.trim().split(/\s+/).filter(s=>s.length>0);this.logger.info({serial:o,cmdArgs:i},"Executing ADB command");let a=await ht(i,{serial:o,timeoutMs:15e3,throwOnError:!0});return this.logger.info({result:a},"ADB command result"),a}async cleanupWebviews(){for(let[e,t]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(t),t.active=!1}async getDetailedContexts(){return await ee().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=Ix.parse(t)}catch(o){throw new Error(`Failed to parse contexts. Original error:
|
|
4336
|
+
${A||""}`}return E}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:Xg(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=Xg(this.properties),e}},Qg=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let 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(Zg.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,E=i(h,f).length;if(g<E)break;let{clone:b,used:C}=a(h,f,g);if(C>g)break;d.children.push(b),b.parent=d,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 _z(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 Pz(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?(Jl({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?(Jl({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 wR({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 E=($,fe={})=>{},b=r.backendDOMNodeId,C=wz.includes(r.role?.value?.toLowerCase()??"");if(!C&&b===void 0)return E("Filtering out node since it doesn't exist in the DOM"),[];let R=b?i.backendIdToNode[b]:void 0;if(!C&&!R)try{let $=await z(g.send({method:"DOM.describeNode",params:{backendNodeId:b}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if($&&$.node.nodeName.toLowerCase()==="slot"&&$.node.distributedNodes?.length)h.debug({redirectedDomNode:R,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:$},"Redirecting node to assigned slot");else return E("Filtering out node since it doesn't exist in the DOM",{cdpResult:$}),[]}catch($){return E("Filtering out node since it doesn't exist in the DOM",{err:$}),[]}if(R&&e&&l&&u&&r.backendDOMNodeId&&!Pz(R,u,h,f))return R.momenticIgnored=!0,[];if(R&&R.computedStyles.display==="none")return R.momenticIgnored=!0,[];if(R&&R.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&R.tagName.toLowerCase()!=="input")return R.momenticIgnored=!0,[];if(c===!1)return R.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",M=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",A=new Jg({domNode:R,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:M,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter($=>(m??TR).includes($.name)||vR.includes($.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+_z(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),I=n,k=a[t],W=t;if(R?.tagName.toLowerCase()==="iframe"&&R.ownedFrameId){let $=n.childFrames.find(Ce=>Ce.frameId===R.ownedFrameId),fe=o[$?.frameId??""]?.root,se=a[$?.frameId??""];if($&&fe&&se){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Ce=fe;r.childIds=Ce.childIds,I=$,k=se,W=$.frameId}}let ie=R?.childrenBackendIds?.length??0,ge=(r.childIds??[]).filter($=>!!k.get(parseInt($))).length;if(ie>ge){let $=r.childIds?.map(se=>k.get(parseInt(se))).filter(Boolean).map(se=>se?.backendDOMNodeId).filter(se=>se!==void 0)??[],fe=0;for(let se of R?.childrenBackendIds??[]){if($.includes(se)){fe=(r.childIds?.findIndex(_e=>k.get(parseInt(_e))?.backendDOMNodeId===se)??0)+1;continue}let Ce=i.backendIdToNode[se];if(!Ce||Ce?.tagName.toLowerCase()!=="svg")continue;let Me=Math.floor(-1*Math.random()*1e7),Jt={nodeId:Me.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:se,frameId:W,role:{type:"string",value:"graphics-symbol"}};k.set(Me,Jt),r.childIds||(r.childIds=[]),r.childIds.splice(fe,0,Me.toString()),fe++}}if(r.childIds?.length===1&&R){let $=k.get(parseInt(r.childIds[0])),fe=$?.role?.value,se=R.childrenBackendIds;if($&&fe==="StaticText"&&se.length===1){let Ce=i.backendIdToNode[se[0]];if(Ce?.tagName?.toLowerCase()==="span"){let Me=Math.floor(-1*Math.random()*1e7).toString(),Jt={nodeId:Me,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Ce.backendNodeId,frameId:W,childIds:[$.nodeId]};$.parentId=Me,k.set(parseInt(Me),Jt),r.childIds=[Me]}}}for(let $ of r.childIds??[]){if(!$)continue;let fe=k.get(parseInt($));if(!fe)continue;let se=await wR({node:fe,parent:A,domGraph:i,axGraph:o,frameId:W,frameContext:I,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});se.length&&(A.children=A.children.concat(se))}if(A.role==="StaticText"&&(A.children=[]),A.children.length===1&&A.children[0].role==="StaticText"){let $=A.name,fe=A.children[0]?.name;($===fe||!fe)&&(A.children=[])}let At=[];for(let $=A.children.length-1;$>=0;$--){let fe=A.children[$];if(fe.role!=="StaticText"){At.push(fe);continue}if($===0||A.children[$-1].role!=="StaticText"){At.push(fe);continue}A.children[$-1].name+=fe.name}if(A.children=At.reverse(),!A.isInteresting(p)&&r.parentId)return R&&(R.momenticIgnored=!0),A.children;for(let $ of A.children)$.parent=A;return Lz(A),R&&d&&Yg(R,i),[A]}function CR({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:Zg.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=Kg(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=CR({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function RR({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=Sz(),E=A=>{let I=A.allNodes.filter(W=>!W.ignoredReasons?.find(ge=>(m??TR).includes(ge.name))),k=new Map;return I.forEach(W=>{k.set(parseInt(W.nodeId),W)}),k},b={};Object.entries(r).forEach(([A,I])=>{b[A]=E(I)});let C=await wR({node:h,domGraph:e,parent:null,inputNodeMap:b,axGraph:r,frameId:g,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride: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 R={},v={},M={};return CR({node:C[0],a11yIdNodeMap:R,dataMomenticIdMap:v,selectorToNodeMap:M,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new Qg(C[0],R,v,M)}function Iz(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<AR&&!fr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(xR(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 Oz(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||Ez.includes(a);if((fr.relevantElementAttributes.includes(a)||MR(a,t))&&!c){let u=Iz(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&yR.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of yR)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 Lz(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(ft(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of r.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let m=u.children.filter(g=>g.tagName==="th");if(m.length){if(i=m.map(g=>ft(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 Nz(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function xR(r,e){if(e&&_R(r,e))return!0;if(fr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(fr.alwaysInterestingClassNames.includes(r))return!0;for(let t of fr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function MR(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 _R(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 wu=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await z(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new x("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await j(dt),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await z(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new x("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await z(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new x("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await z(this.session.send(e,t),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await z(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new x("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await z(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await z(t.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};var Bi="<empty>";function Dz(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 OR(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||Dz(r.url)}async function kz(r,e){let t=await r.send({timeout:ne,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:ne,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:ne,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:Fi,method:"Page.getFrameTree",params:{}}),r.send({timeout:Fi,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(OR(d.frame))return null;try{return await LR({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 LR({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await kz(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Kn(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(OR(g.frame))return null;try{return await LR({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 Uz(r){try{return await r.owner().count()===1}catch{return!1}}async function Fz(r){try{return await r.count()===1}catch{return!1}}async function Qr(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,Bi]){let p=o.frameLocator(d===Bi?"iframe":`iframe[${d}]`);if(await Uz(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new x("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...r.locationData.attributeSelectors,Bi]){let u=o.locator(l===Bi?"iframe":`iframe[${l}]`);if(await Fz(u)){a=u,i.push(l);break}}if(!a)throw new x("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${r.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l,{timeout:oe}),c=await s.asElement().contentFrame();if(!c)throw new x("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function PR(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 NR({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===Bi?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===Bi?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 Qr(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=PR(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 Qr(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=PR(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 Qr(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 Qr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new kr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function Cu(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function eh(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function DR(r){let e=eh(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 kR(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 UR({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await Bz({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 Bz({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox(),i=await vs({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(E=>setTimeout(E,250));let g=Date.now();for(;Date.now()-g<1e3;){let E=a.scrollTop;if(E===s)break;s=E,await new Promise(b=>setTimeout(b,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:Te,codePath:"scrollIframeIntoView",signal:t});i.didScroll&&e.info({oldBb:n,newBb:await r.boundingBox(),evalResult:i},"Successfully scrolled iframe into view")}import{create as zz,windowedFiniteBatchScheduler as Hz}from"@yornaath/batshit";import{reduce as Gz}from"lodash-es";var Vz=100,Wz=2e3;function FR(r){return zz({fetcher:async t=>{r(Gz(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:Hz({windowMs:Wz,maxBatchSize:Vz})})}async function BR({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:ne})??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 Zr}from"crypto";import jz from"js-beautify";var $z=["Dead"],Ru=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:Zr(),type:"PRESET_ACTION",command:an(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=an(i);a={id:Zr(),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=an(i);a={id:Zr(),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=an(i);a={id:Zr(),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:Ee(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=jz.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=AC(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,...Ee(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($z.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=an("TYPE");i={id:Zr(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=an("PRESS");i={id:Zr(),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:Zr(),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:Zr(),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=an(l);u.deltaY=Math.abs(i);let d={id:Zr(),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=an(l);u.deltaX=Math.abs(i);let d={id:Zr(),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 th}from"zod";var Pwe=th.object({type:th.literal("url"),url:th.string()});var xu=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=eh(e),{frame:o,mPathSelectorTokens:i}=await Qr(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 NR({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(Cu(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:Cu(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await UR({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:Te})],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(Qr(c,n).then(({frame:u})=>z(u.evaluate(e,t),{milliseconds:Te})).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 Sr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new x("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await Sr({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 Sr({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 Sr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await Sr({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 Sr({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:kn,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=hR({node:o,domGraph:this.domGraph});return fR(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:Te});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await SR(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(Mr(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 x&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await j(dt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Cu(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=Kn(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 Qr(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Qr(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new x("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await RR({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 Qr(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.userControlledBrowserSettings.visualActions)return t;let n=this.logger;return await st({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:Te,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(Kn(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Kn(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:ne,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:ne,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:ne,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 Sr({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 Sr({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 Sr({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 Sr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Te}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await Sr({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:ne}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await j(dt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new x("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return gR({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=DR(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 Ms=class r{static USER_AGENT=Su;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}){NE(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={[hu]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(eR(t))),a.push(this.context.addInitScript({content:`${Eg.htmlUtilsLibJs}
|
|
4337
|
+
//# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:Gg(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:`${Eg.htmlUtilsLibJs}
|
|
4338
|
+
//# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Gg(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"&&e1()==="darwin"&&Kz("system_profiler SPDisplaysDataType").toString().includes("Retina"))w.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let d=async()=>{let 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 wu.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 xu({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 QC(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 qg(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=rh(),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()||!_o(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=rh(),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=>{kC(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(BC(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=FR(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await Dg({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("**/*",WC(this.customHeaders,this.logger))),Rr&&await e.route("**/*",Rs),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"||!_o(t)||this.recentFrameNavigations[o]&&Date.now()-this.recentFrameNavigations[o]<1e3)return;this.recentFrameNavigations[o]=Date.now();let i=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(s){this.logger.warn({err:s},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(a){a.name!=="AbortError"&&this.logger.warn({err:a,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await z(Wg(this.getBrowserCallbacks()),{milliseconds:oe})}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<Fi;){a++,n?.throwIfAborted();try{if(await st({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:oe,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){t.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await j(dt),a%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),st({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:ne,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(Po),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??Te}),c=Buffer.from(s.data,"base64"),l=await HR.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&&Jz(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:ne});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 E=await HR.fromBuffer(c),b=E.bitmap.width,C=E.bitmap.height;m=Math.max(0,Math.min(m,b-1)),g=Math.max(0,Math.min(g,C-1)),h=Math.max(1,Math.min(h,b-m)),f=Math.max(1,Math.min(f,C-g)),c=await E.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(E){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${E}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:n=this.pageLoadTimeout}){eC(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await j(dt),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:oe})}if(!i)throw new x("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(MC.has(s))throw new x("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await st({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:oe,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 oR({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(Po),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(t.clearContent)if(a||t.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:t.delay??wf}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Te})}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:Te})}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 vu({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:oe}),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 DC(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let a=await this.setCookie(i);t=t.concat(a)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:oe});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:oe,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.info(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await NC(this.page,o,this.logger),this.logger.info(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await LC(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new x("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return qg(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 Ur)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(!Ag.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:ne})),!o||!o.width||!o.height)return n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0,{scrollPerformed:!0};let{x:i=0,y:a=0,width:s=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-c)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1)return{scrollPerformed:!0};e.boundingBox=o;let l=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(l),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,locator:t,requirements:n}){let o={},i=!!n?.position&&n.position!=="irrelevant",a=!!n?.shape&&n.shape!=="irrelevant";if(i||a){let s=await t.boundingBox({timeout:ne});if(!s||!s.width||!s.height)throw new x("ActionFailureError","Element does not have a bounding box as required");a&&(o.shape={width:s.width,height:s.height,tolerance:n.shape}),i&&(o.position={x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height,tolerance:n.position})}if(n?.text){let s=await t.textContent({timeout:ne});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||fr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:ne});u!==null&&(s[c]=u)}catch(u){e.warn({err:u,attr:c},"Failed to fetch required attribute, continuing...")}}o.attributes=s}return o}async getAdditionalElementDetails({mainLocator:e,additionalElement:t,root:n,logger:o}){let i=this.stateManager.a11yIdToNodeMap[t.id];if(!i)return;let a=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:n,node:i});if(e.contentFrame!==a.contentFrame)return;let s=await this.fetchHtmlAttributes({locator:a,logger:o});if(!s?.generatedSelectors||s.generatedSelectors.length===0)return;let c={selectors:s.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({logger:o,locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,s=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let l=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!l)continue;s.push(l)}catch(l){this.logger.warn({err:l,additionalElement:c},"Failed to fetch additional element details, continuing...")}return s}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:s}){if(t)try{o.requirements=await this.getElementRequiredValues({logger:s,locator:i,requirements:t})}catch(c){s.warn({err:c},"Failed to generate required values for target")}n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:s}){if(e<0)throw new x("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new x("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let l=this.stateManager.frameConfig,u,d,p,m;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let b=c.parentFrame,{cache:C,config:R}=await this.stateManager.getAutoFrameDetailsFromHandle(b);d=C,p=R,u=R.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:Ee(i),frameCache:d},f,E=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:kR(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),E=!0),await this.updateCacheWithNewNodeDetails({node:c,target:h,locator:g,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:s,target:h,root:u,locator:g,logger:i}));try{return{resolution:{locator:g,a11yNode:c,displayString:c.getNodeOnlySerializedForm(),decisions:[]},target:h,frameConfig:p,frameConfigSource:m}}finally{E&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:s}=n;if(t.frameCache&&this.userBrowserSettings.autoExpandIframes){let 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(dt,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 va)break;if(g instanceof Ur){if(d++,d>2)throw i.error({err:g},"Got multiple cache disqualification errors, giving up"),g;i.warn({err:g},"Got cache disqualification error, waiting and retrying resolution"),await j(dt,a)}a?.throwIfAborted(),m&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await j(dt,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=Hi(t),l=[],u,d=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),p;if(t.generatedSelectors||t.hybridSelector){let m;try{m=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(g){p=g,g instanceof kr&&(l.push(...g.decisions),u=g.cacheMissReason)}if(m)return{...m,pageState:void 0,decisions:[...l,...m.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:p?.message,selectors:Hi(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw p;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let m=await this.resolveTargetWithSecondaryMethods({root:e,tree:d,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(m)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Ee(o),m;u=u??"secondary-resolution-failed"}throw new kr("Could not find any relevant node given target",l,u)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new va("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:kn,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:vg,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles}},{css:l,hybrid:u}=await st({fn:v=>window.evaluatePrimaryCaches(v),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c},hybridParams:s&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c}:void 0},root:e,timeout:ne,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,p,m=[];if(s==="prefer"&&u?.result){d=u.result;let v={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};m.push(v),p="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let v=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,M=d.workingSelectors.slice(0,5);m.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:v,selectors:M}),n.debug({reason:v,workingSelectors:M},"Resolved with CSS selectors"),p="CSS_SELECTOR"}else throw m.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),u&&m.push({type:"HYBRID_SELECTOR",matched:!1,reason:u.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:u.logs}),l?.error&&n.error({err:new Error(l.error)},"Cache evaluation errored unexpectedly (CSS)"),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new kr("Cache evaluation failed",m,l.cacheMissReason);let g,h,f;if(this.userBrowserSettings.visualActions){let v=d.mPath;if(!v)throw new Error("Found element did not have an mPath despite using visual actions");let M=v.join(" > ");g=e.locator(M),h=this.stateManager.getNodeUsingMPathSelector(M)}else if(d.dataMomenticId!==void 0)f=parseInt(d.dataMomenticId),h=this.stateManager.dataMomenticIdToNodeMap[f],"workingSelectors"in d?g=e.locator(d.workingSelectors[0]):g=e.locator(Mr(f));else throw new x("InternalWebAgentError","Received an element resolution result with no identifying attributes");s&&t.hybridSelector&&(u?.logs.length===1?a.warn({hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution rejected, continuing..."):u?.result?l?.result&&u?.result&&u.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(u.result.mPath)?n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==u.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):a.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[E,b]=await Promise.all([g.textContent(),g.boundingBox()]);if((E??"")!==(d.textContent??""))throw n.warn({currentTextContent:E,originalTextContent:d.textContent},"Retrying cache resolution because element's text content has changed since resolution"),new Error("Element's text has changed since cache was resolved");if(!b||Math.abs(b.height-d.boundingBox.height)>1||Math.abs(b.width-d.boundingBox.width)>1||Math.abs((b.x??0)-(d.boundingBox.x??0))>1||Math.abs((b.y??0)-(d.boundingBox.y??0))>1)throw n.warn({currentBoundingBox:b,originalBoundingBox:d.boundingBox},"Retrying cache resolution because element's bounding box has changed since resolution"),new Error("Element's bounding box has changed since cache was resolved");let C=Hi(t);await this.updateCacheWithNewNodeDetails({node:h,target:t,locator:g,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let R=nh(C,t);return R&&Object.keys(R).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ee(n),t.cacheResolutionUpdateSource=p),{a11yNode:h,displayString:d.serializedElement,locator:g,decisions:m}}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:oe}),m=await _r(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 x("ActionFailureError",`CSS selector '${n}' failed to resolve after ${l} attempts: ${h.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":h}`),await j(dt,i)}}throw u}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:t,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:ne});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<xC){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let l=await st({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:Te,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(vg*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(Mr(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 _r(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=Hi(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=nh(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ee(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&&Ag.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions],pageState:void 0}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`,elementImageUrl:s}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshotUrl:e,oldTarget:t,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(e)).arrayBuffer(),l=n1(),u=await this.enricher.runTemplateMatching({id:l,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:d,locator:p}=await this.getTargetFromPositionPercentages({percentX:u.x,percentY:u.y,allowNotActionableNodesOverride:o}),m=d.boundingBox?.width,g=d.boundingBox?.height;if(!m||!g)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let h=d.id,f=this.stateManager.a11yIdToNodeMap[h],E=Hi(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let b=nh(E,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=Ee(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:b,templateMatch:u},"Updated cache after template matching resolution")),{locator:p,a11yNode:f,displayString:d.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:e}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:oe})??"",i=nR.some(a=>a===o.toLowerCase());return await jg({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 jg({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(),su(s,t,n)){a=!0;break}await j(dt,this.abortSignal)}if(!a)throw new x("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${uw(t)} in ${o}ms.
|
|
4339
|
+
Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,n={}){await this.highlight(e),await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:ne});if(!o)throw new x("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=n.steps??5;await this.page.mouse.move(i,a,{steps:s}),await j(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,Te):500),await this.highlight(t),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:ne});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(Po),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Oo({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:ne});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 Oo({func:t=>t.locator.focus({timeout:Te}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await st({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:oe,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Oo({func:t=>t.locator.blur({timeout:Te}),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 Oo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${t.index} is not a number`)}await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?Number(t.index):void 0},{force:n,timeout:ne})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=Au(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=Au(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Vg(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=Au(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Vg(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:kn;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 x("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${p}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await st({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:ne,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(Po,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<RC)){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 uR(this.page,e,t,n)}async mouseDragUsingVisualCoordinates(e,t,n,o,i){await cR({page:this.page,deltaX:e,deltaY:t,steps:n,delayMs:o,visualTarget:i,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:ne}),n=await z(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:Te});process.platform==="darwin"&&n===1&&(n=wC);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let b=0;b<s.length;b++)if(c[b]===e){d=l.indexOf(b);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[p=0,m=0,g=0,h=0]=u[d];p/=n,m/=n,g/=n,h/=n;let f=p+g/2,E=m+h/2;return{centerX:f,centerY:E}}async scrollVertical(e){return $g({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 $g({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=GR(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await j(dt)}}throw o}async switchToPageHelper(e,t){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
|
|
4340
|
+
Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!_o(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=zl(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&&BR({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];_o(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},dt);let s=async()=>{clearInterval(t)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,t,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let a=window;a._MOMENTIC_RECORDING_ACTIVE=!0,a._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!1,i._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:oe})}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 vs({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new x("UserInfrastructureError",`The page with URL ${ft(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await vs({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 Qz.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:n}=await st({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:Te,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new x("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t,n,o=Te){let i=await this.getActivePageOrFrame();return st({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=Ln}){let i=VC(),a={code:e,fragment:t,context:n},{result:s}=await z(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new x("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:Te});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:oe})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:n}){if(t<0||t>1||n<0||n>1)throw new x("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*t),d=Math.ceil(i*n),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:oe,params:{highlightConfig:mR,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:oe,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:oe})}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[hn],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Mr(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:ne})??{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:ne})??void 0),!n){let C=await _r(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:E}=await e.evaluate(C=>{let R=window;if(!R.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return R.performTargetRedirection(C)},void 0,{timeout:oe}),b=Date.now()-o;if(m){t.warn({error:m,serializedElement:g,duration:b,force:f,logs:E},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:g,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(Mr(d)),hints:{relativeXYToLocator:h,force:f}};if(p)return t.info({newMPathSelector:p,serializedElement:g,duration:b,force:f,logs:E},"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:b,force:f,logs:E},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:g,duration:b,force:f,logs:E},"Forcing click on original element"),{locator:e,hints:{force:f}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:Te});if("error"in s&&s.error)throw s.error.startsWith(TC)?new pl(s.error):s.error.startsWith(vC)?new ml(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:oe})}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!!_C}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,Lg(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Mu(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()||GR(e),o=Yz(e),i=t1(e),a=Dp[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Mu(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:Zz.getType(e)||"application/octet-stream"},{timeout:fu})}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??rh();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??CC}get userBrowserSettings(){return Hi(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Fi}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=Tu();for(let t of e)if(!(!Mu(t)||!zR(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=r1(t,o);return Mu(i)&&zR(i).isDirectory()&&Xz(i).length>0})))return t}};import O1 from"fetch-cookie";import{cloneDeep as dx}from"lodash-es";import{CookieJar as L1}from"tough-cookie";async function yr({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 o1=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function VR({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(o1.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(_o(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 en(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}import{randomUUID as u1}from"crypto";var jR={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},$R={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},WR=/<(\S+) id="(\d+)".*?>/g,i1=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,qR=["h1","h2","section","footer","nav","aside","form","label","dialog"],a1=[...qR,"span","div","h3"],s1=["table","select","form","ul","ol","menu","pre","code","dialog"],l1=["table","form","dialog","nav","section","ul","select"];function _u(r){return c1(r)}function c1({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
|
|
4341
|
+
`),l=0,u=[],d=0,p=[],m=[],g=!1;for(;l<c.length;){g&&(s.push({ids:p,content:u.join(`
|
|
4342
|
+
`),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(WR)).map(G=>G&&G.length>=3?{tagName:G[1],id:G[2]}:void 0).filter(G=>!!G),v=Array.from(h.matchAll(i1)).map(G=>G&&(G[2]||G[4])).filter(G=>!!G);v.reverse();let M=h.replace(/ id="[0-9]+"/g,"");u.push(M);for(let G of C)p.push(G.id),m.push(G);for(let G of v){let $=m[m.length-1];$&&$.tagName===G&&m.pop()}let A=m.some(G=>s1.includes(G.tagName)),I=c[l+1]??"",k=Pr(I),ie=Array.from(I.matchAll(WR)).map(G=>G&&G.length>2?G[1]:void 0).filter(G=>!!G),ge=ie.some(G=>qR.includes(G)),At=ie.some(G=>a1.includes(G));d+k>=i&&(g=!0),d>=n&&(ge&&!A||v.some(G=>l1.includes(G)))&&(g=!0),d>=o&&At&&!A&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
|
|
4343
|
+
`),tokenLength:d}),s.forEach((h,f)=>{let E=h.ids[0],b=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:E,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var d1=75e4,Pu=3e5;async function No(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>d1)try{let p=_u({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await m1({...r,tokenLimit:Pu-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(Pu*jn),u=l.serialize();let m=Pr(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Pu)try{if(o){let p=_u({serializedTree:u,options:$R,logger:i}),m=u1();l=await z(p1({...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=_u({serializedTree:u,options:jR,logger:i});l=await z(g1({...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(Pu*jn),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function p1({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:Ee(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function m1(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:Ee(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 g1(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:Ee(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 ih(r,e){if(!r.description)throw new x("UserConfigurationError","Cannot locate element with empty description");return yr({action:async()=>h1(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function h1(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,E=r.description,b=r.useMemory&&!t;n&&(E=await ws({orgId:p,s:E,context:n,localTools:g,signal:f,logger:l})),a&&(E=S1(E,a));let{serializedTree:C,tree:R}=await en(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),v,M=Date.now(),A;for(;!v&&Date.now()-M<3e3;){f.throwIfAborted();try{v=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(se){A=se}}if(!v)throw new x("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${A?.message}`);let I=C,k=!1,ie=`data:image/jpeg;base64,${v.toString("base64")}`;I=await No({type:"locator",description:E,screenshot:ie,serializedTree:C,options:{aiPageFiltering:c},tree:R,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),I!==C&&(k=!0);let ge=await h.getElementLocation({browserState:I,goal:E,screenshot:ie,source:a,memory:b?s:void 0},{disableCache:t,abortSignal:f,loggerTags:Ee(l),useMemory:b});if(l.debug({usedRag:k,result:ge},"Got locator result"),!(ge.id>0))throw new Cn(`Could not find any relevant element: ${ge.thoughts}`,ge.updatedMemory?{type:"GCS_TRACES",traces:ge.updatedMemory}:void 0);let{resolution:G,target:$,frameConfig:fe}=await m.createTargetFromA11yId({id:ge.id,requirements:ge.requirements,additionalElements:ge.additionalElements,description:E,targetSource:"AI",logger:l});if(G.a11yNode?.properties?.hidden&&G.a11yNode?.properties?.hidden!=="false")throw new x("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${G.displayString}`);return b&&(ge.updatedMemory?$.memory={type:"GCS_TRACES",traces:ge.updatedMemory}:s&&($.memory=s)),{thoughts:ge.thoughts,target:$,resolution:G,frameConfig:fe,screenshot:ie}}var f1=["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:"],KR="<select> element:",YR="text input or contenteditable element:",XR="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:",JR="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:",oh=[KR,YR,XR,JR,...f1];function QR(r,e){if(r===e)return!0;for(let t of oh){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(oh.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!oh.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function S1(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${KR} ${r}`;case"TYPE":return`${YR} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${XR}
|
|
4344
|
+
${r}`;case"ELEMENT_CHECK":return`${JR}
|
|
4345
|
+
${r}`;default:return r}}var y1=15;async function Iu({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=y1}){if(!r.assertion.trim())throw new x("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=au(c),u=0,d=Date.now(),p,m,g;try{await yr({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(f){t.warn({err:f},"Failed to clear highlights before AI check, continuing...")}let h;for(;u<a&&(!h||h-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await j(l,n.abortSignal),h=Date.now();let f=!1;try{if(p=await yr({action:async()=>{let b=await ZR(s,t,n.abortSignal);return m&&m.serializedTree===b.serializedTree&&m.screenshotBuff.equals(b.screenshotBuff)?(f=!0,p):(m=b,ex({command:r,state:b,fixtures:n,useMemory:i,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:o}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),p?.success){p?.updatedMemory&&Es(r,p.updatedMemory,t);break}else throw p?.thoughts?new x("AssertionFailureError",p.thoughts):new x("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(E){n.abortSignal.throwIfAborted(),g=E instanceof Error?E:new Error(`${E}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:E},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await yr({action:async()=>ex({command:r,state:await ZR(s,t,n.abortSignal),fixtures:n,useMemory:i,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(f){n.abortSignal.throwIfAborted(),g=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(p?.updatedMemory&&Es(r,p.updatedMemory,t),!p?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new x("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function ZR(r,e,t){let[n,o]=await Promise.all([en(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function ex({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,E=f.toString("base64"),b=u.url(),C=r.contextChoice??"MULTIMODAL",R=g;C!=="VISION_ONLY"&&(R=await No({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:E,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),R!==g&&(m.ragUsed=!0),m.pageState=R);let v={goal:r.assertion,url:b,memory:o?r.cache?.memory:void 0,browserState:R,screenshot:E,contextChoice:C,source:c},A=await(C==="VISION_ONLY"?(I,k)=>d.getVisualAssertionResult(I,k):(I,k)=>d.getAssertionResult(I,k))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:Ee(l)});return(A.result||i)&&A.relevantElements&&(m.relevantElementsSerialized=A.relevantElements.map(I=>u.getSerializedFormFromA11yId(I)).filter(I=>!!I),await b1(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function b1(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 E1=75e4,Ou=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function tx(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await T1(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Ou?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 T1(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await j(o.smartWaitingTimeout,n);return}if(!e.description)throw new x("UserConfigurationError","Cannot locate element with empty description");await z(v1(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function v1(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await yr({action:async()=>A1(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function A1(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 ws({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await en(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Pr(p)>E1)throw new Ou;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new x("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let E=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:Ee(n)});return n.debug({result:E},"Got smart waiting result"),E.isPageReady}import{cloneDeep as nx}from"lodash-es";async function ox(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>uf(e.cache)?e.cache:void 0,a=i(),s=nx(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=mw(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 rx({cacheToUse:a,params:r});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new x("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Qs(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await rx({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=dg(g.target),g.updatedAt=new Date),d}async function rx({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!Tn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=eu(t.assertion),l,u=!1,d=nx(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=>w1(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ca(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 x)||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 w1(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await C1(r,e.assertion)}async function C1(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:ft(a,500,!0)},!Kr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=hr(e);t=!1,n=new x("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ft(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await r.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new x("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),t=!1;break}if(!Kr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=hr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new x("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},Lt*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:Lt*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:Lt*1e3});break}case"FOCUSED":{t=await r.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(t=e.negated?!t:t,!t){let a=hr(e);n=new x("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!Kr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=hr(e);t=!1,n=new x("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!Kr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=hr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The style property ${e.property} ${s}`):n=new x("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:t,data:o,err:n}}function ix(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as R1}from"jimp";async function _s(r,e){let t=await r.screenshot(e),n=await R1.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as ax}from"jimp";import ah from"jpeg-js";import x1 from"pixelmatch";async function sx({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!Tn(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 ie=>_s(o,{locator:ie.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await _s(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let W=`${l.width}x${l.height}`,ie=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${W}) does not match saved screenshot dimensions (${ie}) - 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 ax.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await ax.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,E=g.width*g.height,b=Math.abs(p.height-g.height),C=Math.abs(p.width-g.width);if(f>E){let W=d.cover({w:g.width,h:g.height});l.buffer=await W.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(E>f){let W=m.cover({w:p.width,h:p.height});u.buffer=await W.getBuffer("image/jpeg"),h="saved"}let R={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=t.threshold??.1,A=x1(ah.decode(u.buffer).data,ah.decode(l.buffer).data,R.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=A>v*100,k=`Visual diff of ${A.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${v*100}%.`;if(h&&(k+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${C} pixels.`),I)throw new x("ActionFailureError",k);return{fail:I,thoughts:k,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:ah.encode(R,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var M1=3e4;function _1(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 Lu({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??M1/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(ki(r.url)&&(c=r.url),t&&Ui(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await z((async()=>{let g=s?`${l}?${s}`:l;try{let h=_1(r),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:r.method,body:h.content})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new x("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new x("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let 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 P1=5e3;async function cx({timeout:r=Lt,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await Nu(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),P1);else return i}return i=await Nu(e),i}async function Nu({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(lx,{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(lx,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?mn.CONTAINS:gn.CONTAINS;a=new x("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new x("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function lx({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 I1=3e4;async function ux({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??I1/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(ki(r.url)&&(s=r.url),t&&Ui(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=await z((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new x("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var Du=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([en(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 No({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:{...Ee(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([en(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 No({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:{...Ee(a)},langfuseSessionId:s})}catch(g){throw new x("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return en(this.browser,e)}async locateElement(e){return await ih({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return yr({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 x("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await yr({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&&zd(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Vd(i)||Hd(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(Wd(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof Ur&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof x?n:new x("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new x("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await j(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:n,target:o,originalCache:i,action:a,options:s,command:c}=e,{disableCache:l,useSelector:u,targetName:d,targetHealingInProgress:p,source:m}=s,g=this.logger.child({commandId:c.id}),h=this.shouldUseMemory(),f=s.retriesWithAI??1,E=!1,b=dx(e.cache);if((!b||l)&&!xd(o))throw new x("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(g.info("Cache explicitly disabled for this step"),E=!0,b=void 0),b&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&b.targetSource==="HEURISTIC_HEALED"&&(E=!0,b=void 0),b?.inputDescription&&!QR(o.elementDescriptor,b.inputDescription)&&(g.warn({old:b.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),E=!0,b=void 0);let C=v=>!!v&&Qs(v),R=!0;if(!C(b)){R=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:E,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(E||!i)&&await tx({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let v;try{v=await ih({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(I){if(I instanceof Cn&&I.updatedLocatorMemory){let k={id:-1,...i,memory:I.updatedLocatorMemory};ru({cmd:c,key:d,newTarget:k,logger:g,updatedWithAI:!0})}throw new x("ActionFailureError",I.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let M=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,g),A=await a(M);return ru({cmd:c,key:d,newTarget:v.target,logger:g,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=Ee(g)),{result:A,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,b,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let M=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,g),A=await a(M);if(Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.14.0"]),ru({cmd:c,key:d,newTarget:b,logger:g,updatedWithAI:!1}),R){let I=v.decisions.filter(k=>k.matched);if(I.length!==1)g.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let k=I[0].type;n.recordTargetAutoHeal({healType:k})}}return{result:A,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let M="unknown";v instanceof kr&&v.cacheMissReason&&(M=v.cacheMissReason),Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.14.0",`missReason:${M}`]);let A=!1;if((v instanceof Ur||zd(v)||Vd(v)||Wd(v)||fS(v)||Hd(v)||SS(v))&&(A=!0),v instanceof x&&!A)throw g.error({err:v},"Failed to execute action with cached target (fatal)"),v;if(f>0&&o){g.info({err:v},"Failed to execute action with cached target, retrying with AI");let I;return b.memory&&of(b.memory)&&(I=b.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:I,retriesWithAI:f,targetHealingInProgress:!0}})}throw new x("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return _s(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await j(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new x("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&Df(n)?await this.browser.waitForDOMStability({timeout:Te}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:oe}),this.options?.autoFollowNewTabs&&await VR({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{gu(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Pg(e)}}async resolveCommandTemplateStrings(e,t){return mu({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()?Iu({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new x("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new x("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Iu({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new x("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=LE(n.schema);if(h)throw new x("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:Ee(a)});if(h.result==="NOT_FOUND")throw new x("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new x("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new x("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new x("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!ki(n.url)&&!Ui(n.url,this.browser.baseUrl))throw new x("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new x("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,g;if(n.target&&Lr(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:E,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:C=>this.browser.hover(C),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=E,g=b}let h=this.browser.getViewport()?.height??Pn.height,f=this.browser.getViewport()?.width??Pn.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 x("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 x("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await j(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Lr(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:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),E={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return lu(m,E.urlAfterCommand)&&(E.succeedImmediately=!0,E.succeedImmediatelyReason="URL changed"),E}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Lr(n.fromTarget)&&Lr(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(Lr(n.fromTarget)||Lr(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,{hoverSeconds:n.hoverSeconds,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 x("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Lr(n.target)){await this.browser.mouseDragUsingVisualCoordinates(m,g,h,void 0,n.target.pixels);break}let f,E;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:C}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async R=>this.browser.mouseDrag(m,g,h,R.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,E=C}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:E}}case"SELECT_OPTION":{if(!Tn(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:E=>this.browser.selectOption(E,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ca(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 Xr({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new x("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new x("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&Lr(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=dx(n.target),E=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:C,thoughts:R}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!E,source:Ca(n)}});g=C,h=R}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return lu(m,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(Lr(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(!Tn(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&&!Tn(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 L1,g=O1(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await Lu({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:nl.parse({...f,cookies:Hl(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await ux({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return sx({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,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 IC({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 x("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 Xr({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new x("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=mb.optional().parse(m)}catch(h){throw new x("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??Lt)*1e3,g=this.generator.getAgentConfig()?.assertion;if(ix(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let E=await Iu({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),source:"NEGATED_CHECK"});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${E.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:E.afterScreenshotOverride}}finally{f.cache?.memory&&Es(n,f.cache?.memory.traces,a)}}let h=await ox({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 yr({action:async()=>cx({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 $n(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await kg(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 x("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 $n(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]=Eu(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=Eu(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new x("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 $n(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 $n(n.requestMatcher),async(g,h)=>{let f=await Xr({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),E=gb.parse(f);return new Response(E.body,{status:E.status,headers:E.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(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:Ee(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 Ru({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:Ee(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ee(this.logger)})}};import{cloneDeep as N1}from"lodash-es";import fx from"truncate-json";var px=1e3,mx=5e6,D1=5*1024*1024;function Sx(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=fx(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":gx(n);break;case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":gx(n),Sx(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 gx(r){if(r.type==="MOBILE_PRESET_STEP"){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}}function hx(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 ku(r,e){let t=N1(r);if(Sx(t,e),t.length>px)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,px);let n=hx(t,e);if(n.length>mx)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>mx;)t.pop(),n=hx(t,e);let{jsonString:o}=fx(n,D1);try{return zt.array().parse(JSON.parse(o))}catch(i){throw e.error({serialized:n,err:i},"Could not parse serialized results into JSON structure after processing"),i}}import{AsyncLocalStorage as k1}from"async_hooks";var Ps=new k1;function U1(r){Ps.enterWith({activeTracers:[r]})}function F1(r,e){let t=Ps.getStore()?.activeTracers;if(!t)return e();t.push(r);try{return e()}finally{t.pop()}}async function B1(r,e){let t=Ps.getStore()?.activeTracers;if(!t)return e();let n=[...t,r];return Ps.run({activeTracers:n},e)}var fn={globalAls:Ps,initializeRootTracerContext:U1,withChildTracer:F1,withChildTracerAsync:B1};var Do=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 fn.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 fn.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 fn.withChildTracerAsync(i,()=>t(i,o)),a}catch(a){throw o.error=a instanceof Error?a.message:String(a),a}finally{i.finish()}}finish(){if(!this.finished){this.endTime=Date.now();for(let e of this.spans)e.endTime||(e.endTime=this.endTime,e.durationMs=e.endTime-e.startTime);this.parentSection&&(this.parentSection.endTime=this.endTime,this.parentSection.durationMs=this.parentSection.endTime-this.parentSection.startTime),this.finished=!0}}addSpan(e){this.spans.push(e)}startSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{a=t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}async startAsyncSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{i?.signal||i?.timeoutMs?a=await z(t(o),{milliseconds:i?.timeoutMs??1/0,signal:i?.signal,message:i?.timeoutMsg??`Operation timed out after ${i?.timeoutMs??1/0}ms${"name"in i?` (${i.name})`:""}`}):a=await t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}getRootSpan(){return this.finished||this.finish(),{type:"SECTION",name:"root step span",startTime:this.startTime,endTime:this.endTime,subSpans:this.spans,attributes:{},durationMs:this.endTime?this.endTime-this.startTime:void 0}}};function te(){let r=fn.globalAls.getStore()?.activeTracers,e;return!r||r.length===0?e=void 0:e=r[r.length-1],e||new Do}async function yx(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=z1(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 z1(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 Is(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=Is(i);a.trim()&&e.push(a.trim())}return e.join(" ").trim()}import{mkdirSync as cH}from"fs";import{tmpdir as uH}from"os";import xx from"path";import{diff as lH}from"deep-object-diff";import{cloneDeep as Rx}from"lodash-es";import vx from"fontoxpath";import H1 from"@prettier/plugin-xml";import G1 from"prettier";import{DOMParser as V1,XMLSerializer as W1}from"slimdom";var j1=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 Os(r){let e=r.toLowerCase();return e.endsWith("webview")||j1.has(e)}function $1(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 q1=new Set(["index","package","a11y-important","screen-reader-focusabl"]),K1=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"]),Y1=new Set(["text","hint"]),X1=new Set(["live-region","drawing-order"]),J1=new Set(["displayed","enabled"]);function Q1(r,e){let t={};for(let[n,o]of Object.entries(e))q1.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||K1.has(n)&&o==="false"||Y1.has(n)&&o===""||J1.has(n)&&o==="true"||X1.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function bx(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=Q1(e.tagName,l);for(let[p,m]of Object.entries(u))t.setAttribute(p,m);if(o.set(c,e),i.set(c,t),Os(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(`
|
|
4346
|
+
${p}
|
|
4347
|
+
`));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(!tH(g,s?.viewportBounds))continue;let h=n.createElement($1(g.tagName));bx(r,g,h),t.appendChild(h)}}}function Z1(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;bx(a,e,s);let c=new W1().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function Ex(r,e){let t=new V1,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new Error("No root element found in XML");if(i.tagName!=="hierarchy")throw new Error("No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=Z1(t,i,o,e);return{xml:await G1.format(c,{parser:"xml",plugins:[H1],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function eH(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 Uu(r,e){let t=r.idToElement.get(e);if(t)return eH(t)}function sh(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 ko(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 tH(r,e){if(!e)return!0;let t=ko(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 Tx(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function Ax({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=ko(e),!t))throw new Error("ActionFailureError: Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:Tx(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 Cx({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new Error(`Could not find node with id: ${r.id}`);let o=ko(n);if(!o)throw new Error(`Node ${r.id} has no bounding box: ${n.outerHTML}`);let i=Uu(t.graph,r.id)??"",a=sh(t.graph,r.id)??"",s=Ax({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=Uu(t.graph,u);return m?{xPath:m,requirements:Ax({requirements:d,element:p})}:void 0}).filter(u=>!!u));let l;if(Os(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 lh(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var rH=.1,nH=.25;function Fu(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*rH;case"broad":return o<=Math.abs(e)*nH;case"irrelevant":return!0}}function oH(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!Fu(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 Fu(e.tolerance,a,s,Math.min(1,i))}function iH(r,e){return Fu(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?Fu(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var wx=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0){let c=Is(r);if(c!==o)throw new Error(`ActionFailureError: Resolved element text mismatch: expected ${o}, got ${c}`)}if(n)for(let[c,l]of Object.entries(n)){let u=r.getAttribute(c)??void 0;if(u!==l)throw new Error(`ActionFailureError: Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new Error(`ActionFailureError: Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!oH(t.newElementBounds,a))throw new Error(`ActionFailureError: Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!iH(t.newElementBounds,s))throw new Error(`ActionFailureError: Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function Bu(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=te();if(e.type==="WEBVIEW")return aH(e,r);let a=vx.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new Error(`ActionFailureError: Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let p=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let m of p){let g=vx.evaluateXPathToFirstNode(m.xPath,o);if(!g)throw new Error(`ActionFailureError: Required related element not found for XPath: ${m.xPath}`);wx(g,m.requirements)}})}let s=ko(a);if(!s)throw new Error("ActionFailureError: Resolved native element has no bounding box");wx(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=sh(n,c)??l,u=Uu(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function aH(r,e){let{stateManager:t,logger:n,signal:o}=e,i=te(),a=await t.getActiveWebview();if(!a||!a.browserController)throw new Error("No browser controller is attached to the requested webview");let s=a.browserController.browser;if(!r.browserCache)throw new Error("No browser target available on cache");let c=r.browserCache,l=await i.startAsyncSection("Resolve target in webview",()=>s.resolveTarget(null,c,{logger:n,signal:o}));return{resolvedTarget:{...r,controller:a.browserController,resolution:l}}}function Uo(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;Ol(e)&&(e[t]={...e[t],[n]:ci.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date))}function zu(r){if(r.type==="WEBVIEW")return{type:"WEBVIEW",resolvedDescription:r.resolvedDescription,xPath:r.xPath,browserCache:r.browserCache,memory:r.memory};let{resolvedNode:e,...t}=r;return{...t}}var Je=class{driver;generator;stateManager;logger;fixtures;aborter;orgId;aiSettings;constructor(e){this.stateManager=e.stateManager,this.generator=e.generator,this.driver=e.driver,this.logger=e.logger,this.fixtures=e.fixtures,this.aborter=e.aborter,this.orgId=e.orgId,this.aiSettings=e.aiSettings}shouldUseMemoryForCommand(e){return this.aiSettings?.useMemory&&!e?.disableCache}async findElement({description:e,tracer:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,memory:a,webviewMemory:s}){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let c=await t.startAsyncSection("Get emulator state",async()=>{let g=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),h=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:g,screenshot:h}}),l;try{l=await t.startAsyncSpan("AI_LOCATOR_CALL",async g=>{let h=await this.generator.getMobileElementLocation({description:e,screenXml:c.emulatorState.graph.xml,screenshot:c.screenshot,memory:i?a:void 0},{logger:this.logger,loggerTags:Ee(this.logger),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["mobile-locator"]});return g.result=h,h})}catch(g){throw this.throwIfAborted(),this.logger.error({err:g},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${g instanceof Error?g.message:g}`)}if(l.id===-1)throw new Rn(l.thoughts??"No matching element found");let{target:u,resolvedNode:d}=Cx({aiResponse:l,description:e,emulatorState:c.emulatorState});if(u.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:u.elementOnlySerializedXml},attributes:{}}),{resolvedTarget:{...u,resolvedNode:d},thoughts:l.thoughts};let{browserLocateResult:p,browserController:m}=await t.startAsyncSpan("TARGET_RESOLUTION",async g=>{let h=await this.stateManager.getActiveWebview();if(!h||!h.browserController)throw new Error("No browser controller is attached to the requested webview");let f=await h.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger});return g.result={serializedElement:f.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},{browserLocateResult:f,browserController:h.browserController}});return{resolvedTarget:{...u,controller:m,resolution:p.resolution,browserCache:p.target},thoughts:p.thoughts}}async wrapTargetingAction(e){let{action:t,description:n,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:c,skipFetchingFullWebviewContent:l=!1,removeWebviewContent:u=!1}=e,d;if(i==="cache"&&"cache"in o&&o.cache){let f=o.cache;a==="target"&&"target"in f?d=f.target:a==="fromTarget"&&"fromTarget"in f?d=f.fromTarget:a==="toTarget"&&"toTarget"in f&&(d=f.toTarget)}let p=!1,m=Rx(d),g;if(o.disableCache&&(this.logger.debug({command:o},"Cache explicitly disabled for command"),p=!0,m=void 0),s&&(p=!0,m=void 0),m&&m?.resolvedDescription!==n&&(this.logger.info({description:n,cacheDescription:m?.resolvedDescription},"Cache description mismatch, clearing it automatically"),p=!0,m=void 0),!m){this.logger.info({description:n,cacheBustedBeforeAction:p},"Prompting AI for a new element location");let f=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(o),memory:d?.memory,webviewMemory:lh(d)});g=f.thoughts;let E=await t(f.resolvedTarget);return Uo({command:o,cacheKey:i,targetName:a,updatedCache:f.resolvedTarget,updatedWithAI:!0}),{result:E,thoughts:g}}let h;try{await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"}),h=await this.stateManager.getDomState();let{resolvedTarget:f,updatedCache:E}=await c.startAsyncSpan("CACHE_RESOLUTION",async C=>{let{resolvedTarget:R}=await Bu({target:m,domState:h,stateManager:this.stateManager,logger:this.logger}),v=zu(R),M=lH(m,v);return M&&Object.keys(M).length>0&&this.logger.info({cacheDiffs:M},"Successfully resolved target with cache"),C.attributes.serializedElement=R.type==="WEBVIEW"?R.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":R.elementOnlySerializedXml,{resolvedTarget:R,updatedCache:v}}),b=await t(f);return Uo({command:o,cacheKey:i,targetName:a,updatedCache:E,updatedWithAI:!1}),m.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:native",`hasRequirements:${!!m.requirements}`,`hasAdditionalElements:${!!m.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.14.0"]),{result:b,thoughts:"Successfully executed preset action with cache"}}catch(f){m.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:native",`hasRequirements:${!!m.requirements}`,`hasAdditionalElements:${!!m.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.14.0"]),this.throwIfAborted(),this.logger.warn({err:f},"Failed to resolve target cache, retrying with AI");let E=this.shouldUseMemoryForCommand(o),b=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:E,memory:m?.memory,webviewMemory:lh(m)});g=b.thoughts;let C=await t(b.resolvedTarget);return Uo({command:o,cacheKey:i,targetName:a,updatedCache:b.resolvedTarget,updatedWithAI:!0}),{result:C,thoughts:g}}}constructPerformerParams(){return{stateManager:this.stateManager,generator:this.generator,driver:this.driver,logger:this.logger,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,aiSettings:this.aiSettings}}getBoundsFromNativeCache(e){let[t,n,o,i]=e.bounds;if(t===void 0||n===void 0||o===void 0||i===void 0)throw new Error(`ActionFailureError: Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return{left:t,top:n,width:o-t,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:t,desiredDelta:n,edgeMarginPercent:o=.1}){let i=e.left+e.width/2,a=e.top+e.height/2;if(t==="up"||t==="down"){let s=e.height*o,c=e.top+s,l=e.top+e.height-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:i,startY:t==="down"?l:c,actualDelta:d}}else{let s=e.width*o,c=e.left+s,l=e.left+e.width-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:t==="right"?l:c,startY:a,actualDelta:d}}}invertDirection(e){if(e==="up")return"down";if(e==="down")return"up";if(e==="left")return"right";if(e==="right")return"left";throw new Error(`Unreachable code: ${e}`)}async performRawSwipe({startX:e,startY:t,deltaPixels:n,direction:o,durationMs:i=300}){let a=Math.abs(n),s=e,c=t;o==="up"||o==="down"?c=o==="up"?t-a:t+a:s=o==="left"?e-a:e+a,await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:100},{type:"pointerMove",duration:i,x:s,y:c},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return Rx(this.aiSettings)}};function dH(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 Gi=class extends Je{async tapOnAbsoluteCoordinates(e){let t=e.x,n=e.y;if(this.logger.info({x:t,y:n},"Tap at coordinates"),e.longPress)return await this.driver.executeScript("mobile: longClickGesture",[{x:t,y:n,duration:e.longPressDurationMs??2e3}]);if(e.doubleTap){await this.driver.tap({x:t,y:n});let o=e.doubleTapDelayMs??100;await new Promise(i=>setTimeout(i,o))}await this.driver.tap({x:t,y:n})}async tapOnNativeTarget(e,t){let[n,o,i,a]=e.bounds,s=i-n,c=a-o,l=t?.relativePosition?.x??s/2,u=t?.relativePosition?.y??c/2;l=Math.max(0,Math.min(l,s)),u=Math.max(0,Math.min(u,c));let d=n+l,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=xx.join(uH(),"momentic","downloads"),s=xx.join(a,this.orgId,i);return cH(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 te().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=te(),n=dH(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 Yn=class extends Je{async doPress({keycode:e,longPress:t}){await te().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var Mx=25,Hu=class extends Je{async doType(e){let t=te();if(!e.target){if(e.clearContent)throw new Error("UserConfigurationError: clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(e),{success:!0,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:t,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o)},description:e.target.description});return{success:!0,message:n}}async doWebviewType(e,t){await te().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??Mx};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 Gi(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=te(),n=e.keyPressDelayMs??Mx;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=te();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 Yn(this.constructPerformerParams()).doPress({keycode:67})}};import Yt from"zod";var _x=.8,Xn=.2,pH=Yt.object({navigationBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()}),statusBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()})}),Vi=class extends Je{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=pH.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*Xn),n=Math.floor(e.height*Xn);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*Xn),l=Math.floor(s*Xn);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=te();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=>te().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*Xn),s=Math.floor(i*Xn);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*Xn),u=Math.floor(c.height*Xn),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??_x)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=m,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates(s?0:g,s?g:0,10,t.durationMs,m)}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=_x,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 hH from"pixelmatch";import{_android as fH,chromium as SH}from"playwright";import{PNG as Dx}from"pngjs";import{z as Ve}from"zod";var Px=Ve.object({"Android-Package":Ve.string(),Browser:Ve.string(),"Protocol-Version":Ve.string(),"User-Agent":Ve.string(),"V8-Version":Ve.string(),"WebKit-Version":Ve.string(),webSocketDebuggerUrl:Ve.string()}),Ix=Ve.object({description:Ve.string(),devtoolsFrontendUrl:Ve.string(),id:Ve.string(),title:Ve.string(),type:Ve.string(),url:Ve.string(),webSocketDebuggerUrl:Ve.string()}),Ox=Ve.object({proc:Ve.string(),webview:Ve.string(),webviewName:Ve.string()}),Lx=Ve.array(Ox.extend({info:Px.optional(),pages:Ve.array(Ix).optional()})),NIe=Ve.array(Ox.extend({info:Px,pages:Ve.array(Ix)}));function ch(r,e,t=.01){let n=Buffer.from(r,"base64"),o=Buffer.from(e,"base64"),i=Dx.sync.read(n),a=Dx.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 hH(i.data,a.data,l,s,c,{threshold:t})/(s*c)*100}var Gu=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 fH.devices()).filter(h=>h._initializer?.serial?.endsWith(a.toString())||h._initializer?.serial?.endsWith((a-1).toString()));if(t.warn({devices:g.map(h=>({serial:h._initializer?.serial,model:h._initializer?.model}))},"No playwright device provided, using ADB to find device"),g.length===0)throw new Error(`Momentic found no devices listening on port ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);if(g.length>1)throw new Error(`Momentic found multiple devices on the ports ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);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=te(),n;for(let o=0;o<e;o++)try{return await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>await this.driver.takeScreenshot(),{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:3e3})}catch(i){if(n=i,o===e-1)throw i}throw new Error(`Failed to take screenshot: ${n}`)}async getCurrentScreenshotPngString(){return`data:image/png;base64,${await this.getRawScreenshotBase64(1)}`}async waitForScreenshotStability({timeoutMs:e,signal:t,reason:n,tolerancePercent:o=1}){await te().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c=!1;for(;Date.now()-a<e;){if(t?.throwIfAborted(),!s){s=await this.getRawScreenshotBase64();continue}let l=await this.getRawScreenshotBase64();if(ch(s,l)<=o){c=!0;break}s=l,await j(250,t)}c||(i.attributes.timedOut=!0,this.logger.warn({purpose:n},"Timed out waiting for screenshot stability"))})}async getCurrentPackage(){let e=await this.driver.execute("mobile: getCurrentPackage");return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){await this.refreshWebviews();let t=(await this.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph,n=await this.getCurrentPackage(),o=[];for(let[i,a]of t.idToElement.entries()){if(o.some(l=>l.id===i))continue;let s=a.getAttribute("content-desc");(Os(a.tagName)||n==="com.android.chrome"&&s==="Web View"&&a.tagName.toLowerCase().startsWith("frame"))&&o.push({id:i,originalElement:a,bounds:ko(a)})}return o}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await te().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 te().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 Ex(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await te().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 te().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviews()});let e=await this.driver.execute("mobile: getCurrentPackage");e!==void 0&&typeof e!="string"&&this.logger.warn({currentPkg:e},"Unexpected getCurrentPackage result");let t=[];for(let n of this.webviews.values())n.packageName===e&&n.active&&t.push(n);if(t.length!==0){if(t.length>1)throw new Error("Multiple active webviews in a single package is currently not supported");return t[0]}}async executeRawADBCommand(e){let t=this.driver.capabilities,n=s=>{if(!t||typeof t!="object")return;let c=t[s];return typeof c=="string"?c:void 0},o=n("deviceUDID")||n("udid")||n("appium:udid")||n("appium:deviceUDID"),i=e.trim().split(/\s+/).filter(s=>s.length>0);this.logger.info({serial:o,cmdArgs:i},"Executing ADB command");let a=await ht(i,{serial:o,timeoutMs:15e3,throwOnError:!0});return this.logger.info({result:a},"ADB command result"),a}async cleanupWebviews(){for(let[e,t]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(t),t.active=!1}async getDetailedContexts(){return await te().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=Lx.parse(t)}catch(o){throw new Error(`Failed to parse contexts. Original error:
|
|
4348
4348
|
${o}
|
|
4349
|
-
Raw: ${JSON.stringify(t)}`)}return n.filter(o=>{if(!o.webviewName)return!0;if(!o.info||!o.pages)return!1;let i=o.pages.filter(a=>{if(!a.title)return!1;let s=a.url;return!(!s||s===""||s.startsWith("about:blank")||s.startsWith("chrome-error:"))});return i?!!i:(this.logger.debug({context:o},"Webview has no qualified pages, skipping"),!1)})},{name:"Get available contexts",signal:this.aborter.controller?.signal})}async createBrowserController({context:e}){return await ee().startSection("Run remote Chrome initialization",async(n,o)=>{let i={};o.attributes.timings=i;let a=await ws.fromExistingContext({context:e,logger:this.logger,timingRecorder:i,userBrowserSettings:{visualActions:!0,disableBrowserMonitoring:!0,autoExpandIframes:!0},properties:{isNewHeadless:!0,allowedA11yIgnoreReasonsOverride:[],isAndroid:!0},storage:this.fixtures.storage,enricher:this.fixtures.browserEnricher});return new Pu({browser:a,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new Yl})})}async connectPlaywrightToWebview(e,t){return ee().startAsyncSection("Connect headless browser client to webview",async()=>{for(let o=0;o<2;o++)try{return await this.connectPlaywrightToWebviewHelper(e,t)}catch(i){this.logger.warn({err:i},"Failed to connect Playwright to webview, retrying...")}},{signal:this.aborter.controller?.signal,timeoutMs:8e3,timeoutMsg:"Timed out connecting Playwright to the webview"})}extractSocketNameFromWebview(e,t){if("_socketName"in e&&typeof e._socketName=="string")return e._socketName;if("_data"in e&&e._data?.socketName)return e._data.socketName;t.warn({pkg:e.pkg()},"Could not extract socket name from webview")}async connectPlaywrightToWebviewHelper(e,t){let n=this.device.webViews(),o=n.find(l=>!(l.pkg()!==e||this.extractSocketNameFromWebview(l,this.logger)!==t));if(!o){let l=`Could not find webview for ${e} with socket name ${t}`;throw this.logger.warn({webviews:n.map(u=>({pkg:u.pkg,name:this.extractSocketNameFromWebview(u,this.logger)}))},l),new Error(l)}let i=await o.page(),a=i.url();if(a===""||a.startsWith("about:blank")||a.startsWith("chrome-error:")){let l=`Webview ${e} with socket ${t} is not a valid webview`;this.logger.warn({pageUrl:a},l);return}let s=i.context();return await this.createBrowserController({context:s})}async connectPlaywrightToChrome(e){return await ee().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.connectPlaywrightToChromeHelper(e),{name:"Connect headless browser client to Chrome",signal:this.aborter.controller?.signal})}async connectPlaywrightToChromeHelper(e){let{contextId:t,socketName:n}=e;try{this.logger.info({contextId:t,socketName:n},"Connecting to Chrome webview");let o;e.forwardedPort?(o=`http://127.0.0.1:${e.forwardedPort}`,this.logger.info({contextId:t,endpoint:o,socketName:n},"Using existing forwarded port")):(o=`http://127.0.0.1:${await this.forwardDevToolsSocket(e.socketName)}`,this.logger.info({contextId:t,endpoint:o,socketName:n},`Forwarding DevTools socket for ${e.socketName}`)),this.logger.info({endpoint:o,socketName:n},"Connecting to CDP endpoint");let i=await hH.connectOverCDP({endpointURL:o,timeout:8e3}),a=i.contexts()[0];if(!a){this.logger.warn("No browser context available after CDP connection"),await i.close();return}return this.createBrowserController({context:a})}catch(o){this.logger.warn({err:o},`Error connecting Playwright to webview ${e.contextId}, continuing...`);return}}async disconnectPlaywrightFromWebview(e){try{e.browserController&&(this.logger.info(`Disconnecting Playwright from webview: ${e.contextId}`),await e.browserController.browser.cleanup(),e.browserController=void 0),e.forwardedPort&&await this.removeDevToolsForwarding(e.forwardedPort)}catch(t){this.logger.error({err:t},`Error disconnecting Playwright from webview ${e.contextId}:`)}}async forwardDevToolsSocket(e){this.logger.info("Setting up port forwarding for DevTools");let t=1e4+Math.floor(Math.random()*1e4),n=this.driver.capabilities,o=n.deviceUDID||n.udid||n["appium:udid"]||n["appium:deviceUDID"];this.logger.info({deviceId:o},`Device ID from capabilities: ${o||"not found"}`);let i=e&&e.trim().length>0?`localabstract:${e}`:"localabstract:chrome_devtools_remote";return await this.executeRawADBCommand(`forward tcp:${t} ${i}`),this.logger.info(`Successfully forwarded DevTools socket to port ${t}`),t}async removeDevToolsForwarding(e){await this.executeRawADBCommand(`forward --remove tcp:${e}`),this.logger.info("Successfully removed port forwarding")}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}};var Nx=5,Dx=.8,fH=1,Fu=class extends zi{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??Dx,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer(e,t){let n=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:n.width,height:n.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,n)};let o=ee(),i=e.target.description;if(t){let c=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:t}}let{resolvedTarget:a}=await this.findElement({description:i,tracer:o});if(a.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${i}" resolved to a webview element. Custom containers must be native elements.`);let s=this.getBoundsFromNativeCache(a);return this.logger.info({bounds:s},"Got container bounds from AI"),{bounds:s,cache:a}}async tryUseCachedScrollPosition(e,t){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,t):n.scrollDetails?this.tryUseNativeScrollCache(e,t,n):null:null}async tryUseWebviewCache(e,t){let n=ee();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:n,description:t,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i)}});return{success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,t,n){let o=n.scrollDetails,i=ee(),a=e.scrollStepPercent??Dx,s=o.scrollableElement.type==="CUSTOM"?o.scrollableElement.cache:void 0;await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:o.direction,scrollStepPercent:a});try{let l=await this.tryFindElement({cmd:e,description:t,tracer:i,scrollDetails:o,useAIIfCacheFails:!1});if(l)return l;this.logger.info("Element not found at cached position, undoing scroll")}catch(l){this.logger.warn({err:l},"Error finding element at cached position, will undo scroll")}let c=o.direction==="down"?"up":"down";return this.logger.info({pixelDelta:o.pixelDelta,originalDirection:o.direction,undoDirection:c,scrollableElementType:o.scrollableElement.type},"Undoing scroll"),await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:c,scrollStepPercent:a}),null}async tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:o,useAIIfCacheFails:i=!0}){let a,s,c=e.cache?.target;if(c&&c.resolvedDescription===t&&!e.disableCache){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let u=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0});try{let{resolvedTarget:d}=await Nu({target:c,domState:u,stateManager:this.stateManager,logger:this.logger});a=d,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache")}catch(d){this.logger.warn({err:d},"Failed to resolve target from cache")}}if(!a&&!i)return null;if(!a)try{let u=await this.findElement({description:t,tracer:n});a=u.resolvedTarget,s=u.thoughts}catch(u){if(this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u instanceof An)return null;throw u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),Lo({command:e,updatedCache:Du(a),updatedWithAI:!0}),{success:!0,message:s}):(Lo({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0}),{success:!0,message:s})}async searchForElement(e,t,n){let o=ee(),i=await this.resolveContainer(e.scrollableElement);return this.scrollAndSearch(e,t,o,n,i)}async scrollAndSearch(e,t,n,o,i){let a=0,s=i.bounds,c=s.height*o,l=!0;for(let u=0;u<Nx;u++){this.throwIfAborted();let d=this.buildScrollDetails(e,a,i.cache),m=await this.tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:d});if(m)return m;if(!l)throw new Error(`ActionFailureError: Could not find element "${t}" after scrolling to the end`);this.logger.debug({attempt:u,cumulativePixelDelta:a},"Element not found, scrolling further");let p=SH(e.scrollableElement);l=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:o,rawCoordinates:p}),a+=e.direction==="down"?c:-c}throw new Error(`ActionFailureError: Could not find element "${t}" after ${Nx} scroll attempts`)}buildScrollDetails(e,t,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:t,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:t,resolution:n}=e;await t.browser.hover({locator:n.locator})}async scrollByPage({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o}){return ee().startAsyncSpan("EMULATOR_INTERACTION",async a=>(a.attributes.containerBounds=t,a.attributes.direction=e,this.executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o})),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:t,containerCache:n,direction:o,scrollStepPercent:i}){if(e===0)return;let a=ee(),s,c,l;if(t.type==="CUSTOM_COORDINATES")s=t.startX,c=t.startY,l=t.deltaPixels;else{let m=(await this.resolveContainer(t,n)).bounds,p=m.height*i,g=this.calculateSwipeCoordinates({containerBounds:m,direction:o,desiredDelta:p});s=g.startX,c=g.startY,l=g.actualDelta}let u=Math.ceil(Math.abs(e)/l);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:s,startY:c,maxScrollPerStep:l,numScrolls:u},"scrollByPixelDelta calculated parameters"),await a.startAsyncSpan("EMULATOR_INTERACTION",async d=>{d.attributes.pixelDelta=e,d.attributes.numScrolls=u,d.attributes.maxScrollPerStep=l,d.attributes.startX=s,d.attributes.startY=c;let m=0;for(let p=0;p<u;p++){this.throwIfAborted();let g=Math.abs(e)-m,h=Math.min(l,g);await this.performRawSwipe({startX:s,startY:c,deltaPixels:h,direction:this.invertDirection(o)}),m+=h}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=fH,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,c,l;if(i)s=i.startX,c=i.startY,l=i.deltaPixels;else{let p=t.height*n,g=this.calculateSwipeCoordinates({containerBounds:t,direction:e,desiredDelta:p});s=g.startX,c=g.startY,l=g.actualDelta}await this.performRawSwipe({startX:s,startY:c,deltaPixels:l,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=ah(a,u),m=d>o;return this.logger.debug({diffPercent:d,diffThresholdPercent:o,canScrollMore:m,direction:e,actualDelta:l,rawCoordinates:i},"Scroll gesture visual diff result"),m}};function SH(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as yH}from"crypto";import Ps from"fs";import{tmpdir as bH}from"os";import Hi from"path";var Bu=class extends Je{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:!0,message:"Installed APK."}}async installApkFromUri(e){let t=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install ${Hi.resolve(t.localPath)}`),this.logger.info({uri:e,localPath:t.localPath},"Installed APK on device")}finally{t.cleanup()}}async resolveUriToLocalApk(e){try{let t=new URL(e);if(t.protocol==="file:"){let n=t.href.slice(7),o;if(Ps.existsSync(n))o=n;else if(Ps.existsSync(Hi.join("/",n)))o=Hi.join("/",n);else throw new Error(`APK not found at path: ${n}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(t.protocol==="http:"||t.protocol==="https:"){let n=await this.fetchWithTimeout(t);if(!n.ok)throw new Error(`Failed to download APK from ${e} (status ${n.status})`);let o=await n.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,t.pathname);return{localPath:a,cleanup:()=>{try{Ps.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new Error(`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=Hi.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{Ps.accessSync(e)}catch{throw new Error(`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let t=AbortSignal.timeout(9e4);return await fetch(e,{signal:t})}async writeBufferToTempFile(e,t){let n=Hi.extname(t)||".apk",o=Hi.join(bH(),`momentic-apk-${yH()}${n}`);return Ps.writeFileSync(o,e),o}};import{existsSync as EH,readFileSync as TH}from"fs";import vH from"zod";var AH=vH.string().url();async function kx(r){if(AH.safeParse(r).success){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(r,{signal:e.signal})}catch(i){throw new Error(`Fetch failed or timed out for URL: ${r}`,{cause:i})}finally{clearTimeout(t)}if(!n.ok)throw new Error(`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!EH(r))throw new Error(`File does not exist at path: ${r}`);return TH(r).toString("base64")}var zu=class extends Je{async dragNative(e,t,n){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:c,top:l,width:u,height:d}=this.getBoundsFromNativeCache(t),m=o+a/2,p=i+s/2,g=c+u/2,h=l+d/2,f=n?.hoverDuration??500,E=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:p},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:E,x:g,y:h},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}async dragWebview(e,t,n){let{controller:o}=e;if(e.controller!==t.controller)throw new Error("ActionFailureError: Cannot drag and drop between different webviews");let i=n?.hoverDuration?n.hoverDuration/1e3:void 0,a;n?.dragDuration&&(a=Math.max(1,Math.floor(n.dragDuration/200))),await o.browser.dragAndDrop(e.resolution.locator,t.resolution.locator,{hoverSeconds:i,steps:a})}async executeDragAndDrop({command:e}){let t=ee();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new Error("ActionFailureError: Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,description:n,cacheKey:"cache",targetName:"fromTarget",action:async l=>l}),a=e.toTarget.description,{result:s,thoughts:c}=await this.wrapTargetingAction({command:e,tracer:t,description:a,cacheKey:"cache",targetName:"toTarget",action:async l=>l});if(o.type!==s.type)throw new Error(`ActionFailureError: Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await t.startAsyncSpan("EMULATOR_INTERACTION",async l=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(l.withinWebview=!0,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}))},{name:"Drag and drop"}),{success:!0,message:`${i}
|
|
4350
|
-
${c}`}}};import{cloneDeep as
|
|
4351
|
-
`).filter(i=>!!i).length>1)throw new Error(`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new Error(`Failed to uninstall package ${t}: ${i}`)}}};var
|
|
4352
|
-
`).pop()?.replace(/^.*\//,""),!n)throw new Error(`Could not parse main activity name for package ${e.packageName}. Raw output: ${a}`)}if(this.options.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let i={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeScript("mobile: changePermissions",[i]),this.appsWithGrantedPermissions.add(e.packageName)}let o=["start"];if(e.intentExtras)try{let i=JSON.parse(e.intentExtras);for(let[a,s]of Object.entries(i))o.push("-e",a,typeof s=="string"?s:JSON.stringify(s))}catch(i){throw new Error(`UserConfigurationError: Invalid intent extras does not parse as valid JSON: ${i instanceof Error?i.message:`${i}`}`)}return o.push("-n",`${e.packageName}/${n}`),await this.driver.execute("mobile: shell",{command:"am",args:o}),await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.abortSignal,reason:"Waiting for stability after app launch"}),{success:!0}}case"PRESS":{let n=new jn(this.constructPerformerParams());switch(e.key){case"HOME":await n.doPress({keycode:3});break;case"BACK":await n.doPress({keycode:4});break;case"APP_SWITCHER":await n.doPress({keycode:187});break;case"POWER":await n.doPress({keycode:26});break;case"SEARCH":await n.doPress({keycode:84});break;case"VOLUME_UP":await n.doPress({keycode:24});break;case"VOLUME_DOWN":await n.doPress({keycode:25});break;case"VOLUME_MUTE":await n.doPress({keycode:164});break}return{success:!0}}case"PRESS_KEYBOARD":{let n=new jn(this.constructPerformerParams()),o=i=>n.doPress({keycode:i});switch(e.key){case"CLOSE_KEYBOARD":{let i=Date.now();for(;Date.now()-i<5e3&&(await this.driver.hideKeyboard(),!!await this.driver.isKeyboardShown()););break}case"ENTER":await o(66);break;case"BACKSPACE":await o(67);break;default:{let i=e}}return{success:!0}}case"WAIT":return await j(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:!0};case"INSTALL_APP":return new Bu(this.constructPerformerParams()).doInstallApk(e);case"UNINSTALL_APP":return new ju(this.constructPerformerParams()).doUninstallApk(e);case"ADD_FILE":{let n=await kx(e.file);return await this.driver.pushFile(e.storageLocation,n),await this.driver.execute("mobile: shell",{command:"am",args:["broadcast","-a","android.intent.action.MEDIA_SCANNER_SCAN_FILE","-d",`file://${e.storageLocation}`]}),{success:!0}}case"TOGGLE_SETTINGS":{switch(e.settingsType){case"AIRPLANE_MODE":await this.driver.toggleAirplaneMode();break;case"DATA":await this.driver.toggleData();break;case"WIFI":await this.driver.toggleWiFi();break;case"LOCATION":await this.driver.toggleLocationServices();break;default:throw e.settingsType,new Error(`Unknown settings type: ${e.settingsType}`)}return{success:!0}}case"ADB":{let n=await this.driver.execute(e.command,JSON.parse(e.jsonArgs??"{}"));return this.logger.info({output:n},"ADB command executed successfully"),{success:!0,output:n,message:"ADB command executed successfully"}}case"KILL_APP":{let n=await this.stateManager.getCurrentPackage();if(!n)throw new Error("No package is currently active");await this.driver.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await this.driver.terminateApp(n);try{await fx({packageName:n,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger})}catch(o){this.throwIfAborted(),this.logger.warn({err:o,packageName:n},"Failed to remove package from recents, continuing...")}return{success:!0}}case"STATE":{await this.stateManager.refreshWebviews();let n=await this.stateManager.getDomState(),o=await this.stateManager.getContexts(),i={xml:n.graph.xml,contexts:o};return this.logger.info({result:i},"State debug command output"),{output:i,success:!0}}default:{let n=e;return{success:!0}}}}async initializeSettings(){let{latitude:e,longitude:t}=this.options?.emulator?.geolocation??fl;await this.driver.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),await this.driver.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),await this.driver.setGeoLocation({latitude:e,longitude:t})}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64()}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString()}async getA11yTree(){return(await this.stateManager.getDomState({})).graph.xml}async executeRawADBCommand(e){return this.stateManager.executeRawADBCommand(e)}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}resetAbortController(e){this.aborter.controller=e??new AbortController}isAborted(){return this.aborter.controller?.signal.aborted}abort(){this.aborter.controller?.abort()}async cleanup(){await this.stateManager.cleanupWebviews()}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};async function Fx({socket:r,logger:e,androidDriverFactory:t,getOrgId:n,mobileGeneratorFactory:o,browserGeneratorFactory:i,browserEnricherFactory:a,storageFactory:s,localToolsFactory:c,globalStateManager:l,settingsFactory:u}){let d=r.id,m=r.handshake.query?.testMetadata,p=r.handshake.query?.fileName,g=p?_H.basename(p,".test.yaml"):"",h=Ar.parse(JSON.parse(m??"")),f=h.id,E=h.settings?.defaultChannel,b=h.settings?.defaultTag,C=h.settings?.defaultApkFilePath?.trim(),R=await n({testId:f});e=e.child({sessionId:d,testId:f,orgId:R});let v=await u(R,e),M={...v.emulator,...h.settings?.emulator},A;if(M.region==="local"){if(l.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");if(!M.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is local");A={avdId:M.localEmulatorSettings.avdId,apkToInstall:E?{channel:E,tag:b}:void 0,apkFilePath:C||void 0}}else A={region:M.region,apkToInstall:E?{channel:E,tag:b}:void 0,osVersion:M.remoteEmulatorSettings?.androidVersion};let I=Date.now(),{driver:k,cleanup:W,emulatorName:oe,adbPort:Te,limbarClient:At,limbarToken:G,limbarUrl:$,playwrightDevice:he}=await t({socket:r,logger:e,creationOpts:A}),se=await su({driver:k,onLogs:zo=>{r.emit("logcatLogs",zo)}});e.info({adbPort:Te,apkChannel:E,apkTag:b,duration:Date.now()-I,emulatorName:oe},"Android emulator session initiated"),e=e.child({emulator:oe});let Ce=await o(R,e),Me=await i(R,e),Jt=await a(R,e),qt=await s(R),_e=c?await c(R):void 0,$e={};h.settings?.defaultEnv&&($e=(await qt.fetchEnvironment(h.settings?.defaultEnv,e))?.variables??{});let lt=new ui({variablesFromEnvironment:$e,envName:h.settings?.defaultEnv,testName:g}),Pt=await Gi.init({driver:k,generator:Ce,logger:e,limbarClient:At,playwrightDevice:he,aiSettings:{...v.ai,useMemory:v.ai?.useMemory!==!1,...h.settings?.ai},options:{emulator:M},fixtures:{storage:qt,browserEnricher:Jt,browserGenerator:Me,localCodeEvalTools:_e,testContext:lt},orgId:R,adbPort:Te,abortController:new AbortController}),Gt=await Pt.getViewportBounds();if(!r.connected)throw await se(),await W(),new Error("Socket not connected anymore, not proceeding with Android session setup");let Fo=PH({socket:r,testContext:lt}),Bo=async()=>{clearInterval(Fo);try{await se(),await W(),await Pt.cleanup()}catch(zo){e.warn({err:zo},"Failed to clean up emulator in socket server")}};return l.registerSession(d,{controller:Pt,cleanup:Bo,emulatorName:oe,local:M.region==="local"}),r.emit("session",{testId:f,sessionId:d,limbarUrl:$,limbarToken:G,viewportBounds:Gt}),{sessionId:d,testId:f,orgId:R,emulatorName:oe,logger:e,testName:g}}function PH({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}async function Bx({socket:r,logger:e,globalStateManager:t}){await t.removeSession(r.id,e)}var IH=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},zx={event:"cancel",createHandler:IH};var OH=({logger:r,globalStateManager:e,socket:t})=>async(n,o)=>{let i=e.getSession(t.id);if(!i){o({err:"No active Android session found"});return}try{let s=await i.controller.getA11yTree();o({a11yTree:s})}catch(a){r.error({err:a},"Error fetching a11y tree from the session controller"),o({err:a.message})}},Hx={event:"fetchA11yTree",createHandler:OH};import{diff as QH}from"deep-object-diff";import{cloneDeep as ZH}from"lodash-es";function Gx(r,e,t=1e4,n=5e3){let o=0;async function i(){try{let s=await z(r.driver.execute("mobile: shell",{command:"echo",args:["ping"]}).catch(c=>{throw c}),{milliseconds:n});if(typeof s=="string"&&s.trim()==="ping")o>0&&e.info("Driver heartbeat restored"),o=0;else throw new Error(`Unexpected heartbeat output: ${s}`)}catch(s){o++;let c=s instanceof Error?s.message:`${s}`;e.error({attempt:o,error:c},"Driver heartbeat failed"),o>=3&&e.error("Driver appears unresponsive \u2014 possible ADB tunnel/emulator failure")}}let a=setInterval(()=>{i()},t);return i(),a}async function Vx(r){let e=Date.now(),t=r.fixtures.controller;try{return await LH(r)}catch(n){let o=t.isAborted()||n instanceof DOMException&&n.name==="AbortError";return{...r.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:o?"CANCELLED":"FAILED",message:o?"Step cancelled.":`${n}`}}}async function LH({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await NH({step:n,params:e}),s={};Object.entries(a).forEach(([m,p])=>{s[m]=JSON.stringify(p)});let c={...n,type:"MOBILE_MODULE_STEP",inputs:s,startTime:t,steps:[],endTime:Date.now(),status:"SUCCESS"},l=await o.startSubSteps(),{status:u,results:d}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:l}});return c.steps=d,c.status=u,c.endTime=Date.now(),Jw({result:c,...Xw(d)}),c}async function NH({step:r,params:e}){let t={},{logger:n,controller:o}=e.fixtures;for(let i of r.parameters?.parameterNames??[]){let a=r.inputs?.[i]??r.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}t[i]=await qr({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as Wx}from"crypto";import{diff as DH}from"deep-object-diff";import{cloneDeep as kH}from"lodash-es";async function jx({fixtures:r,step:e,inputs:t,stepTracer:n}){let o=Date.now(),{logger:i,controller:a}=r,s;if(!t.interactive)try{s=await a.getScreenshotBase64()}catch(u){i.warn({err:u},"Failed to take before screenshot")}let c="cache"in e.command?kH(e.command.cache??{}):{},l={...e,status:"SUCCESS",startTime:o,endTime:Date.now()};try{let u=await a.executeCommand({command:e.command});l={...e,status:u.success?"SUCCESS":"FAILED",message:u.message,startTime:o,endTime:Date.now(),data:u.output}}catch(u){u instanceof Error&&u.name==="AbortError"||a.isAborted()?l={...e,status:"CANCELLED",message:"Step cancelled.",startTime:o,endTime:Date.now()}:(i.error({err:u},"Failed to execute preset step"),l={...e,status:"FAILED",message:u instanceof Error?u.message:String(u),startTime:o,endTime:Date.now()})}finally{if(!t.interactive){try{let m=Wx(),p=await a.getScreenshotBase64();l.afterSnapshot=m,n.attachAfterScreenshot({logger:i,snapshotId:m,screenshot:Buffer.from(p,"base64")})}catch(m){i.warn({err:m},"Failed to take after screenshot")}if(s){let m=Wx();l.beforeSnapshot=m,n.attachBeforeScreenshot({logger:i,snapshotId:m,screenshot:Buffer.from(s,"base64")})}}let u="cache"in e.command?e.command.cache??{}:{},d=DH(c,u);d&&Object.keys(d).length>0&&i.info({diffs:mi(d)},"Updated cache")}return l}import{streamText as qH}from"ai";import{randomUUID as KH}from"crypto";var $u=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:t,logger:n,callbacks:o,rootStep:i}=e;this.controller=t,this.logger=n,this.callbacks=o,this.rootStep=i}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let t=this.subStepIndex++,n=await this.callbacks.executeStep(e,t);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as jH,stepCountIs as $H}from"ai";var sh="get_emulator_state",qu="finish";import $x from"dedent";var FH=$x`
|
|
4349
|
+
Raw: ${JSON.stringify(t)}`)}return n.filter(o=>{if(!o.webviewName)return!0;if(!o.info||!o.pages)return!1;let i=o.pages.filter(a=>{if(!a.title)return!1;let s=a.url;return!(!s||s===""||s.startsWith("about:blank")||s.startsWith("chrome-error:"))});return i?!!i:(this.logger.debug({context:o},"Webview has no qualified pages, skipping"),!1)})},{name:"Get available contexts",signal:this.aborter.controller?.signal})}async createBrowserController({context:e}){return await te().startSection("Run remote Chrome initialization",async(n,o)=>{let i={};o.attributes.timings=i;let a=await Ms.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 Du({browser:a,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new ec})})}async connectPlaywrightToWebview(e,t){return te().startAsyncSection("Connect headless browser client to webview",async()=>{for(let o=0;o<2;o++)try{return await this.connectPlaywrightToWebviewHelper(e,t)}catch(i){this.logger.warn({err:i},"Failed to connect Playwright to webview, retrying...")}},{signal:this.aborter.controller?.signal,timeoutMs:8e3,timeoutMsg:"Timed out connecting Playwright to the webview"})}extractSocketNameFromWebview(e,t){if("_socketName"in e&&typeof e._socketName=="string")return e._socketName;if("_data"in e&&e._data?.socketName)return e._data.socketName;t.warn({pkg:e.pkg()},"Could not extract socket name from webview")}async connectPlaywrightToWebviewHelper(e,t){let n=this.device.webViews(),o=n.find(l=>!(l.pkg()!==e||this.extractSocketNameFromWebview(l,this.logger)!==t));if(!o){let l=`Could not find webview for ${e} with socket name ${t}`;throw this.logger.warn({webviews:n.map(u=>({pkg:u.pkg,name:this.extractSocketNameFromWebview(u,this.logger)}))},l),new Error(l)}let i=await o.page(),a=i.url();if(a===""||a.startsWith("about:blank")||a.startsWith("chrome-error:")){let l=`Webview ${e} with socket ${t} is not a valid webview`;this.logger.warn({pageUrl:a},l);return}let s=i.context();return await this.createBrowserController({context:s})}async connectPlaywrightToChrome(e){return await te().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 SH.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 kx=5,Ux=.8,yH=1,Vu=class extends Vi{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??Ux,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer(e,t){let n=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:n.width,height:n.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,n)};let o=te(),i=e.target.description;if(t){let c=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:t}}let{resolvedTarget:a}=await this.findElement({description:i,tracer:o});if(a.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${i}" resolved to a webview element. Custom containers must be native elements.`);let s=this.getBoundsFromNativeCache(a);return this.logger.info({bounds:s},"Got container bounds from AI"),{bounds:s,cache:a}}async tryUseCachedScrollPosition(e,t){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,t):n.scrollDetails?this.tryUseNativeScrollCache(e,t,n):null:null}async tryUseWebviewCache(e,t){let n=te();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=te(),a=e.scrollStepPercent??Ux,s=o.scrollableElement.type==="CUSTOM"?o.scrollableElement.cache:void 0;await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:o.direction,scrollStepPercent:a});try{let l=await this.tryFindElement({cmd:e,description:t,tracer:i,scrollDetails:o,useAIIfCacheFails:!1});if(l)return l;this.logger.info("Element not found at cached position, undoing scroll")}catch(l){this.logger.warn({err:l},"Error finding element at cached position, will undo scroll")}let c=o.direction==="down"?"up":"down";return this.logger.info({pixelDelta:o.pixelDelta,originalDirection:o.direction,undoDirection:c,scrollableElementType:o.scrollableElement.type},"Undoing scroll"),await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:c,scrollStepPercent:a}),null}async tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:o,useAIIfCacheFails:i=!0}){let a,s,c=e.cache?.target;if(c&&c.resolvedDescription===t&&!e.disableCache){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let u=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0});try{let{resolvedTarget:d}=await Bu({target:c,domState:u,stateManager:this.stateManager,logger:this.logger});a=d,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache")}catch(d){this.logger.warn({err:d},"Failed to resolve target from cache")}}if(!a&&!i)return null;if(!a)try{let u=await this.findElement({description:t,tracer:n});a=u.resolvedTarget,s=u.thoughts}catch(u){if(this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u instanceof Rn)return null;throw u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),Uo({command:e,updatedCache:zu(a),updatedWithAI:!0}),{success:!0,message:s}):(Uo({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0}),{success:!0,message:s})}async searchForElement(e,t,n){let o=te(),i=await this.resolveContainer(e.scrollableElement);return this.scrollAndSearch(e,t,o,n,i)}async scrollAndSearch(e,t,n,o,i){let a=0,s=i.bounds,c=s.height*o,l=!0;for(let u=0;u<kx;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=bH(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 ${kx} 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 te().startAsyncSpan("EMULATOR_INTERACTION",async a=>(a.attributes.containerBounds=t,a.attributes.direction=e,this.executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o})),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:t,containerCache:n,direction:o,scrollStepPercent:i}){if(e===0)return;let a=te(),s,c,l;if(t.type==="CUSTOM_COORDINATES")s=t.startX,c=t.startY,l=t.deltaPixels;else{let p=(await this.resolveContainer(t,n)).bounds,m=p.height*i,g=this.calculateSwipeCoordinates({containerBounds:p,direction:o,desiredDelta:m});s=g.startX,c=g.startY,l=g.actualDelta}let u=Math.ceil(Math.abs(e)/l);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:s,startY:c,maxScrollPerStep:l,numScrolls:u},"scrollByPixelDelta calculated parameters"),await a.startAsyncSpan("EMULATOR_INTERACTION",async d=>{d.attributes.pixelDelta=e,d.attributes.numScrolls=u,d.attributes.maxScrollPerStep=l,d.attributes.startX=s,d.attributes.startY=c;let p=0;for(let m=0;m<u;m++){this.throwIfAborted();let g=Math.abs(e)-p,h=Math.min(l,g);await this.performRawSwipe({startX:s,startY:c,deltaPixels:h,direction:this.invertDirection(o)}),p+=h}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=yH,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=ch(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 bH(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as EH}from"crypto";import Ns from"fs";import{tmpdir as TH}from"os";import Wi from"path";var Wu=class extends Je{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:!0,message:"Installed APK."}}async installApkFromUri(e){let t=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install ${Wi.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(Ns.existsSync(n))o=n;else if(Ns.existsSync(Wi.join("/",n)))o=Wi.join("/",n);else throw new Error(`APK not found at path: ${n}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(t.protocol==="http:"||t.protocol==="https:"){let n=await this.fetchWithTimeout(t);if(!n.ok)throw new Error(`Failed to download APK from ${e} (status ${n.status})`);let o=await n.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,t.pathname);return{localPath:a,cleanup:()=>{try{Ns.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new Error(`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=Wi.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{Ns.accessSync(e)}catch{throw new Error(`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let t=AbortSignal.timeout(9e4);return await fetch(e,{signal:t})}async writeBufferToTempFile(e,t){let n=Wi.extname(t)||".apk",o=Wi.join(TH(),`momentic-apk-${EH()}${n}`);return Ns.writeFileSync(o,e),o}};import{existsSync as vH,readFileSync as AH}from"fs";import wH from"zod";var CH=wH.string().url();async function Fx(r){if(CH.safeParse(r).success){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(r,{signal:e.signal})}catch(i){throw new Error(`Fetch failed or timed out for URL: ${r}`,{cause:i})}finally{clearTimeout(t)}if(!n.ok)throw new Error(`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!vH(r))throw new Error(`File does not exist at path: ${r}`);return AH(r).toString("base64")}var ju=class extends Je{async dragNative(e,t,n){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:c,top:l,width:u,height:d}=this.getBoundsFromNativeCache(t),p=o+a/2,m=i+s/2,g=c+u/2,h=l+d/2,f=n?.hoverDuration??500,E=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:p,y:m},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:E,x:g,y:h},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}async dragWebview(e,t,n){let{controller:o}=e;if(e.controller!==t.controller)throw new Error("ActionFailureError: Cannot drag and drop between different webviews");let i=n?.hoverDuration?n.hoverDuration/1e3:void 0,a;n?.dragDuration&&(a=Math.max(1,Math.floor(n.dragDuration/200))),await o.browser.dragAndDrop(e.resolution.locator,t.resolution.locator,{hoverSeconds:i,steps:a})}async executeDragAndDrop({command:e}){let t=te();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new Error("ActionFailureError: Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,description:n,cacheKey:"cache",targetName:"fromTarget",action:async l=>l}),a=e.toTarget.description,{result:s,thoughts:c}=await this.wrapTargetingAction({command:e,tracer:t,description:a,cacheKey:"cache",targetName:"toTarget",action:async l=>l});if(o.type!==s.type)throw new Error(`ActionFailureError: Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await t.startAsyncSpan("EMULATOR_INTERACTION",async l=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(l.withinWebview=!0,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}))},{name:"Drag and drop"}),{success:!0,message:`${i}
|
|
4350
|
+
${c}`}}};import{cloneDeep as Bx}from"lodash-es";var $u=class{async getTextContent(e){return await e.textContent()??""}async getAttribute(e,t){return await e.getAttribute(t,{timeout:3e3})??""}async getTagName(e){return await e.evaluate(t=>t.tagName)}async isEditable(e){return await e.isEditable({timeout:Lt*1e3})}async isEnabled(e){return await e.isEnabled({timeout:Lt*1e3})}async isFocused(e){return await e.evaluate(t=>t===document.activeElement)}async getStyleProperty(e,t){return await e.evaluate((n,o)=>window.getComputedStyle(n).getPropertyValue(o),t)}},qu=class{async getTextContent(e){return Is(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 RH=5e3,Ku=class extends Je{async executeElementCheck(e){let t=Date.now(),n=(e.timeout??Lt)*1e3,o=n+1e4,i,a=0,s=500,c=Bx(e.cache);if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Element Check step");for(;a-t<n;){if(Date.now()-t>o){this.logger.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),i=await this.executeElementCheckHelper(e),a=Date.now(),!i.success)e.cache=c,c=Bx(c),await j(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),RH);else return i}let l=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:!0});return l.success||c&&e.cache&&(e.cache=Ts({originalCache:c,newCache:e.cache,targetGetter:u=>u.target}).result),l}async executeElementCheckHelper(e,t){let n=te();if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Element Check step");let o=eu(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 Rn||i instanceof Cn)?{success:!0}:{success:!1,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,t){let n=te(),{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 qu,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,t){let n=te(),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 $u,span:a});return a.result=s,s},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:t,elementPropertyAccessors:n,span:o}){switch(e.type){case"ELEMENT_CONTENT":{let i=await n.getTextContent(t)??"";return o.attributes.elementTextContent=ft(i,500,!0),Kr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})?{success:!0}:{success:!1,message:`The content ${hr(e)} '${e.value}': ${i}`}}case"ELEMENT_ATTRIBUTE":{"evaluate"in t&&(o.attributes.elementOuterHtml=ft(await t.evaluate(a=>a.cloneNode(!1).outerHTML),500,!0));let i;try{i=await n.getAttribute(t,e.attr)}catch(a){return{success:!1,message:`The element does not have an attribute named ${e.attr}: ${a}`}}if(!Kr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=hr(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 ${hr(e)}`}}case"ELEMENT_NAME":{let i=await n.getTagName(t);return Kr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})?{success:!0}:{success:!1,message:`The element tag name ${hr(e)} '${e.value}': ${i}`}}case"ELEMENT_STYLE":{let i=await n.getStyleProperty(t,e.property);if(!Kr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=hr(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 xH=5e3,Yu=class extends Je{async executeScreenCheck(e){let{timeout:t}=e,n=Date.now(),o=(t??Lt)*1e3,i=o+1e4,a=0,s=500;for(;a-n<o;){if(Date.now()-n>i){this.logger.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e);if(a=Date.now(),!c.success)await j(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),xH);else return c}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await te().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 ${lg(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 Nu({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes})}};var Xu=class extends Je{async doUninstallApk(e){return await this.uninstallApkPackage(e.packageName),{success:!0,message:"Uninstalled APK."}}async uninstallApkPackage(e){let t=e.replace(/^package:/,""),n=await this.stateManager.executeRawADBCommand(`shell pm list packages | grep -E "^package:${t}$" || true`);if(!n||n.length===0)throw new Error(`Package ${t} not found`);if(n.split(`
|
|
4351
|
+
`).filter(i=>!!i).length>1)throw new Error(`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new Error(`Failed to uninstall package ${t}: ${i}`)}}};var ji=class r extends Je{options;appsWithGrantedPermissions=new Set;adbPort;constructor(e){super(e),this.options=e.options??{},this.adbPort=e.adbPort}static async init({driver:e,generator:t,logger:n,fixtures:o,orgId:i,options:a,abortController:s,adbPort:c,limbarClient:l,playwrightDevice:u,aiSettings:d}){let p={controller:s},m=await Gu.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 ${_H.resolve(e)}`)}async executeCommand(e){let t=["type","a11yData","thoughts","cache","code"],n;try{n=await mu({obj:e.command,context:this.fixtures.testContext,bannedKeys:t,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools})}catch(o){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${o.message}`,{cause:o})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{gu(e.command,n)}}async executeCommandHelper({command:e}){let t=te();switch(e.type){case"TAP":return new Gi(this.constructPerformerParams()).executeTap({command:e});case"TYPE":return await new Hu(this.constructPerformerParams()).doType(e);case"AI_CHECK":{let n=this.shouldUseMemoryForCommand(e),o=15,i=e.timeoutSecs?e.timeoutSecs*1e3:5e3,a=au(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:Ee(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 Vi(this.constructPerformerParams()).executeSwipe(e);case"SCREEN_CHECK":return new Yu(this.constructPerformerParams()).executeScreenCheck(e);case"ELEMENT_CHECK":return await new Ku(this.constructPerformerParams()).executeElementCheck(e);case"DRAG_AND_DROP":return await new ju(this.constructPerformerParams()).executeDragAndDrop({command:e});case"SCROLL_TO":return new Vu(this.constructPerformerParams()).executeScrollTo(e);case"JAVASCRIPT":{let n=await Xr({orgId:this.orgId,code:e.code,fragment:!1,context:this.fixtures.testContext,timeoutMs:e.timeout?e.timeout*1e3:void 0,logger:this.logger,localTools:this.fixtures.localCodeEvalTools,signal:this.abortSignal});try{JSON.stringify(n)}catch(o){throw new Error(`UserConfigurationError: Return value is not serializable: ${o instanceof Error?o.message:`${o}`}`)}return{success:!0,output:n}}case"REQUEST":{let n;try{n=new URL(e.url).hostname}catch(l){throw new Error(`UserConfigurationError: Invalid URL: ${l}`)}let o=new PH,i=MH(fetch,o),a=Date.now(),s=await Lu({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:i}),c=Hl(o,n);return{output:nl.parse({...s,cookies:c}),success:!0,message:`Successfully executed request in ${Date.now()-a}ms`}}case"OPEN_NOTIFICATION_DRAWER":return await new Yn(this.constructPerformerParams()).doPress({keycode:83}),{success:!0};case"OPEN_APP":{let n=e.activityName;if(!n){let i=["resolve-activity","--brief","-a","android.intent.action.MAIN","-c","android.intent.category.LAUNCHER",e.packageName],a=await z(this.driver.execute("mobile: shell",{command:"pm",args:i}),{signal:this.abortSignal,milliseconds:1e4});if(typeof a!="string")throw new Error(`Could not find main activity name for package ${e.packageName}. Unexpected output: ${a}`);if(a.includes("No activity found"))throw new Error(`No activity found for package ${e.packageName}.`);if(n=a.trim().split(`
|
|
4352
|
+
`).pop()?.replace(/^.*\//,""),!n)throw new Error(`Could not parse main activity name for package ${e.packageName}. Raw output: ${a}`)}if(this.options.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let i={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeScript("mobile: changePermissions",[i]),this.appsWithGrantedPermissions.add(e.packageName)}let o=["start"];if(e.intentExtras)try{let i=JSON.parse(e.intentExtras);for(let[a,s]of Object.entries(i))o.push("-e",a,typeof s=="string"?s:JSON.stringify(s))}catch(i){throw new Error(`UserConfigurationError: Invalid intent extras does not parse as valid JSON: ${i instanceof Error?i.message:`${i}`}`)}return o.push("-n",`${e.packageName}/${n}`),await this.driver.execute("mobile: shell",{command:"am",args:o}),await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.abortSignal,reason:"Waiting for stability after app launch"}),{success:!0}}case"PRESS":{let n=new Yn(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 Yn(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 Wu(this.constructPerformerParams()).doInstallApk(e);case"UNINSTALL_APP":return new Xu(this.constructPerformerParams()).doUninstallApk(e);case"ADD_FILE":{let n=await Fx(e.file);return await this.driver.pushFile(e.storageLocation,n),await this.driver.execute("mobile: shell",{command:"am",args:["broadcast","-a","android.intent.action.MEDIA_SCANNER_SCAN_FILE","-d",`file://${e.storageLocation}`]}),{success:!0}}case"TOGGLE_SETTINGS":{switch(e.settingsType){case"AIRPLANE_MODE":await this.driver.toggleAirplaneMode();break;case"DATA":await this.driver.toggleData();break;case"WIFI":await this.driver.toggleWiFi();break;case"LOCATION":await this.driver.toggleLocationServices();break;default:throw e.settingsType,new Error(`Unknown settings type: ${e.settingsType}`)}return{success:!0}}case"ADB":{let n=await this.driver.execute(e.command,JSON.parse(e.jsonArgs??"{}"));return this.logger.info({output:n},"ADB command executed successfully"),{success:!0,output:n,message:"ADB command executed successfully"}}case"KILL_APP":{let n=await this.stateManager.getCurrentPackage();if(!n)throw new Error("No package is currently active");await this.driver.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await this.driver.terminateApp(n);try{await yx({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??El;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 zx({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?IH.basename(m,".test.yaml"):"",h=Cr.parse(JSON.parse(p??"")),f=h.id,E=h.settings?.defaultChannel,b=h.settings?.defaultTag,C=h.settings?.defaultApkFilePath?.trim(),R=await n({testId:f});e=e.child({sessionId:d,testId:f,orgId:R});let v=await u(R,e),M={...v.emulator,...h.settings?.emulator},A;if(M.region==="local"){if(l.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");if(!M.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is local");A={avdId:M.localEmulatorSettings.avdId,apkToInstall:E?{channel:E,tag:b}:void 0,apkFilePath:C||void 0}}else A={region:M.region,apkToInstall:E?{channel:E,tag:b}:void 0,osVersion:M.remoteEmulatorSettings?.androidVersion};let I=Date.now(),{driver:k,cleanup:W,emulatorName:ie,adbPort:ge,limbarClient:At,limbarToken:G,limbarUrl:$,playwrightDevice:fe}=await t({socket:r,logger:e,creationOpts:A}),se=await pu({driver:k,onLogs:Vo=>{r.emit("logcatLogs",Vo)}});e.info({adbPort:ge,apkChannel:E,apkTag:b,duration:Date.now()-I,emulatorName:ie},"Android emulator session initiated"),e=e.child({emulator:ie});let Ce=await o(R,e),Me=await i(R,e),Jt=await a(R,e),qt=await s(R),_e=c?await c(R):void 0,$e={};h.settings?.defaultEnv&&($e=(await qt.fetchEnvironment(h.settings?.defaultEnv,e))?.variables??{});let lt=new pi({variablesFromEnvironment:$e,envName:h.settings?.defaultEnv,testName:g}),Pt=await ji.init({driver:k,generator:Ce,logger:e,limbarClient:At,playwrightDevice:fe,aiSettings:{...v.ai,useMemory:v.ai?.useMemory!==!1,...h.settings?.ai},options:{emulator:M},fixtures:{storage:qt,browserEnricher:Jt,browserGenerator:Me,localCodeEvalTools:_e,testContext:lt},orgId:R,adbPort:ge,abortController:new AbortController}),Gt=await Pt.getViewportBounds();if(!r.connected)throw await se(),await W(),new Error("Socket not connected anymore, not proceeding with Android session setup");let Ho=OH({socket:r,testContext:lt}),Go=async()=>{clearInterval(Ho);try{await se(),await W(),await Pt.cleanup()}catch(Vo){e.warn({err:Vo},"Failed to clean up emulator in socket server")}};return l.registerSession(d,{controller:Pt,cleanup:Go,emulatorName:ie,local:M.region==="local"}),r.emit("session",{testId:f,sessionId:d,limbarUrl:$,limbarToken:G,viewportBounds:Gt}),{sessionId:d,testId:f,orgId:R,emulatorName:ie,logger:e,testName:g}}function OH({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}async function Hx({socket:r,logger:e,globalStateManager:t}){await t.removeSession(r.id,e)}var LH=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},Gx={event:"cancel",createHandler:LH};var NH=({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})}},Vx={event:"fetchA11yTree",createHandler:NH};import{diff as rG}from"deep-object-diff";import{cloneDeep as nG}from"lodash-es";var DH=1e4,kH=5e3;function Wx(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:kH});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}`;e.error({attempt:o,error:c},"Driver heartbeat failed"),o>=3&&(e.error("Driver appears unresponsive \u2014 possible ADB tunnel/emulator failure"),t?.())}}let a=setInterval(()=>{i()},DH);return i(),a}async function jx(r){let e=Date.now(),t=r.fixtures.controller;try{return await UH(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 UH({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await FH({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(),Zw({result:c,...Qw(d)}),c}async function FH({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 Xr({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as $x}from"crypto";import{diff as BH}from"deep-object-diff";import{cloneDeep as zH}from"lodash-es";async function qx({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?zH(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=$x(),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=$x();l.beforeSnapshot=p,n.attachBeforeScreenshot({logger:i,snapshotId:p,screenshot:Buffer.from(s,"base64")})}}let u="cache"in e.command?e.command.cache??{}:{},d=BH(c,u);d&&Object.keys(d).length>0&&i.info({diffs:gi(d)},"Updated cache")}return l}import{streamText as JH}from"ai";import{randomUUID as QH}from"crypto";var Ju=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 YH,stepCountIs as XH}from"ai";var uh="get_emulator_state",Qu="finish";import Kx from"dedent";var GH=Kx`
|
|
4353
4353
|
You cannot interact with the user directly. If you feel like you need to ask the user for clarification, or you are stuck, call the "finish" tool with success=false. Never output text without calling a tool.
|
|
4354
|
-
`,
|
|
4354
|
+
`,Yx=r=>Kx`
|
|
4355
4355
|
<background>
|
|
4356
4356
|
You are an advanced, AI agent part of an end-to-end testing platform called Momentic.
|
|
4357
4357
|
Momentic uses AI agents to translate high-level natural language descriptions of user flows into browser automation for the purpose of validating application correctness.
|
|
@@ -4364,7 +4364,7 @@ The steps you generate will be fed to downstream Momentic agents that are respon
|
|
|
4364
4364
|
The user will provide you with a high-level goal to achieve. Your task is to use the tools at your disposal to make as much progress as you can towards accomplishing the goal until one of the following is true:
|
|
4365
4365
|
- You have successfully accomplished the goal, fulfilling all criteria specified by the user. In this case, end the generation cycle by calling the "finish" tool with success=true.
|
|
4366
4366
|
- You have determined that the goal is impossible to accomplish or too vague to interpret confidently. In this case, end the generation cycle by calling the "finish" tool with success=false. Some examples of why a goal could be impossible: a) the goal requires a step type or capability that is not available to you; b) the user's app crashes or displays a 500 internal server error page; c) Momentic's AI agents repeatedly fail to perform the correct interaction, which could indicate an accessibility issue with the app.
|
|
4367
|
-
${r?"":
|
|
4367
|
+
${r?"":GH}
|
|
4368
4368
|
</task>
|
|
4369
4369
|
|
|
4370
4370
|
<values>
|
|
@@ -4382,23 +4382,24 @@ Momentic users value the following:
|
|
|
4382
4382
|
b) There is a loading state that blocks you from proceeding with generation, and you need to wait until the state changes. In this case, you can generate an AI_CHECK step for the anticipated "done" state (e.g. "There is no loading spinner visible"). Unless explicitly specified by the user, you can generate and retry an assertion up to 3 times with a timeout up to 30 seconds each.
|
|
4383
4383
|
If the max. allowed retries is exceeded, fail the generation cycle by calling "finish".
|
|
4384
4384
|
</rules>
|
|
4385
|
-
`;import{tool as HH}from"ai";import{randomUUID as GH}from"crypto";import VH from"zod";import{tool as BH}from"ai";import zH from"zod";var Kx=r=>{let e=BH({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:zH.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(sh),n.info("AI action tool called (get_emulator_state)"),lh(t)}});return{name:sh,tool:e}};async function lh(r){let e=await r.getA11yTree(),t=await r.getScreenshotBase64();return{type:"content",value:[{type:"text",text:"<emulatorXml>"},{type:"text",text:e},{type:"text",text:"</emulatorXml>"},{type:"text",text:"<screenshot>"},{type:"media",data:t,mediaType:"image/png"},{type:"text",text:"</screenshot>"}]}}var Yx=r=>({name:"create_execute_step",tool:HH({description:"Create and immediately execute a new Momentic step in the Android emulator, returning the result from the step and the state of the emulator after the step finished executing.",inputSchema:VH.object({step:bm}),toModelOutput:t=>t,execute:async({step:t})=>{let{contextManager:n,logger:o,controller:i}=r;o.info({step:t},"AI action tool called (create_execute_step)");let a=By(t),s={id:GH(),type:"MOBILE_PRESET_STEP",command:a},c=await n.createAndExecuteStep(s);c.status==="SUCCESS"&&await i.waitForScreenshotStability({reason:"Waiting for stability after executing AI-generated sub-step"});let l={...c,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},u=await lh(i);return{type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...u.value,{type:"text",text:"</stateAfter>"}]}}})});import{tool as WH}from"ai";import ch from"zod";var Xx=r=>{let e=WH({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:ch.object({message:ch.string(),success:ch.boolean()}),toModelOutput:t=>t,execute:async({message:t,success:n})=>{let{contextManager:o,logger:i}=r;return i.info({message:t,success:n},"AI action tool called (finish)"),o.finalState={message:t,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return{name:qu,tool:e}};var Jx=[Yx,Kx,Xx];function Qx(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of Jx){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getVercelAnthropicModelFactory({loggerTags:be(e),sessionId:o}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let m=l[d];for(let p of m.content)if(!(typeof p!="object"||!("type"in p))&&!(p.type!=="tool-result"||p.output.type!=="content")&&!(p.output.value.length<3))for(let g=0;g<p.output.value.length;g++){let h=p.output.value[g];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=p.output.value[g+1];f.type==="text"?f.text="TRUNCATED DUE TO CONVERSATION LENGTH":e.warn({msg:f},"Got unexpected part when truncating emulator state message")}else{u=!0;continue}}}return c};return{model:a("claude-haiku-4-5-20251001"),tools:i,prepareStep:s,stopWhen:[$H(15),jH(qu)],system:qx(!1)}}async function Zx(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await YH(r)}catch(o){let i=t.isAborted()||o instanceof DOMException&&o.name==="AbortError";return i||n.error({err:o},"Failed to execute mobile AI action"),{...r.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":`${o}`}}}async function YH(r){let{step:e,stepTracer:t,executeMobileStepList:n}=r.aiActionParams,{controller:o,logger:i}=r.fixtures,{step:a}=r.callbacks,s=await t.startSubSteps(),c=KH(),l=i.child({stepId:e.id,aiActionSessionId:c}),u=Date.now(),d=async(f,E)=>{let b=await n({...r,listParams:{steps:[f],tracer:s,containerName:`AI action sub-step ${E}`}});if(b.results.length!==1)throw new Error("InternalWebAgentError: Expected exactly one result from executeMobileStepList");return b.results[0]},m={stepId:e.id,parentStepIdChain:t.getParentStepIdChain()},p=new $u({controller:o,callbacks:{onAiActionEvent:a?.onAiActionEvent,executeStep:d},logger:l,rootStep:m}),g=Qx({controller:o,logger:l,contextManager:p,aiActionSessionId:c}),h=qH({...g,messages:[{role:"user",content:e.text}],abortSignal:o.abortSignal});for await(let f of h.fullStream)switch(o.throwIfAborted(),f.type){case"text-delta":a?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:f.text,rootStep:m})}if(await h.response,o.throwIfAborted(),!p.finalState)throw new Error("InternalWebAgentError: The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...e,status:p.finalState.status,startTime:u,endTime:Date.now(),message:p.finalState.message,steps:p.results}}var XH=60*60*1e3;async function Ku(r){let{fixtures:e,inputs:t,listParams:n,work:o}=r,{containerName:i,steps:a,tracer:s}=n,{logger:c,controller:l,usageTracker:u}=e,d=s.getParentStepIdChain(),m=[],p,g="SUCCESS",{fromStep:h,toStep:f}=t;for(let E=0;E<a.length;E++){let b=a[E];if(b.skipped)continue;if(o.fastForwardingToStep&&h){let A=JSON.stringify(d);if(b.id===h.fromStepId&&A===JSON.stringify(h.parentStepIdChain))o.fastForwardingToStep=!1;else if(!Yw({currentStep:b,currentParentChain:d,desiredStepId:h.fromStepId,desiredStepParentChain:h.parentStepIdChain}))continue}let C=0,R=1,v=Date.now();b.retries&&b.retries>0&&(R+=b.retries);let M=[];for(;C<R&&Date.now()-v<XH;){C++;let A=`Executing step index ${E} in ${i} - ${cg(b)}`;C!==1&&(A+=` (attempt ${C})`),c.info({step:b},A);let I=Date.now(),k=await s.startStep({logger:c,step:b,attempt:C,parentStepIdChain:d});u.trackStepExecution(b);let W=await JH({step:b,stepTracer:k,params:r}),{trace:oe}=await k.finish({parentStepIdChain:d,result:W});if(W.trace=oe,A=`Finished step index ${E} in ${i} - ${cg(b)}`,C!==1&&(A+=` (attempt ${C})`),c.info({step:{id:b.id},trace:W.trace,status:W.status},A),W.status!=="SUCCESS"&&C<R){M.push(W),Date.now()-I<1e3&&await j(1e3-(Date.now()-I));continue}if(M.length>0&&(W.previousAttempts=M),m.push(W),W.status!=="SUCCESS")return g=W.status,p=W,{results:m,status:g,terminalResult:p};if(b.envKey&&l.context.setVariable(b.envKey,W.data),f){let Te=JSON.stringify(d);if(b.id===f.toStepId&&Te===JSON.stringify(f.parentStepIdChain))return o.shouldStopExecuting=!0,{results:m,status:g,terminalResult:p}}if(o.shouldStopExecuting)return{results:m,status:g,terminalResult:p};break}}return{results:m,status:g,terminalResult:p}}async function JH({step:r,stepTracer:e,params:t}){let{fixtures:n,inputs:o,callbacks:i,work:a}=t,s;switch(r.type){case"MOBILE_PRESET_STEP":{s=await jx({fixtures:n,inputs:o,step:r,stepTracer:e,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await Vx({...t,moduleParams:{step:r,stepTracer:e,executeMobileStepList:Ku}});break}case"MOBILE_AI_ACTION_STEP":{s=await Zx({...t,aiActionParams:{step:r,stepTracer:e,executeMobileStepList:Ku}});break}}return s}async function Yu(r){let{tracer:e,containerName:t}=r,{steps:n,testMetadata:o}=r.inputs,{cacheStorage:i,logger:a,controller:s}=r.fixtures,c=a.child({testId:r.inputs.testMetadata.id,testName:r.inputs.testName});await i.resolveEntries({logger:c,testId:o.id,stepLists:{steps:n}});let l=ZH(n);c.info({testMetadata:Ar.parse(o)},"Starting mobile test");let u=await e.startMainStepList(),d=rT(c),m=Gx(s,c);c.info({cpu:d?.cpuMetadata,platform:d?.platform},`Starting execution of ${t}`);let{status:p,results:g}=await Ku({...r,listParams:{containerName:t,tracer:u,steps:l}});if(clearInterval(d?.interval),clearInterval(m),p==="SUCCESS"){let h=QH(n,l);if(h&&Object.keys(h).length>0){c.info({diffs:mi(h)},"Saving mobile step cache entries post-success");let{cachesToSave:f}=await $r({steps:l,cacheCreationParams:{orgId:r.inputs.orgId,testId:o.id}});await i.saveEntries({logger:c,testId:o.id,entries:f})}else c.info("No cache entries to update");return{status:"PASSED",results:g}}return p==="FAILED"&&await $w({logger:c,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,originalStepsWithCaches:n,updatedStepsWithCaches:l}),p==="CANCELLED"?{status:"CANCELLED",results:g}:{status:"FAILED",results:g}}var uh=class{parentTracer=null;socket;step;interactionTracer;constructor({step:e,socket:t,parentTracer:n}){this.socket=t,this.parentTracer=n,this.step=e,this.interactionTracer=new Io,pn.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...LE.parse(e),trace:wm.parse(t)};switch(n.result.status){case"SUCCESS":this.socket.emit("success",n);break;case"FAILED":this.socket.emit("failure",n);break;case"CANCELLED":this.socket.emit("cancelled",n);break}return{trace:t}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new Vi({parentStep:this.step,socket:this.socket,parentTracer:this})}},Vi=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:n}){this.parentTracer=n,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:e.parentStepIdChain,attempt:e.attempt}),new uh({step:e.step,parentTracer:this,socket:this.socket})}},Xu=class{constructor(e){this.socket=e}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new Vi({parentStep:null,parentTracer:null,socket:this.socket})}async startMainStepList(){return new Vi({parentStep:null,parentTracer:null,socket:this.socket})}async startAfterStepList(){return new Vi({parentStep:null,parentTracer:null,socket:this.socket})}};var eG=({metadata:r,logger:e,globalStateManager:t,socket:n,cacheStorageFactory:o,getGitMetadata:i})=>async(a,s)=>{let c=t.getSession(n.id);if(!c)throw new Error("No active Android session found");let l=await i(),u=e.child({testId:a.testMetadata.id,branch:l.gitBranchName}),d=await o(r.orgId,l),m=c.controller;m.resetAbortController();let p=new Xu(n),g=await Yu({work:{fastForwardingToStep:!!a.fromStep},fixtures:{controller:m,logger:u,cacheStorage:d,usageTracker:new Nl},containerName:"entire test",inputs:{steps:a.steps,fromStep:a.fromStep,toStep:a.toStep,orgId:r.orgId,testName:r.testName,testMetadata:a.testMetadata,interactive:!0},tracer:p,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}}}});await p.finish();let h={results:zt.array().parse(g.results),status:g.status};s?.(h)},eM={event:"execute",createHandler:eG};import{debounce as tG}from"ts-debounce";var rG=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=tG(t,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(r.id);if(!o)throw new Error("No active Android session found");o.emulatorName&&(o.local||n(o.emulatorName))}},tM={event:"keepalive",createHandler:rG};var rM=[eM,zx,tM,Hx];function nM(r){let{logger:e,baseServer:t,globalStateManager:n}=r,o=new nG(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0}),i=async()=>{await n.removeAllSessions(e)};o.on("connection",async s=>{let c=s.id,l=e.child({sessionId:c});l.info({event:"connection",transport:s.conn.transport.name},"Android websocket connection initiated"),s.on("disconnect",async()=>{await Bx({socket:s,globalStateManager:n,logger:l})});let u;try{u=await Fx({...r,socket:s,globalStateManager:n,logger:l})}catch(d){l.error({err:d},"Failed to setup Android connection"),s.emit("error",{message:d instanceof Error?d.message:JSON.stringify(d)}),s.disconnect(!0);return}rM.forEach(d=>a(d,{...r,socket:s,metadata:u,logger:l}))});let a=(s,c)=>{let l=s.createHandler(c),u=(...d)=>{s.event!=="keepalive"&&c.logger.debug({event:s.event},`Websocket event (${s.event})`);let m=p=>{c.logger.error({event:s.event,err:p instanceof Error?p:new Error(`${p}`)},"Unhandled exception in socket handler"),c.socket.emit("error",{message:p instanceof Error?p.message:typeof p=="string"?p:JSON.stringify(p)})};try{let p=l.apply(this,d);p&&typeof p.catch=="function"&&p.catch(m)}catch(p){m(p)}};c.socket.on(s.event,u)};return{server:o,dispose:i}}import{randomUUID as dW}from"crypto";import{diff as lke}from"deep-object-diff";import bke from"yaml";import{z as Tke}from"zod";import{execSync as oG}from"child_process";function Kn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,w.debug({postSaveCommand:n},"Executing post-save hook command");try{oG(n,{encoding:"utf-8"})}catch(o){w.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as B0e}from"deep-object-diff";import{cloneDeep as H0e}from"lodash-es";import{v4 as Z0e}from"uuid";import tke from"yaml";import iG from"@dotenvx/dotenvx";import aG from"fs";import oM from"path";function iM(r,e){return(r.config.environments??[]).map(t=>Is(t.name,r,e))}function sG(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function lG(r){let{envVariables:e,project:t}=r;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=sG(i);s&&(n[o]=s);continue}let a;try{a=aG.readFileSync(oM.resolve(t.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&w.debug(n,"Set environment variables with interpolation from project configuration"),n}function cG(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=iG.config({path:oM.resolve(e.rootDir,t),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug(o,"Set environment variables from .env file"),o}function Is(r,e,t){let n=(e.config.environments??[]).find(c=>c.name===r);if(!n)throw new Error(`Environment ${r} not found in local project configuration file`);let o={},i=lG({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=cG({project:e,envFile:n.envFile,logger:t});return Object.assign(o,a),n.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:r,variables:o}}import{existsSync as dG,readFileSync as mG,readdirSync as pG,writeFileSync as gG}from"fs";import{glob as hG}from"glob";import No,{dirname as aM}from"path";import{cwd as mh}from"process";import sM from"yaml";import{z as Ie}from"zod";import uG from"zod";var Ju=["**/*.test.yaml","**/*.module.yaml"],dh=uG.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),Qu=15;var Wi="momentic.config.yaml",ph="momentic.workspace.yaml",fG=Ie.object({projects:Ie.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),SG=Ie.union([Ie.string(),Ie.object({fromFile:Ie.string(),json:Ie.boolean().optional()})]),yG=Ie.object({name:dh,baseUrl:Ie.string().optional().describe("Optional for mobile tests"),envFile:Ie.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Ie.record(Ie.string(),SG).optional(),inheritFromShell:Ie.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:ao.optional().describe("NB: most things should use project-level configuration only")}),bG=Ie.object({postSave:Ie.string().optional()}),EG=Ie.object({name:dh,include:Ie.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Ie.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Ie.string().optional(),reporterDir:Ie.string().optional(),outputDir:Ie.string().optional(),recordVideo:Ie.boolean().optional(),retries:Ie.number().optional().describe("number of retries per test"),parallel:Ie.number().optional().describe("degree of parallelism"),environments:Ie.array(yG).optional(),gitMainBranch:Ie.string().optional(),gitProtectedBranches:Ie.string().array().optional(),ai:km.optional(),browser:ao.optional(),emulator:vm.optional(),advanced:Um.optional(),displayRoot:Ie.string().optional().describe("relative path from project root to use as the Repository root"),hooks:bG.optional()});function lM(r,e){let t;try{t=mG(r,"utf-8")}catch(o){w.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=sM.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){w.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function gh(r){let e=lM(r,"project configuration");if(e!==void 0)try{return EG.parse(e)}catch(t){w.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function TG(r){let e=lM(r,"workspace configuration");if(e!==void 0)try{return fG.parse(e)}catch(t){w.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function vG(){let r=[],e=mh(),t=No.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=No.basename(e);if(Gl.includes(i))return w.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of pG(e))if(a.endsWith(Wi)){let s=No.join(e,a),c=gh(s);c&&r.push({configFilePath:s,config:c,rootDir:aM(s)})}if(r.length)return r;if(e=No.dirname(e),e===t)break}return r}async function Os(r={}){let{configFilePath:e,nameFilter:t}=r,n=await wG(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
4386
|
-
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return w.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function
|
|
4387
|
-
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function HG(r,e,t){try{let o=t["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await gM("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await gM("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function GG(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return HG(r,e,t);if(o)return}catch{}}function Zu(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Ue(r,e){try{return(await e).trim()}catch(t){if(t instanceof Error&&t.message.includes("not a git repository"))return;r.error({err:t},"Failed to run git command");return}}function VG(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild"}async function WG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function jG(r){let[e,t,n]=await Promise.all([Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function $G(r){let[e,t,n,o]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Zu(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function qG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zu(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function KG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zu(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function YG(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Ue(r,ke.revparse(["HEAD"])),Ue(r,ke.revparse(["--short","HEAD"])),Ue(r,ke.revparse(["--abbrev-ref","HEAD"])),Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"])),e?Ue(r,ke.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),zG(r)]),d=l?await Ue(r,ke.show(["--no-patch","--format=%ci",l])):void 0,m=i?.includes("github.com"),p=i?.includes("gitlab.com"),g=i?Zu(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,E=u["user.username"]||void 0,b=await GG(r,i,u)??E??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:m?g:void 0,gitlabProjectPath:p?g:void 0,pipelineId:void 0}}async function XG(){let r=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:r?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:r?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}async function JG(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Ns(r,e){let t=VG();if(!t)return YG(r,e);switch(t){case"GithubActions":return WG(r);case"GitlabCI":return jG(r);case"CircleCI":return $G(r);case"Buildkite":return qG(r);case"AzureDevOps":return KG(r);case"GCPCloudBuild":return XG()}}async function QG(r,e,t,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(t,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){r.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(t,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){r.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(t,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){r.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function ZG(r,e,t,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(t,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){r.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(t,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){r.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(t,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){r.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function eV(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await ZG(r,e,n,o,t)}else if(t.gitlabProjectPath)return await QG(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function ji(r,e,t){let n=await JG(t),o=await Ns(r,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await eV(r,e,i);return{...n,...o,...a}}import{diff as hM}from"deep-object-diff";import Yn from"fs";import{cloneDeep as tV}from"lodash-es";import ed from"path";import{v4 as rV}from"uuid";import Ds from"yaml";function fM(r,e){let t=`${nn(e)}.module.yaml`,n=ed.join(ed.dirname(r),t);if(Yn.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return Yn.renameSync(r,n),n}function SM({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.mobileModules[r.moduleId]?.fullFilePath,a=t.mobileModules[r.moduleId]?.name;if(!i||!Yn.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=Yn.readFileSync(i,"utf-8"),c=Ds.parse(s),l={...c,...r,schemaVersion:e},u=wo({fileType:De.MOBILE_MODULE,...Da.parse(l),steps:Vt.array().parse(r.steps)}),d=!!r.name&&r.name!==a,m=hM(u,c);if(m&&Object.keys(m).length===0&&!o&&!d)return;let p=Ds.stringify(u);Yn.writeFileSync(i,p,"utf-8");let g;d&&(g=fM(i,r.name)),Kn(g||i,n.config)}function yM({moduleId:r,patch:e,momenticFiles:t,project:n,logger:o}){let i=t.mobileModules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${r} that could not be found on disk`);let a=ks(i,o),s={...a,...e},c=wo({fileType:De.MOBILE_MODULE,...Ll.parse(s)}),l=hM(c,a);if(l&&Object.keys(l).length===0)return;let u=Ds.stringify(c);Yn.writeFileSync(i,u,"utf-8");let d;e.name&&(d=fM(i,e.name)),Kn(d||i,n.config)}async function bM({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=nn(r),s=ed.join(o,`${a}.module.yaml`),c=rV(),{stepsToSave:l}=await $r({steps:n}),u={schemaVersion:Cn,moduleId:c,description:e,enabled:t},d={fileType:De.MOBILE_MODULE,...u,steps:l},m=Ds.stringify(Yy.parse(d));return Yn.writeFileSync(s,m,"utf-8"),Kn(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function ks(r,e){let t=Yn.readFileSync(r,"utf-8"),n=Ds.parse(t);try{return{...Ll.parse(n),name:ed.basename(r,".module.yaml")}}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic mobile module`),o}}async function fh(r,e,t,n){let o=ks(r.fullFilePath,t),{resolvedSteps:i}=await eu({rawSteps:o.steps,resolvedModuleCache:n||{},onFetchModule:async s=>{let c=e.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Could not find mobile module with id ${s}`);return ks(c,t)},logger:t,metadata:{id:o.moduleId,schemaVersion:o.schemaVersion}}),a={...o,name:r.name,description:o.description||void 0,steps:i};return n&&(n[r.id]=tV(a)),a}async function EM(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await fh(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as nV}from"crypto";import Do from"fs";import yh from"path";import td from"yaml";import Sh from"zod";function TM({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${nn(r)}.test.yaml`,s=yh.join(o,a);if(Do.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:De.MOBILE_TEST,id:nV(),description:e,schemaVersion:oo,settings:n,steps:t},l=td.stringify(c);return Do.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function oV(r){if(!Do.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=Do.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
|
|
4388
|
-
`),t=
|
|
4389
|
-
`),l=td.parse(c),u=Am.extend({steps:Sh.record(Sh.string(),Sh.unknown()).array()}).parse({...l,schemaVersion:a});if(u.fileType!==De.MOBILE_TEST)throw new Error(`File at '${s}' is not a mobile test (fileType=${u.fileType}).`);let d;e&&(d=await $r({steps:e}));let m={...u,...d?.stepsToSave!==void 0?{steps:d.stepsToSave}:{steps:u.steps},...t!==void 0?{settings:t}:{}},p=td.stringify(m);for(let g of d?.moduleUpdates??[])SM({content:g,schemaVersion:oo,momenticFiles:i,project:o});Do.writeFileSync(s,p,"utf-8"),Kn(s,o.config)}import{randomUUID as iV}from"crypto";import Xn from"fs";import $i from"path";var AM=new Set([".DS_Store","__MACOSX"]),wM={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function aV(r,e,t){if(wM[t]){let i=wM[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var bh=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function CM(r,e){try{let t=$i.join(e,"metadata.json");return Jl.parse(JSON.parse(Xn.readFileSync(t,"utf-8")))}catch{throw new bh(r,e)}}function RM(r,e,t){let n=iV(),o=r.child({runGroupId:n});Xn.rmSync(e,{recursive:!0,force:!0});let i=Xn.readdirSync(t).filter(c=>!AM.has(c)).map(c=>$i.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);Xn.mkdirSync(e,{recursive:!0});let a={...CM(t,i[0]),id:n};for(let c of i){let l=$i.join(c,"runs");if(!Xn.existsSync(l))continue;let u=CM(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let p=m;a[p]=aV(a,u,p)}let d=Xn.readdirSync(l);for(let m of d){if(AM.has(m))continue;let p=$i.join(l,m),g=$i.join(e,"runs",m);Xn.cpSync(p,g,{recursive:!0})}}let s=$i.join(e,"metadata.json");Xn.writeFileSync(s,JSON.stringify(a,null,2))}import MM from"adm-zip";import Ch from"fs";import{z as gV}from"zod";var U="v1",Eh="mobile-cli",ko="0.13.2";var sV=9e4,lV=3,cV=1500,uV=15e3,_r=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function dV(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Th=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return ko&&(e[Kl]=ko),Eh&&(e[Bb]=Eh),e}async sendRequest(e,t){let{retries:n=lV,requestTimeoutMs:o=sV,initialRetryDelayMs:i=cV,maxRetryDelayMs:a=uV,onFailedRequest:s}=t,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:t.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,t,o)}catch(m){u=m;try{s?.(u)}catch{}if(m instanceof _r&&m.status>=400&&m.status<500)throw m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Ln),c===0)throw u;let p=l-c,g=Math.min(i*Math.pow(2,p-1),a);await new Promise(h=>setTimeout(h,g))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...t.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await dV(u);throw new _r(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}return this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Zr=class extends Th{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[Fb]:this.mode??""}}};import{createAnthropic as mV}from"@ai-sdk/anthropic";function pV(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[Kl]:ko??"",...t&&{[Hb]:t},...n||{}};return o&&(i[zb]=JSON.stringify(o)),i}var nd=r=>e=>{let t=pV(r);return mV({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)};var Uo=class extends Zr{agentConfig;constructor(e,t){let n={...Py,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return hy.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${U}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:ko,...e},signal:t.abortSignal});return gy.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return gV.string().parse(t)}async getElementLocation(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${U}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return qb.parse(o)}async getAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${U}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Bm.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return $b.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return Vb.parse(o)}async getMcpCopilotConversationEvaluation(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:t.abortSignal});return Wb.parse(o)}async getMcpCopilotChatSummary(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:t.abortSignal});return jb.parse(o)}async getVisualAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${U}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Bm.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${U}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Gb.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${U}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let n=await this.sendRequest(`/${U}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Jd.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${U}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Kb.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${U}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Yd.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return qS.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return KS.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${U}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Dd.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return _y.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return GS.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return jS.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return WS.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return tf.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return nd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as vh}from"zod";var Pr=class extends Zr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{w.warn(`API key check failed: ${t.message}`)}});return sE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return nE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return Xb.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${U}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Qb.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${U}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Zb.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Yb.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return aE.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return lE.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${U}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return AE.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${U}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${U}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${U}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return cE.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${U}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return uy.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${U}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,t){try{await this.sendRequest(`/${U}/billing/events`,{method:"POST",body:t,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return uE.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${U}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return dE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return mE.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${U}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return pE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return RE.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){t.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${U}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ga.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${U}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ga.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${U}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vm.parse(a)}async getMergeBaseCommitFromGitlab(e,t,n){let o=new URLSearchParams;o.set("base",t),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${U}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ga.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${U}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ga.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${U}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vm.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return vh.record(vh.string(),vh.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return gE.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${U}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,t,n){await this.sendRequest(`/${U}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${U}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return hE.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${U}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:t,md5:n}){let o={channel:e,tag:t,md5:n},i=await this.sendRequest(`/${U}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return fE.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${U}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${U}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return SE.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function Ah(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(w.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),w.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return w.debug("Got auth info from API"),n}var od=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var qi=class extends Zr{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${U}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return rf.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Ki=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as hV,en as fV}from"@faker-js/faker";var Yi="v1",Xi=class{httpClient;fakerInstance;type="API_CLIENT";sms={send:this.sendSms.bind(this),fetchLatest:this.fetchLatestSms.bind(this)};email={send:this.sendEmail.bind(this),fetchLatest:this.fetchLatestEmail.bind(this),fetchAll:this.fetchAllEmails.bind(this)};ai={generate:this.sendAiGenerate.bind(this)};constructor(e){this.httpClient=e.httpClient,e.fakerSeed&&(this.fakerInstance=new hV({locale:fV}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Yi}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof _r?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Yi}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Yi}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof _r?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Yi}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Yi}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Yi}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function xM(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var id=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await xM(n,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};var Ji=class extends Zr{constructor(e){super(e)}async getMobileElementLocation(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/mobile-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return eb.parse(o)}async evaluateMobileAssertion(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/mobile-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return nb.parse(o)}async getMobileFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/mobile-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return ab.parse(n)}getVercelAnthropicModelFactory({loggerTags:e,sessionId:t}){return nd({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:t,loggerTags:e})}};function ad({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i}){return i?new Xl:new wh(r,e,t,{alwaysSaveCache:o,regenerateCache:n})}var wh=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{regenerateCache:i,alwaysSaveCache:a}=o,{gitBranchName:s,gitProtectedBranches:c}=n;this.cacheHeaders=zm(n),this.readCaches=!i;let l=s&&c.includes(s);a||!l?this.writeCaches=!0:this.writeCaches=!1}cacheHeaders;readCaches;writeCaches;async saveEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateMobileStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.warn({err:o},"Failed to save mobile step cache entries, continuing...")}}async resolveEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t}=e.stepLists,n=await this.client.getMobileStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}for(let i of[t])i&&ag({steps:i,stepCacheEntries:n,logger:e.logger});let{cachesToSave:o}=await $r({steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateMobileStepCaches({entries:o,testId:e.testId},this.cacheHeaders)}};import sd from"path";function SV(r){let e=new MM,t=sd.join(r,"metadata.json"),n=Jl.parse(JSON.parse(Ch.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Ch.readdirSync(sd.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new MM(sd.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(sd.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function ld(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Ch.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new id(e);try{let{runGroupId:i,buffer:a}=SV(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;t.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",t.error(`Failed to upload test results: ${a}.`);return}}import yV from"adm-zip";import vt from"fs";import Xt from"path";var Us=class r{constructor(e){this.filePath=e;vt.rmSync(this.filePath,{recursive:!0,force:!0}),vt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Xt.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){vt.mkdirSync(Xt.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Xt.join(this.filePath,e);if(vt.existsSync(t))return vt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.filePath,t);try{vt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Xt.join(this.filePath,e);return vt.createWriteStream(t)}createRunArchive(e){return new Rh(Xt.join(this.filePath,"runs"),e)}},Rh=class{constructor(e,t){this.filePath=e;this.tempPath=Xt.join(e,`temp-storage-${t}`),this.finalPath=Xt.join(e,`${t}.zip`),vt.rmSync(this.tempPath,{recursive:!0,force:!0}),vt.rmSync(this.finalPath,{recursive:!0,force:!0}),vt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Xt.join(this.tempPath,e);if(vt.existsSync(t))return vt.readFileSync(t)}mkdir(e){vt.mkdirSync(Xt.join(this.tempPath,e),{recursive:!0})}cd(e){return new Us(Xt.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.tempPath,t);vt.writeFileSync(o,n)}createFileStream(e){let t=Xt.join(this.tempPath,e);return vt.createWriteStream(t)}close(){let e=new yV;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();vt.writeFileSync(this.finalPath,t),vt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import V1e from"adm-zip";import bd from"fs";import qM from"body-parser";import HV from"cors";import GV from"dedent";import{Router as vV}from"express";import Ht from"fs";import{globSync as AV}from"glob";import St from"path";import cd from"fs";import bV from"path";var EV=new pu(30,60*1e3),Ph="https://api.momentic.ai",Mh,PM=r=>{Ph=r},Ih=()=>Ph,Fs=()=>Mh;var Qi,_h,_M,IM=async r=>{if(Mh&&Qi&&_M)return Qi;let e=new Pr({baseUrl:Ph,apiKey:r,logger:w});Mh=e;try{let t=await e.getAuthInfo();return Qi=t.orgId,_h=t.userId,_M=r,Qi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Zi=()=>{if(!Qi)throw new Error("Your organization ID is invalid.");return Qi},ud=()=>{if(!_h)throw new Error("Your user ID is invalid.");return _h};var Oh,xh,OM=(r,e)=>{Oh=r,xh?.abort(),xh=new AbortController;let t=xh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=bV.resolve(r.rootDir,o.envFile);try{if(cd.lstatSync(i).isSymbolicLink())return;cd.existsSync(i)&&n.push(i)}catch(a){w.warn({err:a},`Failed to check if env file ${i} exists`)}});try{TV({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){w.error({err:o},"Failed to start config file watchers")}},Fe=()=>Oh;function TV({filesToWatch:r,revalidator:e,signal:t,project:n}){w.debug("Starting watch on the following files:"),r.forEach(o=>{w.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(EV.increment("setLocalProject")&&w.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Oh=await Promise.resolve(e(n.configFilePath)))};cd.watchFile(o,{persistent:!1},i);let a=()=>{cd.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ne(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var zs=vV();function Bs(r){let e=Fe(),t=St.dirname(e.configFilePath);return St.join(t,...r)}function wV(r){let e=Fe(),t=St.dirname(e.configFilePath),n=St.relative(t,r);return n?n.split(St.sep):[]}function CV(r,e){let t=Ht.statSync(r),n=wV(r);return Lm.parse({name:e,absolutePath:r,relativePath:n.join(St.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}zs.post("/",Ne(async(r,e,t)=>{let n;try{n=wb.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Bs(n);if(!Ht.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(St.sep)}`});return}if(!Ht.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}let a=Fe(),s=Array.from(a.config.exclude??[]).concat(Vl),l=AV("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let m=St.join(o,d);return CV(m,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));zs.put("/",Ne(async(r,e,t)=>{let n;try{n=Cb.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Bs(n);if(Ht.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(St.sep)}`,pathSegments:n});return}Ht.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(St.sep)}`,pathSegments:n};e.status(201).json(i)}));zs.patch("/",Ne(async(r,e,t)=>{let n,o;try{let l=Rb.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Bs(n),a=Bs(o);if(!Ht.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(St.sep)}`});return}if(Ht.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(St.sep)}`});return}let s=St.dirname(a);Ht.existsSync(s)||Ht.mkdirSync(s,{recursive:!0}),Ht.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(St.sep)} to ${o.join(St.sep)}`,pathSegments:o};e.status(200).json(c)}));zs.delete("/",Ne(async(r,e,t)=>{let n,o=!0;try{let c=xb.parse(r.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Bs(n);if(!Ht.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(St.sep)}`,pathSegments:n});return}if(!Ht.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}if(o)Ht.rmSync(i,{recursive:!0,force:!0});else{if(Ht.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Ht.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Lh=zs;import{Router as MV}from"express";import{hostname as RV}from"os";var xV="0.13.2",Hs=fi({app:"desktop-server",hostname:RV(),disableConsoleLogs:!0}).child({cliVersion:xV});(async()=>{try{let r=await Ns(Hs);r.gitBranchName&&Hs.addBinding("branch",r.gitBranchName)}catch{}})();var LM=MV();LM.get("/",async(r,e)=>{let t=Fe(),n=Fs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await ji(Hs,n,t);e.status(200).json(o)});var Nh=LM;import VV from"events";import KM,{Router as WV}from"express";import jV from"http";import $V from"path";var dd=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}hasActiveLocalSession(){for(let e of this.sessions.values())if(e.local===!0)return!0;return!1}async removeSession(e,t){let n=this.sessions.get(e);if(n)try{await n.cleanup?.(),t.info({sessionId:e,emulatorName:n.emulatorName},"Android emulator cleaned up")}catch(o){t.error({err:o},"Error during Android session cleanup")}finally{this.sessions.delete(e)}}async removeAllSessions(e){let t=Array.from(this.sessions.keys());await Promise.all(t.map(n=>this.removeSession(n,e)))}};var md=new dd;import{Router as PV}from"express";import{existsSync as IV}from"fs";import OV from"path";import{hostname as _V}from"os";var Dh="0.13.2",mt=fi({app:"mobile-desktop-server",hostname:_V(),disableConsoleLogs:!0}).child({cliVersion:Dh});(async()=>{try{let r=await Ns(mt);r.gitBranchName&&mt.addBinding("branch",r.gitBranchName)}catch{}})();var kh=PV();kh.get("/",Ne(async(r,e)=>{let t=Fs();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));kh.post("/upload-url",Ne(async(r,e)=>{let t;try{t=Lb.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Fs();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=OV.resolve(t.filePath);if(!IV(o)){e.status(400).json({error:`File not found: ${o}`});return}await au({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:mt}),e.sendStatus(204)}));var NM=kh;import{Router as DV}from"express";import{Router as LV}from"express";import DM from"fs";import NV from"path";var Gs=LV();async function Uh(r){return(await EM(r,mt)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){w.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Gs.get("/",Ne(async(r,e)=>{let t=Fe(),n=await yr(t),o=await Uh(n);e.status(200).json(o)}));Gs.get("/:moduleId",Ne(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await yr(Fe()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await fh(n,t,w);e.json(o)}catch(o){e.status(400).json({err:o})}}));Gs.patch("/:moduleId/metadata",Ne(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Nb.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Fe(),o=await yr(n);yM({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:w,project:n}),e.status(201).json({message:"ok"})}));Gs.post("/",Ne(async(r,e)=>{let t;try{t=Db.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{ba(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=Fe(),i=(await yr(n)).mobileModules;if(Object.values(i).find(c=>c.name===t.name)){e.status(400).json({error:`A mobile module with the name "${t.name}" already exists. Please choose a different name.`});return}let a=NV.join(n.rootDir,t.folderPath??"");if(!DM.existsSync(a)||!DM.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await bM({...t,folder:a,project:n});e.status(201).json(s)}));var kM=Gs;var UM=DV();UM.get("/",Ne(async(r,e)=>{let t=Fe(),n=await yr(t),o=await Uh(n),i=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>i.add(u))});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),c={labels:a,modules:o,tests:s};e.status(200).json(c)}));var FM=UM;import{Router as kV}from"express";var Fh=kV();Fh.get("/",Ne((r,e)=>{let t=iM(Fe(),mt);e.status(200).json(t)}));Fh.get("/names",Ne((r,e)=>{let n=Fe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var BM=Fh;import{Router as UV}from"express";var zM=UV();zM.get("/",(r,e)=>{e.status(200).json({userId:ud(),orgId:Zi(),cliVersion:Dh??"0.0.0"})});var HM=zM;import{Router as FV}from"express";var GM=FV();GM.get("/",Ne(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=md.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
|
|
4390
|
-
`).filter(s=>s.trim().startsWith("package:")).map(s=>s.replace("package:","").trim()).filter(s=>s.length>0&&!s.startsWith("io.appium"))||[];e.status(200).json({packages:a})}catch(o){mt.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var VM=GM;import{Router as BV}from"express";import Bh from"path";var pd=BV();pd.patch("/:testPath",Ne(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=Ob.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0){e.status(400).json({error:"At least one of steps or settings is required"});return}let o=Fe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await yr(o);await vM({filePath:i,steps:n.steps,settings:n.settings,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:oo});let s={message:"ok"};e.status(200).json(s)}));pd.post("/",Ne((r,e)=>{let t;try{t=Ib.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}let{name:n,description:o,settings:i,pathSegments:a}=t;if(!n||typeof n!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{ba(n)}catch(g){e.status(400).json({error:g.message});return}let s=Fe(),c=Bh.join(s.rootDir,...a),{fullPath:l,testId:u}=TM({name:n,description:o,steps:[],settings:i,folder:c}),d=Bh.basename(l),m=Bh.relative(s.rootDir,l),p={id:u,fileName:d,fullPath:l,relativeFilePath:m};e.status(201).json(p)}));pd.get("/:fileName",Ne(async(r,e)=>{let t=r.params.fileName;if(!t){e.status(400).json({error:"Missing fileName in path"});return}let n=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,o=Fe(),i=await yr(o),s=await rd(n,mt,i);e.status(200).json(s)}));var WM=pd;import{Router as zV}from"express";var jM=zV();jM.get("/",Ne((r,e)=>{let t=Fe(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var $M=jM;var gd=class extends Ki{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=Fe();return Is(t,o,w)}};var YM="10mb";async function XM(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&PM(n),await IM(t);let u=Zi(),d=ud(),m=r.logger.child({orgId:u,userId:d});OM(i,A=>Os({configFilePath:A}));let p=KM();p.use(HV()),p.use(qM.json({limit:YM})),p.use(qM.urlencoded({extended:!1,limit:YM}));let g=WV();if(g.use("/folders",Lh),g.use("/entities",FM),g.use("/identify",HM),g.use("/mobile-tests",WM),g.use("/mobile-modules",kM),g.use("/assets",NM),g.use("/git",Nh),g.use("/environments",BM),g.use("/installed-packages",VM),g.use("/settings",$M),p.use("/api",g),p.use((A,I,k)=>{w.debug({url:A.url,path:A.path,query:A.query,method:A.method,body:A.body,headers:A.rawHeaders,client:A.ip},"Incoming request on mobile-desktop-server"),I.on("close",()=>{I.statusCode>=400&&(w.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"),mt.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"))}),k()}),p.use((A,I,k,W)=>{if(A instanceof Error&&A.message.includes("BadRequestError: request aborted")){k.status(400).send("Client disconnected");return}w.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),mt.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),k.status(500).send(`Internal Server Error: ${A.message}`)}),o){let A=KM.static(o,{setHeaders:I=>{I.setHeader("Cache-Control","no-cache")},redirect:!1});p.use(A),p.use("*",(I,k)=>{k.sendFile($V.join(o,"index.html"))})}let h=jV.createServer(p),f=`http://localhost:${e}`;await new Promise(A=>{try{h.listen(e,()=>{m.info(`Mobile desktop server is running at ${f}`),A()})}catch(I){I.message.includes("EADDRINUSE")?qV(e):w.error(`An unexpected error occurred while starting the server: ${I.message}`),process.exit(1)}});let b={type:"API_KEY",baseUrl:Ih(),apiKey:t,logger:m},C=new Pr(b),R=Fe(),v={...b,mode:"interactive"},{dispose:M}=nM({baseServer:h,logger:m,authorization:b,globalStateManager:md,getOrgId:()=>Zi(),getGitMetadata:async()=>await ji(m,C,R),androidDriverFactory:async({socket:A,logger:I,creationOpts:k})=>{let W=Math.floor(Math.random()*1e4)+4e4,oe=await tc(W,"appium");return iu({logger:I,driverLogLevel:a,apiClient:C,creationOpts:k,socket:A,appiumPort:oe,sessionId:A.id,orgId:Zi(),onStatusUpdate:Te=>{A.emit("connectionStatusUpdate",{message:Te})}})},mobileGeneratorFactory:async A=>new Ji({baseUrl:Ih(),apiKey:t,logger:m,mode:"interactive"}),browserGeneratorFactory:async A=>new Uo(R.config.ai?.agentConfig,v),browserEnricherFactory:async A=>new qi(v,new Uo(R.config.ai?.agentConfig,v)),storageFactory:async A=>new gd(C,A),cacheStorageFactory:async(A,I)=>ad({orgId:A,client:C,gitMetadata:I,regenerateCache:s??!1,noCache:l??!1,alwaysSaveCache:c??!1}),localToolsFactory:async()=>new Xi({httpClient:C,fakerSeed:void 0}),keepSessionAlive:A=>C.extendAndroidEmulatorTtl(A),settingsFactory:async()=>({emulator:{},ai:{},...R.config})});process.once("SIGUSR2",async()=>{return;try{await M(),await Tt.flush()}catch(A){w.error({err:A},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{w.info("SIGTERM in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{w.info("SIGINT in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}})}VV.setMaxListeners(25);process.on("warning",r=>{mt.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{mt.error({err:r},"Uncaught exception on mobile-desktop-server"),w.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{mt.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),w.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function qV(r){w.error(GV`Port ${r} is already in use by another process. Please close the other process and try again.
|
|
4385
|
+
`;import{tool as jH}from"ai";import{randomUUID as $H}from"crypto";import qH from"zod";import{tool as VH}from"ai";import WH from"zod";var Xx=r=>{let e=VH({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:WH.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(uh),n.info("AI action tool called (get_emulator_state)"),dh(t)}});return{name:uh,tool:e}};async function dh(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 Jx=r=>({name:"create_execute_step",tool:jH({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:qH.object({step:Ap}),toModelOutput:t=>t,execute:async({step:t})=>{let{contextManager:n,logger:o,controller:i}=r;o.info({step:t},"AI action tool called (create_execute_step)");let a=By(t),s={id:$H(),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 dh(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 KH}from"ai";import ph from"zod";var Qx=r=>{let e=KH({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:ph.object({message:ph.string(),success:ph.boolean()}),toModelOutput:t=>t,execute:async({message:t,success:n})=>{let{contextManager:o,logger:i}=r;return i.info({message:t,success:n},"AI action tool called (finish)"),o.finalState={message:t,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return{name:Qu,tool:e}};var Zx=[Jx,Xx,Qx];function eM(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of Zx){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getVercelAnthropicModelFactory({loggerTags:Ee(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:[XH(15),YH(Qu)],system:Yx(!1)}}async function tM(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await ZH(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 ZH(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=QH(),l=i.child({stepId:e.id,aiActionSessionId:c}),u=Date.now(),d=async(f,E)=>{let b=await n({...r,listParams:{steps:[f],tracer:s,containerName:`AI action sub-step ${E}`}});if(b.results.length!==1)throw new Error("InternalWebAgentError: Expected exactly one result from executeMobileStepList");return b.results[0]},p={stepId:e.id,parentStepIdChain:t.getParentStepIdChain()},m=new Ju({controller:o,callbacks:{onAiActionEvent:a?.onAiActionEvent,executeStep:d},logger:l,rootStep:p}),g=eM({controller:o,logger:l,contextManager:m,aiActionSessionId:c}),h=JH({...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 Error("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 eG=60*60*1e3;async function Zu(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 E=0;E<a.length;E++){let b=a[E];if(b.skipped)continue;if(o.fastForwardingToStep&&h){let A=JSON.stringify(d);if(b.id===h.fromStepId&&A===JSON.stringify(h.parentStepIdChain))o.fastForwardingToStep=!1;else if(!Jw({currentStep:b,currentParentChain:d,desiredStepId:h.fromStepId,desiredStepParentChain:h.parentStepIdChain}))continue}let C=0,R=1,v=Date.now();b.retries&&b.retries>0&&(R+=b.retries);let M=[];for(;C<R&&Date.now()-v<eG;){C++;let A=`Executing step index ${E} in ${i} - ${pg(b)}`;C!==1&&(A+=` (attempt ${C})`),c.info({step:b},A);let I=Date.now(),k=await s.startStep({logger:c,step:b,attempt:C,parentStepIdChain:d});u.trackStepExecution(b);let W=await tG({step:b,stepTracer:k,params:r}),{trace:ie}=await k.finish({parentStepIdChain:d,result:W});if(W.trace=ie,A=`Finished step index ${E} in ${i} - ${pg(b)}`,C!==1&&(A+=` (attempt ${C})`),c.info({step:{id:b.id},trace:W.trace,status:W.status},A),W.status!=="SUCCESS"&&C<R){M.push(W),Date.now()-I<1e3&&await j(1e3-(Date.now()-I));continue}if(M.length>0&&(W.previousAttempts=M),p.push(W),W.status!=="SUCCESS")return g=W.status,m=W,{results:p,status:g,terminalResult:m};if(b.envKey&&l.context.setVariable(b.envKey,W.data),f){let ge=JSON.stringify(d);if(b.id===f.toStepId&&ge===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 tG({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 qx({fixtures:n,inputs:o,step:r,stepTracer:e,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await jx({...t,moduleParams:{step:r,stepTracer:e,executeMobileStepList:Zu}});break}case"MOBILE_AI_ACTION_STEP":{s=await tM({...t,aiActionParams:{step:r,stepTracer:e,executeMobileStepList:Zu}});break}}return s}async function ed(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=nG(n);c.info({testMetadata:Cr.parse(o)},"Starting mobile test");let u=await e.startMainStepList(),d=oT(c),p=Wx(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}=await Zu({...r,listParams:{containerName:t,tracer:u,steps:l}});if(clearInterval(d?.interval),clearInterval(p),m==="SUCCESS"){let h=rG(n,l);if(h&&Object.keys(h).length>0){c.info({diffs:gi(h)},"Saving mobile step cache entries post-success");let{cachesToSave:f}=await Yr({steps:l,cacheCreationParams:{orgId:r.inputs.orgId,testId:o.id}});await i.saveEntries({logger:c,testId:o.id,entries:f})}else c.info("No cache entries to update");return{status:"PASSED",results:g}}return m==="FAILED"&&await Kw({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}}var mh=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 Do,fn.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...DE.parse(e),trace:xp.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 $i({parentStep:this.step,socket:this.socket,parentTracer:this})}},$i=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 mh({step:e.step,parentTracer:this,socket:this.socket})}},td=class{constructor(e){this.socket=e}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new $i({parentStep:null,parentTracer:null,socket:this.socket})}async startMainStepList(){return new $i({parentStep:null,parentTracer:null,socket:this.socket})}async startAfterStepList(){return new $i({parentStep:null,parentTracer:null,socket:this.socket})}};var iG=({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 td(n),g=await ed({work:{fastForwardingToStep:!!a.fromStep},fixtures:{controller:p,logger:u,cacheStorage:d,usageTracker:new Bl},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:zt.array().parse(g.results),status:g.status};s?.(h)},rM={event:"execute",createHandler:iG};import{debounce as aG}from"ts-debounce";var sG=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=aG(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))}},nM={event:"keepalive",createHandler:sG};var oM=[rM,Gx,nM,Vx];function iM(r){let{logger:e,baseServer:t,globalStateManager:n}=r,o=new lG(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0}),i=async()=>{await n.removeAllSessions(e)};o.on("connection",async s=>{let c=s.id,l=e.child({sessionId:c});l.info({event:"connection",transport:s.conn.transport.name},"Android websocket connection initiated"),s.on("disconnect",async()=>{await Hx({socket:s,globalStateManager:n,logger:l})});let u;try{u=await zx({...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}oM.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 fW}from"crypto";import{diff as Ske}from"deep-object-diff";import Mke from"yaml";import{z as Pke}from"zod";import{execSync as cG}from"child_process";function rn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,w.debug({postSaveCommand:n},"Executing post-save hook command");try{cG(n,{encoding:"utf-8"})}catch(o){w.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as K0e}from"deep-object-diff";import{cloneDeep as X0e}from"lodash-es";import{v4 as lke}from"uuid";import uke from"yaml";import uG from"@dotenvx/dotenvx";import dG from"fs";import aM from"path";function sM(r,e){return(r.config.environments??[]).map(t=>Ds(t.name,r,e))}function pG(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function mG(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=pG(i);s&&(n[o]=s);continue}let a;try{a=dG.readFileSync(aM.resolve(t.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&w.debug(n,"Set environment variables with interpolation from project configuration"),n}function gG(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=uG.config({path:aM.resolve(e.rootDir,t),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug(o,"Set environment variables from .env file"),o}function Ds(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=mG({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=gG({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 fG,readFileSync as SG,readdirSync as yG,writeFileSync as bG}from"fs";import{glob as EG}from"glob";import Fo,{dirname as lM}from"path";import{cwd as hh}from"process";import cM from"yaml";import{z as Oe}from"zod";import hG from"zod";var rd=["**/*.test.yaml","**/*.module.yaml"],gh=hG.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),nd=15;var qi="momentic.config.yaml",fh="momentic.workspace.yaml",TG=Oe.object({projects:Oe.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),vG=Oe.union([Oe.string(),Oe.object({fromFile:Oe.string(),json:Oe.boolean().optional()})]),AG=Oe.object({name:gh,baseUrl:Oe.string().optional().describe("Optional for mobile tests"),envFile:Oe.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Oe.record(Oe.string(),vG).optional(),inheritFromShell:Oe.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:uo.optional().describe("NB: most things should use project-level configuration only")}),wG=Oe.object({postSave:Oe.string().optional()}),CG=Oe.object({name:gh,include:Oe.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Oe.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Oe.string().optional(),reporterDir:Oe.string().optional(),outputDir:Oe.string().optional(),recordVideo:Oe.boolean().optional(),retries:Oe.number().optional().describe("number of retries per test"),parallel:Oe.number().optional().describe("degree of parallelism"),environments:Oe.array(AG).optional(),gitMainBranch:Oe.string().optional(),gitProtectedBranches:Oe.string().array().optional(),ai:Bp.optional(),browser:uo.optional(),emulator:Rp.optional(),advanced:zp.optional(),displayRoot:Oe.string().optional().describe("relative path from project root to use as the Repository root"),hooks:wG.optional()});function uM(r,e){let t;try{t=SG(r,"utf-8")}catch(o){w.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=cM.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){w.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function Sh(r){let e=uM(r,"project configuration");if(e!==void 0)try{return CG.parse(e)}catch(t){w.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function RG(r){let e=uM(r,"workspace configuration");if(e!==void 0)try{return TG.parse(e)}catch(t){w.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function xG(){let r=[],e=hh(),t=Fo.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=Fo.basename(e);if(ql.includes(i))return w.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of yG(e))if(a.endsWith(qi)){let s=Fo.join(e,a),c=Sh(s);c&&r.push({configFilePath:s,config:c,rootDir:lM(s)})}if(r.length)return r;if(e=Fo.dirname(e),e===t)break}return r}async function ks(r={}){let{configFilePath:e,nameFilter:t}=r,n=await _G(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
4386
|
+
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return w.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function MG(r){let e=RG(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${qi}`)),n=AbortSignal.timeout(2e3),o;try{o=await EG(t,{absolute:!1,cwd:hh(),dotRelative:!1,maxDepth:nd,nodir:!0,signal:n})}catch(a){throw w.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${fh} is misconfigured.`),a}let i=[];for(let a of o){let s=Fo.join(hh(),a),c=Sh(s);c&&i.push({configFilePath:s,config:c,rootDir:lM(s)})}return i}async function _G(r){if(r){r=Fo.resolve(r);let t=Sh(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:Fo.dirname(r)}]}if(fG(fh)){let t=await MG(fh);if(t)return t}return xG()}function dM(r,e){let t=cM.stringify(r);bG(e,t)}import mM from"fs";import{glob as PG}from"glob";import Us from"path";import IG from"yaml";import{z as pM}from"zod";var gM=!1,OG=pM.object({fileType:pM.nativeEnum(Ne)});async function br(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??rd,o=Array.from(r.config.exclude??[]).concat(Kl),i=AbortSignal.timeout(5e3),a;try{a=await PG(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:nd,nodir:!0,signal:i})}catch(s){throw w.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let c=LG(r.rootDir,s,t,e?kn:w);c&&(t.duplicateEntities[c.id]=c.paths)}return gM=!0,t}function LG(r,e,t,n){let o=Us.join(r,e),i=NG(o,n);if(!i)return;let a=DG(i,o,n);if(!a)return;let s=OG.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=kG(o,n);if(!l)return;let u=UG(e,o,l);switch(c){case Ne.TEST:try{return FG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case Ne.MODULE:try{return BG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case Ne.MOBILE_TEST:try{return HG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case Ne.MOBILE_MODULE:try{return zG(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 NG(r,e){try{return mM.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function DG(r,e,t){try{let n=IG.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 kG(r,e){try{return mM.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function UG(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:Us.sep,fullPathSegments:e.split(Us.sep),relativePathSegments:r.split(Us.sep),fileName:Us.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function FG(r,e,t,n,o){let i=mi.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:Ne.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function BG(r,e,t,n,o){let i=or.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:Ne.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!gM&&Fr(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 zG(r,e,t,n,o){let i=za.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:Ne.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function HG(r,e,t,n,o){let i=Cr.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:Ne.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,...t},a}import{z as yh}from"zod";var hM="test-results";var yUe=yh.object({width:yh.number(),height:yh.number()});import{execFile as GG}from"node:child_process";import{promisify as VG}from"node:util";import WG from"simple-git";var Ue=WG(),fM=VG(GG);async function jG(r){let e=await Fe(r,Ue.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
|
|
4387
|
+
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function $G(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 fM("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 fM("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function qG(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return $G(r,e,t);if(o)return}catch{}}function od(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 Fe(r,e){try{return(await e).trim()}catch(t){if(t instanceof Error&&t.message.includes("not a git repository"))return;r.error({err:t},"Failed to run git command");return}}function KG(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild"}async function YG(r){let[e,t,n]=await Promise.all([Fe(r,Ue.show(["--no-patch","--format=%ci"])),Fe(r,Ue.show(["-s","--pretty=%B"])),Fe(r,Ue.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 XG(r){let[e,t,n]=await Promise.all([Fe(r,Ue.listRemote(["--get-url","origin"])),Fe(r,Ue.show(["-s","--pretty=%B"])),Fe(r,Ue.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 JG(r){let[e,t,n,o]=await Promise.all([Fe(r,Ue.show(["--no-patch","--format=%ci"])),Fe(r,Ue.listRemote(["--get-url","origin"])),Fe(r,Ue.show(["-s","--pretty=%B"])),Fe(r,Ue.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?od(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function QG(r){let[e,t,n]=await Promise.all([Fe(r,Ue.show(["--no-patch","--format=%ci"])),Fe(r,Ue.show(["-s","--pretty=%B"])),Fe(r,Ue.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?od(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 ZG(r){let[e,t,n]=await Promise.all([Fe(r,Ue.show(["--no-patch","--format=%ci"])),Fe(r,Ue.show(["-s","--pretty=%B"])),Fe(r,Ue.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?od(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 eV(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Fe(r,Ue.revparse(["HEAD"])),Fe(r,Ue.revparse(["--short","HEAD"])),Fe(r,Ue.revparse(["--abbrev-ref","HEAD"])),Fe(r,Ue.listRemote(["--get-url","origin"])),Fe(r,Ue.show(["--no-patch","--format=%ci"])),Fe(r,Ue.show(["-s","--pretty=%B"])),Fe(r,Ue.show(["-s","--pretty=%an"])),e?Fe(r,Ue.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),jG(r)]),d=l?await Fe(r,Ue.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?od(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,E=u["user.username"]||void 0,b=await qG(r,i,u)??E??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function tV(){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 rV(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Fs(r,e){let t=KG();if(!t)return eV(r,e);switch(t){case"GithubActions":return YG(r);case"GitlabCI":return XG(r);case"CircleCI":return JG(r);case"Buildkite":return QG(r);case"AzureDevOps":return ZG(r);case"GCPCloudBuild":return tV()}}async function nV(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 oV(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 iV(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await oV(r,e,n,o,t)}else if(t.gitlabProjectPath)return await nV(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function Ki(r,e,t){let n=await rV(t),o=await Fs(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 iV(r,e,i);return{...n,...o,...a}}import{diff as SM}from"deep-object-diff";import Qn from"fs";import{cloneDeep as aV}from"lodash-es";import id from"path";import{v4 as sV}from"uuid";import Bs from"yaml";function yM(r,e){let t=`${Fr(e)}.module.yaml`,n=id.join(id.dirname(r),t);if(Qn.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return Qn.renameSync(r,n),n}function bM({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||!Qn.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=Qn.readFileSync(i,"utf-8"),c=Bs.parse(s),l={...c,...r,schemaVersion:e},u=Mo({fileType:Ne.MOBILE_MODULE,...za.parse(l),steps:Vt.array().parse(r.steps)}),d=!!r.name&&r.name!==a,p=SM(u,c);if(p&&Object.keys(p).length===0&&!o&&!d)return;let m=Bs.stringify(u);Qn.writeFileSync(i,m,"utf-8");let g;d&&(g=yM(i,r.name)),rn(g||i,n.config)}function EM({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=zs(i,o),s={...a,...e},c=Mo({fileType:Ne.MOBILE_MODULE,...Ul.parse(s)}),l=SM(c,a);if(l&&Object.keys(l).length===0)return;let u=Bs.stringify(c);Qn.writeFileSync(i,u,"utf-8");let d;e.name&&(d=yM(i,e.name)),rn(d||i,n.config)}async function TM({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=Fr(r),s=id.join(o,`${a}.module.yaml`),c=sV(),{stepsToSave:l}=await Yr({steps:n}),u={schemaVersion:Mn,moduleId:c,description:e,enabled:t},d={fileType:Ne.MOBILE_MODULE,...u,steps:l},p=Bs.stringify(Yy.parse(d));return Qn.writeFileSync(s,p,"utf-8"),rn(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function zs(r,e){let t=Qn.readFileSync(r,"utf-8"),n=Bs.parse(t);try{return{...Ul.parse(n),name:id.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 bh(r,e,t,n){let o=zs(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 zs(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]=aV(a)),a}async function vM(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await bh(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as lV}from"crypto";import Er from"fs";import Zn from"path";import Xi from"yaml";import Yi from"zod";function AM({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${Fr(r)}.test.yaml`,s=Zn.join(o,a);if(Er.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:Ne.MOBILE_TEST,id:lV(),description:e,schemaVersion:lo,settings:n,steps:t},l=Xi.stringify(c);return Er.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function cV(r){if(!Er.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=Er.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
|
|
4388
|
+
`),t=Xi.parse(e);if(!t.steps||!Array.isArray(t.steps))throw new Error(`Test ${r} is missing steps`);return t}async function ad(r,e,t){let n=cV(r),o;try{o=Cr.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await Ww({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 zs(c,e)}});return{...o,steps:i.steps}}async function wM({filePath:r,steps:e,settings:t,folder:n,project:o,momenticFiles:i,schemaVersion:a}){let s=Zn.isAbsolute(r)?r:Zn.join(n,r);if(!Er.existsSync(s))throw new Error(`Test file not found: ${s}`);let c=Er.readFileSync(s,"utf-8").replace(/\r\n|\r/g,`
|
|
4389
|
+
`),l=Xi.parse(c),u=Fl.extend({steps:Yi.record(Yi.string(),Yi.unknown()).array()}).parse({...l,schemaVersion:a});if(u.fileType!==Ne.MOBILE_TEST)throw new Error(`File at '${s}' is not a mobile test (fileType=${u.fileType}).`);let d;e&&(d=await Yr({steps:e}));let p={...u,...d?.stepsToSave!==void 0?{steps:d.stepsToSave}:{steps:u.steps},...t!==void 0?{settings:t}:{}},m=Xi.stringify(p);for(let g of d?.moduleUpdates??[])bM({content:g,schemaVersion:lo,momenticFiles:i,project:o});Er.writeFileSync(s,m,"utf-8"),rn(s,o.config)}function CM(r,e,t){let n=Zn.join(t.rootDir,r);if(!Er.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=Er.readFileSync(n,"utf-8").replace(/\r\n|\r/g,`
|
|
4390
|
+
`),i=Xi.parse(o),a=Fl.extend({steps:Yi.record(Yi.string(),Yi.unknown()).array()}).parse(i),s=Zn.basename(r,".test.yaml"),c,l;if(e.name&&e.name!==s){let p=`${Fr(e.name)}.test.yaml`;if(c=Zn.join(Zn.dirname(r),p),l=Zn.join(t.rootDir,c),Er.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!==Ne.MOBILE_TEST)throw new Error(`File at '${n}' is not a mobile test (fileType=${u.fileType}).`);let d=Xi.stringify(u);return Er.writeFileSync(n,d,"utf-8"),l&&l!==n?(Er.renameSync(n,l),rn(l,t.config)):rn(n,t.config),{newRelativeTestPath:c}}import{randomUUID as uV}from"crypto";import eo from"fs";import Ji from"path";var RM=new Set([".DS_Store","__MACOSX"]),xM={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 dV(r,e,t){if(xM[t]){let i=xM[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 Eh=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 MM(r,e){try{let t=Ji.join(e,"metadata.json");return rc.parse(JSON.parse(eo.readFileSync(t,"utf-8")))}catch{throw new Eh(r,e)}}function _M(r,e,t){let n=uV(),o=r.child({runGroupId:n});eo.rmSync(e,{recursive:!0,force:!0});let i=eo.readdirSync(t).filter(c=>!RM.has(c)).map(c=>Ji.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);eo.mkdirSync(e,{recursive:!0});let a={...MM(t,i[0]),id:n};for(let c of i){let l=Ji.join(c,"runs");if(!eo.existsSync(l))continue;let u=MM(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=dV(a,u,m)}let d=eo.readdirSync(l);for(let p of d){if(RM.has(p))continue;let m=Ji.join(l,p),g=Ji.join(e,"runs",p);eo.cpSync(m,g,{recursive:!0})}}let s=Ji.join(e,"metadata.json");eo.writeFileSync(s,JSON.stringify(a,null,2))}import IM from"adm-zip";import Rh from"fs";import{z as bV}from"zod";var U="v1",Th="mobile-cli",Bo="0.14.0";var pV=9e4,mV=3,gV=1500,hV=15e3,Ir=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function fV(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var vh=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Bo&&(e[Zl]=Bo),Th&&(e[Hb]=Th),e}async sendRequest(e,t){let{retries:n=mV,requestTimeoutMs:o=pV,initialRetryDelayMs:i=gV,maxRetryDelayMs:a=hV,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 Ir&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Un),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 p=await fV(u);throw new Ir(u.status,p,`Request to ${t.method} ${e} failed with status ${u.status}: ${p}`)}let d;if(u.status===204)d={};else{let p=await u.text();try{d=JSON.parse(p)}catch{d=p}}return this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},nn=class extends vh{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[zb]:this.mode??""}}};import{createAnthropic as SV}from"@ai-sdk/anthropic";function yV(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[Zl]:Bo??"",...t&&{[Vb]:t},...n||{}};return o&&(i[Gb]=JSON.stringify(o)),i}var sd=r=>e=>{let t=yV(r);return SV({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)};var zo=class extends nn{agentConfig;constructor(e,t){let n={...Py,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return hy.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${U}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Bo,...e},signal:t.abortSignal});return gy.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return bV.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 Yb.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 Gp.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 Kb.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 jb.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 $b.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 qb.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 Gp.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 Wb.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 tp.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 Xb.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 Zd.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return qS.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return KS.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${U}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Bd.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return _y.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return GS.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return jS.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return WS.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return tf.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return sd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as Ah}from"zod";var Or=class extends nn{constructor(e){super({...e,mode:void 0})}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{w.warn(`API key check failed: ${t.message}`)}});return cE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return iE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return Qb.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 eE.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 tE.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Jb.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return lE.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return uE.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 CE.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 dE.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${U}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return uy.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${U}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,t){try{await this.sendRequest(`/${U}/billing/events`,{method:"POST",body:t,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return pE.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 mE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return gE.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 hE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return ME.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 $a.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 $a.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 $p.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 $a.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 $a.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 $p.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ah.record(Ah.string(),Ah.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return fE.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 SE.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 yE.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 bE.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function wh(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(w.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),w.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return w.debug("Got auth info from API"),n}var ld=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var Qi=class extends nn{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${U}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return rf.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Zi=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as EV,en as TV}from"@faker-js/faker";var ea="v1",ta=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 EV({locale:TV}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${ea}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Ir?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${ea}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Ir?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${ea}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Ir?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${ea}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Ir?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${ea}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Ir?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${ea}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Ir?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 cd=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 ra=class extends nn{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 tb.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 ob.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 sb.parse(n)}getVercelAnthropicModelFactory({loggerTags:e,sessionId:t}){return sd({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:t,loggerTags:e})}};function ud({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i}){return i?new tc:new Ch(r,e,t,{alwaysSaveCache:o,regenerateCache:n})}var Ch=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{regenerateCache:i,alwaysSaveCache:a}=o,{gitBranchName:s,gitProtectedBranches:c}=n;this.cacheHeaders=Vp(n),this.readCaches=!i;let l=s&&c.includes(s);a||!l?this.writeCaches=!0:this.writeCaches=!1}cacheHeaders;readCaches;writeCaches;async saveEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateMobileStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.warn({err:o},"Failed to save mobile step cache entries, continuing...")}}async resolveEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t}=e.stepLists,n=await this.client.getMobileStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}for(let i of[t])i&&cg({steps:i,stepCacheEntries:n,logger:e.logger});let{cachesToSave:o}=await Yr({steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateMobileStepCaches({entries:o,testId:e.testId},this.cacheHeaders)}};import dd from"path";function vV(r){let e=new IM,t=dd.join(r,"metadata.json"),n=rc.parse(JSON.parse(Rh.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Rh.readdirSync(dd.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new IM(dd.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(dd.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function pd(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Rh.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new cd(e);try{let{runGroupId:i,buffer:a}=vV(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 AV from"adm-zip";import vt from"fs";import Xt from"path";var Hs=class r{constructor(e){this.filePath=e;vt.rmSync(this.filePath,{recursive:!0,force:!0}),vt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Xt.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){vt.mkdirSync(Xt.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Xt.join(this.filePath,e);if(vt.existsSync(t))return vt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.filePath,t);try{vt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Xt.join(this.filePath,e);return vt.createWriteStream(t)}createRunArchive(e){return new xh(Xt.join(this.filePath,"runs"),e)}},xh=class{constructor(e,t){this.filePath=e;this.tempPath=Xt.join(e,`temp-storage-${t}`),this.finalPath=Xt.join(e,`${t}.zip`),vt.rmSync(this.tempPath,{recursive:!0,force:!0}),vt.rmSync(this.finalPath,{recursive:!0,force:!0}),vt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Xt.join(this.tempPath,e);if(vt.existsSync(t))return vt.readFileSync(t)}mkdir(e){vt.mkdirSync(Xt.join(this.tempPath,e),{recursive:!0})}cd(e){return new Hs(Xt.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.tempPath,t);vt.writeFileSync(o,n)}createFileStream(e){let t=Xt.join(this.tempPath,e);return vt.createWriteStream(t)}close(){let e=new AV;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();vt.writeFileSync(this.finalPath,t),vt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import Y1e from"adm-zip";import Ad from"fs";import XM from"body-parser";import $V from"cors";import qV from"dedent";import{Router as xV}from"express";import Ht from"fs";import{globSync as MV}from"glob";import St from"path";import md from"fs";import wV from"path";var CV=new yu(30,60*1e3),Ih="https://api.momentic.ai",_h,LM=r=>{Ih=r},Oh=()=>Ih,Gs=()=>_h;var na,Ph,OM,NM=async r=>{if(_h&&na&&OM)return na;let e=new Or({baseUrl:Ih,apiKey:r,logger:w});_h=e;try{let t=await e.getAuthInfo();return na=t.orgId,Ph=t.userId,OM=r,na}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},oa=()=>{if(!na)throw new Error("Your organization ID is invalid.");return na},gd=()=>{if(!Ph)throw new Error("Your user ID is invalid.");return Ph};var Lh,Mh,DM=(r,e)=>{Lh=r,Mh?.abort(),Mh=new AbortController;let t=Mh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=wV.resolve(r.rootDir,o.envFile);try{if(md.lstatSync(i).isSymbolicLink())return;md.existsSync(i)&&n.push(i)}catch(a){w.warn({err:a},`Failed to check if env file ${i} exists`)}});try{RV({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){w.error({err:o},"Failed to start config file watchers")}},ke=()=>Lh;function RV({filesToWatch:r,revalidator:e,signal:t,project:n}){w.debug("Starting watch on the following files:"),r.forEach(o=>{w.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(CV.increment("setLocalProject")&&w.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Lh=await Promise.resolve(e(n.configFilePath)))};md.watchFile(o,{persistent:!1},i);let a=()=>{md.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Le(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var Ws=xV();function Vs(r){let e=ke(),t=St.dirname(e.configFilePath);return St.join(t,...r)}function _V(r){let e=ke(),t=St.dirname(e.configFilePath),n=St.relative(t,r);return n?n.split(St.sep):[]}function PV(r,e){let t=Ht.statSync(r),n=_V(r);return kp.parse({name:e,absolutePath:r,relativePath:n.join(St.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Ws.post("/",Le(async(r,e,t)=>{let n;try{n=Cb.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Vs(n);if(!Ht.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(St.sep)}`});return}if(!Ht.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}let a=ke(),s=Array.from(a.config.exclude??[]).concat(Kl),l=MV("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=St.join(o,d);return PV(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));Ws.put("/",Le(async(r,e,t)=>{let n;try{n=Rb.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Vs(n);if(Ht.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(St.sep)}`,pathSegments:n});return}Ht.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(St.sep)}`,pathSegments:n};e.status(201).json(i)}));Ws.patch("/",Le(async(r,e,t)=>{let n,o;try{let l=xb.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=Vs(n),a=Vs(o);if(!Ht.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(St.sep)}`});return}if(Ht.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(St.sep)}`});return}let s=St.dirname(a);Ht.existsSync(s)||Ht.mkdirSync(s,{recursive:!0}),Ht.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(St.sep)} to ${o.join(St.sep)}`,pathSegments:o};e.status(200).json(c)}));Ws.delete("/",Le(async(r,e,t)=>{let n,o=!0;try{let c=Mb.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=Vs(n);if(!Ht.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(St.sep)}`,pathSegments:n});return}if(!Ht.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}if(o)Ht.rmSync(i,{recursive:!0,force:!0});else{if(Ht.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Ht.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Nh=Ws;import{Router as LV}from"express";import{hostname as IV}from"os";var OV="0.14.0",js=bi({app:"desktop-server",hostname:IV(),disableConsoleLogs:!0}).child({cliVersion:OV});(async()=>{try{let r=await Fs(js);r.gitBranchName&&js.addBinding("branch",r.gitBranchName)}catch{}})();var kM=LV();kM.get("/",async(r,e)=>{let t=ke(),n=Gs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Ki(js,n,t);e.status(200).json(o)});var Dh=kM;import KV from"events";import JM,{Router as YV}from"express";import XV from"http";import JV from"path";var hd=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}hasActiveLocalSession(){for(let e of this.sessions.values())if(e.local===!0)return!0;return!1}async removeSession(e,t){let n=this.sessions.get(e);if(n)try{await n.cleanup?.(),t.info({sessionId:e,emulatorName:n.emulatorName},"Android emulator cleaned up")}catch(o){t.error({err:o},"Error during Android session cleanup")}finally{this.sessions.delete(e)}}async removeAllSessions(e){let t=Array.from(this.sessions.keys());await Promise.all(t.map(n=>this.removeSession(n,e)))}};var fd=new hd;import{Router as DV}from"express";import{existsSync as kV}from"fs";import UV from"path";import{hostname as NV}from"os";var kh="0.14.0",pt=bi({app:"mobile-desktop-server",hostname:NV(),disableConsoleLogs:!0}).child({cliVersion:kh});(async()=>{try{let r=await Fs(pt);r.gitBranchName&&pt.addBinding("branch",r.gitBranchName)}catch{}})();var Uh=DV();Uh.get("/",Le(async(r,e)=>{let t=Gs();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));Uh.post("/upload-url",Le(async(r,e)=>{let t;try{t=Db.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Gs();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=UV.resolve(t.filePath);if(!kV(o)){e.status(400).json({error:`File not found: ${o}`});return}await du({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:pt}),e.sendStatus(204)}));var UM=Uh;import{Router as zV}from"express";import{Router as FV}from"express";import FM from"fs";import BV from"path";var $s=FV();async function Fh(r){return(await vM(r,pt)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){w.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}$s.get("/",Le(async(r,e)=>{let t=ke(),n=await br(t),o=await Fh(n);e.status(200).json(o)}));$s.get("/:moduleId",Le(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await br(ke()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await bh(n,t,w);e.json(o)}catch(o){e.status(400).json({err:o})}}));$s.patch("/:moduleId/metadata",Le(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=kb.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=ke(),o=await br(n);EM({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:w,project:n}),e.status(201).json({message:"ok"})}));$s.post("/",Le(async(r,e)=>{let t;try{t=Ub.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{wa(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=ke(),i=(await br(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=BV.join(n.rootDir,t.folderPath??"");if(!FM.existsSync(a)||!FM.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await TM({...t,folder:a,project:n});e.status(201).json(s)}));var BM=$s;var zM=zV();zM.get("/",Le(async(r,e)=>{let t=ke(),n=await br(t),o=await Fh(n),i=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>i.add(u))});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),c={labels:a,modules:o,tests:s};e.status(200).json(c)}));var HM=zM;import{Router as HV}from"express";var Bh=HV();Bh.get("/",Le((r,e)=>{let t=sM(ke(),pt);e.status(200).json(t)}));Bh.get("/names",Le((r,e)=>{let n=ke().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var GM=Bh;import{Router as GV}from"express";var VM=GV();VM.get("/",(r,e)=>{e.status(200).json({userId:gd(),orgId:oa(),cliVersion:kh??"0.0.0"})});var WM=VM;import{Router as VV}from"express";var jM=VV();jM.get("/",Le(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=fd.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
|
|
4391
|
+
`).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){pt.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var $M=jM;import{Router as WV}from"express";import Sd from"path";var qs=WV();qs.patch("/:testPath",Le(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=Lb.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0){e.status(400).json({error:"At least one of steps or settings is required"});return}let o=ke(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await br(o);await wM({filePath:i,steps:n.steps,settings:n.settings,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:lo});let s={message:"ok"};e.status(200).json(s)}));qs.post("/",Le((r,e)=>{let t;try{t=Ob.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{wa(n)}catch(g){e.status(400).json({error:g.message});return}let s=ke(),c=Sd.join(s.rootDir,...a),{fullPath:l,testId:u}=AM({name:n,description:o,steps:[],settings:i,folder:c}),d=Sd.basename(l),p=Sd.relative(s.rootDir,l),m={id:u,fileName:d,fullPath:l,relativeFilePath:p};e.status(201).json(m)}));qs.get("/:fileName",Le(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=Sd.basename(n).replace(".test.yaml",""),i=ke(),a=await br(i),c={...await ad(n,pt,a),name:o};e.status(200).json(c)}));qs.patch("/:testPath/metadata",Le(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=Nb.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}let o=ke(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,s={message:"ok",newRelativeTestPath:CM(i,n,o).newRelativeTestPath};e.status(200).json(s)}));var qM=qs;import{Router as jV}from"express";var KM=jV();KM.get("/",Le((r,e)=>{let t=ke(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var YM=KM;var yd=class extends Zi{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=ke();return Ds(t,o,w)}};var QM="10mb";async function ZM(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&LM(n),await NM(t);let u=oa(),d=gd(),p=r.logger.child({orgId:u,userId:d});DM(i,A=>ks({configFilePath:A}));let m=JM();m.use($V()),m.use(XM.json({limit:QM})),m.use(XM.urlencoded({extended:!1,limit:QM}));let g=YV();if(g.use("/folders",Nh),g.use("/entities",HM),g.use("/identify",WM),g.use("/mobile-tests",qM),g.use("/mobile-modules",BM),g.use("/assets",UM),g.use("/git",Dh),g.use("/environments",GM),g.use("/installed-packages",$M),g.use("/settings",YM),m.use("/api",g),m.use((A,I,k)=>{w.debug({url:A.url,path:A.path,query:A.query,method:A.method,body:A.body,headers:A.rawHeaders,client:A.ip},"Incoming request on mobile-desktop-server"),I.on("close",()=>{I.statusCode>=400&&(w.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"),pt.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"))}),k()}),m.use((A,I,k,W)=>{if(A instanceof Error&&A.message.includes("BadRequestError: request aborted")){k.status(400).send("Client disconnected");return}w.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),pt.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),k.status(500).send(`Internal Server Error: ${A.message}`)}),o){let A=JM.static(o,{setHeaders:I=>{I.setHeader("Cache-Control","no-cache")},redirect:!1});m.use(A),m.use("*",(I,k)=>{k.sendFile(JV.join(o,"index.html"))})}let h=XV.createServer(m),f=`http://localhost:${e}`;await new Promise(A=>{try{h.listen(e,()=>{p.info(`Mobile desktop server is running at ${f}`),A()})}catch(I){I.message.includes("EADDRINUSE")?QV(e):w.error(`An unexpected error occurred while starting the server: ${I.message}`),process.exit(1)}});let b={type:"API_KEY",baseUrl:Oh(),apiKey:t,logger:p},C=new Or(b),R=ke(),v={...b,mode:"interactive"},{dispose:M}=iM({baseServer:h,logger:p,authorization:b,globalStateManager:fd,getOrgId:()=>oa(),getGitMetadata:async()=>await Ki(p,C,R),androidDriverFactory:async({socket:A,logger:I,creationOpts:k})=>{let W=Math.floor(Math.random()*1e4)+4e4,ie=await ac(W,"appium");return uu({logger:I,driverLogLevel:a,apiClient:C,creationOpts:k,socket:A,appiumPort:ie,sessionId:A.id,orgId:oa(),onStatusUpdate:ge=>{A.emit("connectionStatusUpdate",{message:ge,type:"info"})},onConnectionStateChange:ge=>{ge==="disconnected"?A.emit("connectionStatusUpdate",{message:"Emulator websocket connection lost.",type:"disconnected"}):ge==="reconnecting"||ge==="connecting"?A.emit("connectionStatusUpdate",{message:"Emulator websocket is reconnecting...",type:ge==="reconnecting"?"reconnecting":"connecting"}):ge==="connected"&&A.emit("connectionStatusUpdate",{message:"Emulator websocket connection restored",type:"connected"})}})},mobileGeneratorFactory:async A=>new ra({baseUrl:Oh(),apiKey:t,logger:p,mode:"interactive"}),browserGeneratorFactory:async A=>new zo(R.config.ai?.agentConfig,v),browserEnricherFactory:async A=>new Qi(v,new zo(R.config.ai?.agentConfig,v)),storageFactory:async A=>new yd(C,A),cacheStorageFactory:async(A,I)=>ud({orgId:A,client:C,gitMetadata:I,regenerateCache:s??!1,noCache:l??!1,alwaysSaveCache:c??!1}),localToolsFactory:async()=>new ta({httpClient:C,fakerSeed:void 0}),keepSessionAlive:A=>C.extendAndroidEmulatorTtl(A),settingsFactory:async()=>({emulator:{},ai:{},...R.config})});process.once("SIGUSR2",async()=>{return;try{await M(),await Tt.flush()}catch(A){w.error({err:A},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{w.info("SIGTERM in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{w.info("SIGINT in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}})}KV.setMaxListeners(25);process.on("warning",r=>{pt.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{pt.error({err:r},"Uncaught exception on mobile-desktop-server"),w.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{pt.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),w.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function QV(r){w.error(qV`Port ${r} is already in use by another process. Please close the other process and try again.
|
|
4391
4392
|
Using Bash on MacOS or Linux:
|
|
4392
4393
|
lsof -t -i :58888 | xargs kill -9
|
|
4393
4394
|
|
|
4394
4395
|
Using Command Prompt on Windows:
|
|
4395
4396
|
for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
|
|
4396
|
-
`)}import
|
|
4397
|
+
`)}import SW from"open";import wd from"path";import{fileURLToPath as yW}from"url";import{InvalidArgumentError as bd,Option as rt}from"@commander-js/extra-typings";import{z as ZV}from"zod";var e_=58890;function Ed(r){let e=parseInt(r,10);if(isNaN(e))throw new bd("Not a number.");return e}var Ks=new rt("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new bd("API key is required.");return r}).makeOptionMandatory(),zh=new rt("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Ys=new rt("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return ZV.string().url().parse(r),r}catch{throw new bd("Not a valid URL.")}}),Hh=new rt("-y, --yes","Skip all confirmation prompts.").env("CI"),Gh=new rt("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.").implies({disableCache:!1,saveCache:!0}),Vh=new rt("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI").implies({disableCache:!1}),Wh=new rt("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1,regenerateCache:!1}),jh=new rt("--tag <tag>","Tag identifier for the asset."),t_=new rt("--channel <channel>","Channel name for the asset."),r_=new rt("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),n_=new rt("--env <env>","Environment to run all tests in (overrides test-level configuration)."),o_=new rt("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),i_=new rt("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),a_=new rt("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Ed),s_=new rt("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=Ed(r);if(e<1)throw new bd("Shard index must be greater than 0.");return e}),l_=new rt("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(Ed),$h=new rt("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),c_=new rt("--upload-results","Upload test results to Momentic Cloud.").default(!1),qh=new rt("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),u_=new rt("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),d_=new rt("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(Ed);import{randomUUID as dW}from"crypto";import{existsSync as pW}from"fs";import Kh from"fs";import Td from"path";import{cwd as tW}from"process";async function p_({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,logger:a,quarantinedTestReasons:s}){let c=new Set;if(r&&r.length>0){let u=r.some(p=>Kh.existsSync(p)),d=tW();u?(d!==t.rootDir&&a.warn(`The current working directory ('${d}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),a.info(`Reading tests from the following local file paths:
|
|
4397
4398
|
- ${r.join(`
|
|
4398
4399
|
- `)}
|
|
4399
|
-
`),r.forEach(
|
|
4400
|
+
`),r.forEach(p=>{if(!Kh.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let m,g;try{m=Kh.statSync(p),g=m.isDirectory()}catch(f){a.warn({err:f},`Skipping path ${p} because it cannot be read`);return}let h=Td.resolve(p);Object.values(e.mobileTests).filter(f=>g?f.fullFilePath.startsWith(h):f.fullFilePath===h).forEach(f=>{c.add(f.fullFilePath)})})):(a.info("The arguments provided don't appear to be valid paths. Treating them as substrings instead... "),Object.values(e.mobileTests).forEach(p=>{r.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await nc("No test paths or substrings were provided. Do you want to run all tests?")&&(a.error("Cancelled by user."),process.exit(1));let u=Object.values(e.mobileTests);a.info(`Reading all ${u.length} mobile tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of Array.from(c)){let d=Td.relative(t.rootDir,u);o&&!o.some(p=>new RegExp(p).test(d))&&c.delete(u),i&&i.some(p=>new RegExp(p).test(d))&&c.delete(u)}return(await Promise.all(Array.from(c).map(async u=>{try{let d=Td.relative(t.rootDir,u),p=await ad(u,a,e),m=Td.basename(u,".test.yaml");return p.disabled?null:{id:p.id,name:m,description:p.description,schemaVersion:p.schemaVersion,settings:p.settings,steps:p.steps,fullFilePath:u,relativeFilePath:d,quarantined:!!s[p.id],quarantinedReason:s[p.id]}}catch(d){a.error(`Failed to read and resolve mobile test at '${u}': ${d}`),process.exit(1)}}))).filter(u=>!!u)}import{randomUUID as rW}from"crypto";import{existsSync as nW,statSync as oW}from"fs";import{cloneDeep as iW}from"lodash-es";import aW from"path";async function m_(r){let{inputs:e,fixtures:t,metadata:n,options:o}=r,{tracer:i,logger:a}=t,{runId:s}=n,{testDefinition:c,runSigIntHandlers:l,project:u}=e,d=new Date,p=await i.startRun({logger:a,testId:c.id,testName:c.name,runId:s,testDescription:c.description,schemaVersion:c.schemaVersion,originalSteps:{steps:iW(c.steps),beforeSteps:void 0,afterSteps:void 0},quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}),m=a.child(p.loggerBindings||{}),g=1+(c.settings?.retries??u.config.retries??1);try{for(let h=0;h<g;h++){let f=new Date,E=await sW({runTracer:p,testDefinition:c,metadata:n,constants:{attemptNumber:h,totalAttempts:g},fixtures:{...t,logger:m},inputs:e,options:o}),b=new Date;if(E.status!=="FAILED")return await p.finish({logger:a,...E,finishedAt:b}),{...E,startedAt:d,lastAttemptStartedAt:f,finishedAt:b,runId:s,attempts:h+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason};if(h!==g-1){a.warn("Retrying failed mobile run");continue}return a.error("Mobile test failed after all exhausting attempts"),await p.finish({logger:a,...E,finishedAt:b}),{...E,startedAt:d,lastAttemptStartedAt:f,finishedAt:b,runId:s,attempts:h+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}}throw new Error("This code should not be reachable")}finally{l?.pop()}}async function sW(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:E,project:b,envOverride:C}=a,{regenerateCache:R,alwaysSaveCache:v,noCache:M,logLevel:A,localAvdId:I,localApkPath:k}=s;c!==0&&h("RETRY",`attempt ${c}/${l}`);let W={...a.project.config.emulator,...t.settings?.emulator},ie=k?aW.resolve(k):void 0;if(ie&&(!nW(ie)||!oW(ie).isFile()))throw new Error(`Local APK path "${ie}" does not exist. Provide a valid file path via --local-apk-path.`);let ge=ud({orgId:u,client:p,gitMetadata:d,regenerateCache:R??!1,alwaysSaveCache:v??!1,noCache:M??!1}),At=new Zi(p,u),G={type:"API_KEY",baseUrl:p.baseUrl,apiKey:p.apiKey,logger:m,mode:"runner"},$=new ra(G),fe=new zo(b.config.ai?.agentConfig,G),se=new Qi(G,fe),Ce=new ta({httpClient:p,fakerSeed:void 0}),Me=Math.floor(Math.random()*1e4)+4e4,Jt=await ac(Me,"appium"),qt=W.region==="local"?ie??t.settings?.defaultApkFilePath?.trim():void 0,_e=f&&!qt?{channel:f,tag:E}:void 0,$e,lt;if(I||W.region==="local"){if(!W.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is set to local. Provide --local-avd-id or configure a default local emulator AVD.");lt=I??W.localEmulatorSettings?.avdId,$e={avdId:lt,apkToInstall:_e,apkFilePath:qt}}else $e={region:W.region,apkToInstall:_e,osVersion:W.remoteEmulatorSettings?.androidVersion??Wy};let Pt=rW(),Gt=await uu({apiClient:p,logger:m,driverLogLevel:A,creationOpts:$e,onStatusUpdate:Qt=>{m.debug({status:Qt},"Limbar emulator status update")},appiumPort:Jt,orgId:u,sessionId:Pt,onConnectionStateChange:Qt=>{Qt==="disconnected"?w.warn("Emulator websocket connection lost. Emulator may be unavailable."):(Qt==="reconnecting"||Qt==="connecting")&&w.info("Emulator websocket is reconnecting...")}}),Ho=await e.startAttempt({emulatorName:Gt.emulatorName,runAttemptId:Pt}),Go=m.child(Ho.loggerBindings||{}),Vo=await pu({driver:Gt.driver,onLogs:Qt=>{Ho.appendLogs(Qt)}}),Cd=C||t.settings?.defaultEnv,ef;Cd&&(ef=Ds(Cd,b,Go).variables);let S_=new pi({variablesFromEnvironment:ef??{},envName:Cd,testName:t.name}),Y=await ji.init({driver:Gt.driver,generator:$,logger:Go,limbarClient:Gt.limbarClient,playwrightDevice:Gt.playwrightDevice,orgId:u,adbPort:Gt.adbPort,options:{emulator:W},aiSettings:{...b.config.ai,useMemory:b.config.ai?.useMemory!==!1,...t.settings?.ai},fixtures:{storage:At,browserEnricher:se,browserGenerator:fe,localCodeEvalTools:Ce,testContext:S_}}),Js;try{Js=await ed({containerName:`mobile test ${t.name}`,fixtures:{controller:Y,logger:Go,cacheStorage:ge,usageTracker:g},work:{},inputs:{testName:t.name,steps:t.steps,orgId:u,testMetadata:t},tracer:Ho,callbacks:{driver:{onHeartbeatFailure:()=>{let Qt="Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure";w.warn(Qt)},onHeartbeatRestored:()=>{let Qt="Appium heartbeat connection restored";w.info(Qt)}}}})}finally{await Vo(),await Gt.cleanup(),await Y.cleanup()}return await Ho.finish({logger:Go,results:Js.results,status:Js.status,assetDetails:{avdId:lt,tag:_e?.tag,channel:_e?.channel}}),Js}import{debounce as lW}from"ts-debounce";var Xs="0.14.0";function cW(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 uW(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Yh=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.interactionTracer=new Do,fn.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${qa}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${qa}/${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:uW(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 ia(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},ia=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(`${qa}/${t}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new Yh(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(t),t}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:cW(e.status),finishedAt:e.finishedAt}))))}},Xh=class{constructor(e,t,n,o,i,a){this.keepalive=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.diskStorage.mkdir("assets"),this.logStream=this.diskStorage.createFileStream("assets/logs.logcat")}finished=!1;children=[];logStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}appendLogs(e){let t=e.join(`
|
|
4400
4401
|
`);this.logStream.write(t+`
|
|
4401
|
-
`)}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,status:n,results:o,beforeResults:i,afterResults:a}=e,s={...this.metadata,status:n,assetDetails:e.assetDetails,finishedAt:new Date,results:
|
|
4402
|
-
${lt.stack}`;w.error(Pt),_e.error({err:lt},`Encountered unexpected fatal error when running test ${Ce.name}`)}finally{clearInterval(Jt),
|
|
4403
|
-
`),w.info("This wizard will help you bootstrap a new Momentic project."),
|
|
4402
|
+
`)}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:ku(o,t),beforeResults:i?ku(i,t):void 0,afterResults:a?ku(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 ia(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new ia(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new ia(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${qa}/${t}.jpeg`)}},Jh=class{constructor(e,t,n,o,i,a){this.client=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let t={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,status:t.status,results:[],beforeResults:[],afterResults:[]}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(e){let{runAttemptId:t}=e;this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let n=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),o={id:t,schemaVersion:Mn,runAttemptSchemaVersion:kE,startedAt:new Date,status:"RUNNING"};n.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)});let i=lW(async()=>{await this.client.extendAndroidEmulatorTtl(e.emulatorName)},3e4,{maxWait:6e4}),a=new Xh(()=>void i(),this.testId,this.testName,t,o,n);return this.children.push(a),a}},vd=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:sr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Xs,labels:a??[]},c=new Hs(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:Xs,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined,quarantinedReason:e.quarantinedReason,executionType:"ANDROID"};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Jh(this.client,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function g_(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 yn(){try{await z(Promise.all([$E(),Tt.flush()]),{milliseconds:5e3})}catch{}}async function h_(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;pW(d)&&w.warn(`Output directory ${d} already exists, removing before test execution...`);let m=await g_(s,a,e.ignoreQuarantine),g=await br(i),h=await p_({tests:n.tests,yes:e.yes,project:i,momenticFiles:g,logger:w,quarantinedTestReasons:m}),f=ZE({items:h,shardIndex:e.shardIndex??1,shardCount:e.shardCount??1,sortKey:G=>G.relativeFilePath}),E=s.child({orgId:c,runGroupId:l,branch:u.gitBranchName}),b=await vd.start({logger:E,orgId:c,runGroupId:l,outputDir:d,client:a,gitMetadata:u,labels:[]}),C=[],R=new Date,v=new Set,M=async()=>mW({runResults:C,startTime:R,ranTests:v,apiClient:a,uploadResults:e.uploadResults??!1,outputDir:d}),A=[],I=async G=>{w.warn(`${G} Stopping tests and printing latest results.`),await b.finish({logger:E,status:"CANCELLED"}),await M(),await Promise.allSettled(A.map($=>$())),await yn(),process.exit(1)},k=async()=>{await I("SIGINT received.")};process.once("SIGINT",k);let W;if(e.timeoutMinutes!==void 0&&e.timeoutMinutes>0){let G=e.timeoutMinutes*60*1e3;W=setTimeout(()=>{I(`Timeout of ${e.timeoutMinutes} minute(s) reached.`)},G)}let ie={};for(let G=0;G<f.length;G++){let $=Object.values(ie);$.length===p&&await Promise.race($.map(Ce=>Ce.promise));let fe=f[G],se=`test-${G}`;ie[se]={done:!1,promise:(async({testDefinition:Ce})=>{v.add(se);let Me=Ce.relativeFilePath.includes("..")?Ce.fullFilePath:Ce.relativeFilePath;Ya({status:"START",testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length});let Jt=setInterval(()=>Ya({status:"RUN",testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length}),5*60*1e3),qt=dW(),_e=E.child({testId:Ce.id,runId:qt}),$e=new cu({logger:_e,reporter:new ld(a),runType:"mobile-test-run",runId:qt,testMetadata:Ce,suiteMetadata:void 0});try{let lt=await m_({metadata:{...o,runId:qt},fixtures:{...t,tracer:b,logger:_e,usageTracker:$e},inputs:{...n,project:i,testDefinition:Ce,channel:n.channel??Ce.settings?.defaultChannel,tag:n.tag??Ce.settings?.defaultTag,logUpdate:(Pt,Gt)=>Ya({status:Pt,testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length,additionalText:Gt}),runSigIntHandlers:A},options:e});Ya({status:lt.status,testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length}),C.push(lt)}catch(lt){let Pt=`Encountered unexpected fatal error when running test '${Ce.name}': ${lt.message}
|
|
4403
|
+
${lt.stack}`;w.error(Pt),_e.error({err:lt},`Encountered unexpected fatal error when running test ${Ce.name}`)}finally{clearInterval(Jt),ie[se].done=!0,delete ie[se]}await $e.flush(s)})({testDefinition:fe})}}await Promise.allSettled(Object.values(ie).map(G=>G.promise)),W&&clearTimeout(W);let At=C.some(G=>G.status==="FAILED"&&!G.quarantined)?"FAILED":"PASSED";return await b.finish({logger:E,status:At}),process.off("SIGINT",k),M()}async function mW({runResults:r,startTime:e,ranTests:t,apiClient:n,uploadResults:o,outputDir:i}){let a=n.getAppUrl(),s=qE({results:r,startTime:e.getTime(),onFailed:c=>{},getDisplayLine:c=>{let l=`${Qp}- ${c.filePath}`;return c.runId&&(l+=` ( link when uploaded: ${a}/runs/${c.runId} )`),l},entity:"mobile test"});return w.log(""),o?(w.success(`Test results have been saved to the folder ${i}. Uploading to Momentic Cloud...`),await pd({client:n,consoleLogger:w,resultsPath:i})):w.success(`Test results have been saved to the folder ${i}. Upload them to Momentic Cloud by running 'npx momentic-mobile results upload ${i}'.`),s}async function Qh(){pC(),JE("Chromium")||(bo?(await nc("The Chromium browser is not installed but is required for automating webviews. Install it now?")||process.exit(1),await ic({rawBrowsers:["chromium"],force:!1,all:!1})):(w.error("The Chromium browser is not installed but is required for automating webviews. Please install it using 'momentic-mobile install-browsers chromium'"),process.exit(1)))}aw({serviceName:"mobile-cli"});ur.setApp("mobile-cli");var to=new gW;to.name("momentic-mobile").description("Momentic Mobile CLI").version(Xs);var bW=to.command("assets").description("Manage mobile testing assets");bW.command("upload").description("Upload an asset for mobile tests").argument("<file>","Path to the asset file to upload").addOption(Ks).addOption(Ys).addOption(jh).addOption(r_).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i}=e,a=wd.resolve(r);Ad.existsSync(a)||(w.error(`File not found: ${a}`),process.exit(1));let s=new Or({baseUrl:n,apiKey:t,logger:w});/\.apk$/i.test(a)||(w.error(`File is not an APK file: ${a}`),process.exit(1)),await du({tag:o?.toLowerCase(),channel:i.toLowerCase(),filePath:a,apiClient:s,logger:w})});to.command("app").addOption(Ks).addOption(Ys).addOption(Hh).addOption(zh).addOption(qh).addOption(Gh).addOption(Vh).addOption(Wh).action(async r=>{let{apiKey:e,server:t,yes:n,disableCache:o,saveCache:i,regenerateCache:a}=r,s=em(r.logLevel);ur.setApp("mobile-desktop-server");let c=new Or({baseUrl:t,apiKey:e,logger:ur});await wh({client:c,skipPrompts:n}),w.debug("API key check complete");let l=yW(import.meta.url),u=wd.dirname(l),d=wd.resolve(u,"..","static");await Qh(),w.debug({appiumHome:As},"Resolved resource paths");let p=await ks({configFilePath:r.config}),m=e_;await ZM({momenticServerUrl:t,serverPort:m,apiKey:e,staticDir:d,initialProject:p,driverLogLevel:s,logger:ur,regenerateCache:a,noCache:o,alwaysSaveCache:i});let g=`http://localhost:${m}`;w.info(`Local app started on: ${g}`),await SW(g)});var f_=to.command("results").description("Merge and upload test results.");f_.command("merge").description("Merge test results files.").addOption($h).addArgument(new Zh("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired()).action(async(r,e)=>{let{outputDir:t}=e;t||(w.error("Output directory is required."),process.exit(1)),Ad.existsSync(r)||(w.warn("Results path does not exist, skipping merge."),process.exit(0)),Ad.existsSync(t)&&w.warn(`Output directory ${t} already exists, removing before merging...`),_M(ur,t,r),await yn(),process.exit(0)});var EW=new Zh("<results>","Path to the results archive.").argRequired();f_.command("upload").description("Upload test results to Momentic cloud.").addOption(Ks).addOption(Ys).addArgument(EW).action(async(r,e)=>{let{apiKey:t,server:n}=e,o=ur,i=new Or({baseUrl:n,apiKey:t,logger:o});await pd({consoleLogger:w,resultsPath:r,client:i}),await yn(),process.exit(0)});var TW=to.command("run").alias("test").description("Run tests on the local machine");TW.addOption(Ks).addOption(Ys).addOption(zh).addOption(Hh).addOption(a_).addOption(qh).addOption(l_).addOption(s_).addOption(Gh).addOption(Vh).addOption(Wh).addOption($h).addOption(c_).addOption(u_).addOption(d_).addOption(jh).addOption(t_).addOption(n_).addOption(o_).addOption(i_).addArgument(new Zh("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional()).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i,outputDir:a}=e,s=em(e.logLevel);await Qh(),w.debug({appiumHome:As},"Resolved resource paths"),QE({shardIndex:e.shardIndex,shardCount:e.shardCount});let c=await ks({configFilePath:e.config}),l=a??c.config.outputDir??hM,u=e.parallel??c.config.parallel??1;w.debug("Checking API key and dependencies");let d=new Or({baseUrl:n,apiKey:t,logger:w}),{orgId:p,userId:m}=await wh({client:d,skipPrompts:e.yes});w.debug("API key check and browser installation complete");let g=fW(),h=ur.child({runGroupId:g,orgId:p,userId:m}),f=await Ki(ur,d,c);h.debug(f,"Got local git metadata");try{let E=await h_({options:{...e,parallel:u,outputDir:l,alwaysSaveCache:e.saveCache,noCache:e.disableCache,logLevel:s,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount},fixtures:{logger:h,project:c,apiClient:d},inputs:{envOverride:e.env,tag:o,channel:i,tests:r},metadata:{gitMetadata:f,runGroupId:g,orgId:p}});await yn(),E.failed>0?process.exit(1):process.exit(0)}catch(E){w.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),w.error(E),ur.error({err:E},"Failed to run tests locally"),await yn(),process.exit(1)}});to.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new hW("--name <name>","Name of the project")).action(async r=>{w.info(`Welcome to the Momentic Mobile project setup wizard! \u{1F680}
|
|
4404
|
+
`),w.info("This wizard will help you bootstrap a new Momentic project."),Ad.existsSync(qi)&&(w.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let t={name:r.name??await HE("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:rd};dM(t,qi),w.success(`Initialized Momentic project file at ${wd.resolve(qi)}`)});to.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: ${tm.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(w.error("No browsers specified"),process.exit(1)),await ic({rawBrowsers:r,force:e.force,all:e.all})});async function vW(){try{await to.parseAsync(process.argv),await yn()}catch(r){ur.error({err:r},"Uncaught error in CLI"),w.error(r),await yn(),process.exit(1)}}vW();
|
|
4404
4405
|
//# sourceMappingURL=cli.js.map
|