momentic 2.23.0 → 2.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="11db9ef1-9fc2-5cd6-82ff-b2ee03dff57f")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e732574d-51d9-56eb-9632-29b1b7fa366b")}catch(e){}}();
4
4
  var qM=Object.defineProperty;var it=(r,e)=>()=>(r&&(e=r(r=0)),e);var KM=(r,e)=>{for(var t in e)qM(r,t,{get:e[t],enumerable:!0})};var DR,kR=it(()=>{"use strict";DR=typeof globalThis=="object"?globalThis:global});var UR=it(()=>{"use strict";kR()});var FR=it(()=>{"use strict";UR()});var qn,Ch=it(()=>{"use strict";qn="1.9.0"});function GB(r){var e=new Set([r]),t=new Set,n=r.match(BR);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(BR);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 BR,zR,HR=it(()=>{"use strict";Ch();BR=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;zR=GB(qn)});function La(r,e,t,n){var o;n===void 0&&(n=!1);var i=yl[Sl]=(o=yl[Sl])!==null&&o!==void 0?o:{version:qn};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!==qn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+qn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+qn+"."),!0}function Kn(r){var e,t,n=(e=yl[Sl])===null||e===void 0?void 0:e.version;if(!(!n||!zR(n)))return(t=yl[Sl])===null||t===void 0?void 0:t[r]}function Na(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+qn+".");var t=yl[Sl];t&&delete t[r]}var jB,Sl,yl,El=it(()=>{"use strict";FR();Ch();HR();jB=qn.split(".")[0],Sl=Symbol.for("opentelemetry.js.api."+jB),yl=DR});function Tl(r,e,t){var n=Kn("diag");if(n)return t.unshift(e),n[r].apply(n,$B([],VB(t),!1))}var VB,$B,GR,jR=it(()=>{"use strict";El();VB=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},$B=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))},GR=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 Tl("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Tl("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Tl("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Tl("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Tl("verbose",this._namespace,e)},r}()});var Je,rd=it(()=>{"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"})(Je||(Je={}))});function VR(r,e){r<Je.NONE?r=Je.NONE:r>Je.ALL&&(r=Je.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",Je.ERROR),warn:t("warn",Je.WARN),info:t("info",Je.INFO),debug:t("debug",Je.DEBUG),verbose:t("verbose",Je.VERBOSE)}}var $R=it(()=>{"use strict";rd()});var WB,qB,KB,wn,bl=it(()=>{"use strict";jR();$R();rd();El();WB=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},qB=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))},KB="diag",wn=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=Kn("diag");if(s)return s[o].apply(s,qB([],WB(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:Je.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=Kn("diag"),d=VR((s=i.logLevel)!==null&&s!==void 0?s:Je.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 La("diag",d,t,!0)};t.setLogger=n,t.disable=function(){Na(KB,t)},t.createComponentLogger=function(o){return new GR(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 WR,qR=it(()=>{"use strict";WR=Symbol("BaggageEntryMetadata")});function xh(r){return typeof r!="string"&&(YB.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:WR,toString:function(){return r}}}var YB,KR=it(()=>{"use strict";bl();qR();YB=wn.instance()});function _h(r){return Symbol.for(r)}var XB,Ih,Ph=it(()=>{"use strict";XB=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}(),Ih=new XB});function Lh(){return Oh}var _i,JB,nd,QB,ZB,ez,tz,Mh,rz,nz,oz,Oh,iz,az,sz,lz,cz,uz,dz,Nh=it(()=>{"use strict";_i=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)}}(),JB=function(){function r(){}return r.prototype.createGauge=function(e,t){return az},r.prototype.createHistogram=function(e,t){return sz},r.prototype.createCounter=function(e,t){return iz},r.prototype.createUpDownCounter=function(e,t){return lz},r.prototype.createObservableGauge=function(e,t){return uz},r.prototype.createObservableCounter=function(e,t){return cz},r.prototype.createObservableUpDownCounter=function(e,t){return dz},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),nd=function(){function r(){}return r}(),QB=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(nd),ZB=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(nd),ez=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(nd),tz=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(nd),Mh=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),rz=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Mh),nz=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Mh),oz=function(r){_i(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Mh),Oh=new JB,iz=new QB,az=new ez,sz=new tz,lz=new ZB,cz=new rz,uz=new nz,dz=new oz});var Er,YR=it(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Er||(Er={}))});var pz,mz,XR,JR=it(()=>{"use strict";Ph();pz=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},mz=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))},XR=function(){function r(){}return r.prototype.active=function(){return Ih},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,mz([n],pz(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var gz,hz,Dh,fz,QR,ZR=it(()=>{"use strict";JR();El();bl();gz=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},hz=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))},Dh="context",fz=new XR,QR=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return La(Dh,e,wn.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,hz([e,t,n],gz(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return Kn(Dh)||fz},r.prototype.disable=function(){this._getContextManager().disable(),Na(Dh,wn.instance())},r}()});var Da,ew=it(()=>{"use strict";ZR();Da=QR.getInstance()});var V,tw=it(()=>{"use strict";bl();V=wn.instance()});var Sz,rw,nw=it(()=>{"use strict";Nh();Sz=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return Oh},r}(),rw=new Sz});var kh,ow,iw=it(()=>{"use strict";nw();El();bl();kh="metrics",ow=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return La(kh,e,wn.instance())},r.prototype.getMeterProvider=function(){return Kn(kh)||rw},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){Na(kh,wn.instance())},r}()});var od,aw=it(()=>{"use strict";iw();od=ow.getInstance()});var je=it(()=>{"use strict";KR();Ph();rd();Nh();YR();ew();tw();aw()});var gs=(r,e)=>{},Jp=!1;try{let r=await import("@sentry/node");gs=r.captureException,r.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),Jp=!0}catch{}import{Command as Bq,Option as ar}from"@commander-js/extra-typings";import{execSync as zq}from"child_process";import{existsSync as h0,statSync as f0}from"fs";import{z as Qp}from"zod";var Qq=Qp.object({input:Qp.string(),agentConfigVersion:Qp.string().optional()});import{z as wt}from"zod";var t2=wt.object({srcs:wt.array(wt.string()),urls:wt.array(wt.string()),desiredSrc:wt.string().optional(),desiredUrl:wt.string().optional()}),ny=wt.object({srcRegex:wt.string().optional(),urlRegex:wt.string().optional()}),oy=wt.object({x:wt.number(),y:wt.number(),correlation:wt.number()}),r2=wt.object({searchImageBase64String:wt.string(),pageImageBase64String:wt.string(),id:wt.string().uuid(),timeoutMs:wt.number().max(1e4).min(0).optional()});import{z as L}from"zod";import*as D from"zod";import{extendZodWithOpenApi as YM}from"zod-openapi";YM(D);var no=(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))(no||{}),XM=D.object({mPathSelectorTokens:D.string().array(),frameSrcRegex:D.string().optional(),frameUrlRegex:D.string().optional(),indices:D.number().array()}),Zp=D.object({result:D.number(),traceId:D.string()}).array(),ic=D.object({type:D.literal("GCS_TRACES"),traces:Zp}),ro=(o=>(o.Precise="precise",o.Narrow="narrow",o.Unspecific="broad",o.Irrelevant="irrelevant",o))(ro||{}),iy=D.object({attributes:D.record(D.string(),D.string()).optional(),text:D.string().optional(),position:D.object({x1:D.number(),y1:D.number(),x2:D.number(),y2:D.number(),tolerance:D.nativeEnum(ro)}).optional(),shape:D.object({width:D.number(),height:D.number(),tolerance:D.nativeEnum(ro)}).optional(),boundingBox:D.object({x:D.number(),y:D.number(),width:D.number(),height:D.number()}).optional()}),JM=D.object({selectors:D.string().array(),requirements:iy.optional()}),oo=D.object({id:D.number().int(),dataMomenticId:D.number().int().optional(),selector:D.string().optional(),hybridSelector:D.object({textContent:D.string().nullish(),attributes:D.record(D.string(),D.string().optional()),tagName:D.string(),expandShadowRoot:D.boolean().optional(),classNames:D.string().array(),nthChild:D.number()}).array().optional(),generatedSelectors:D.string().array().optional(),requirements:iy.optional(),additionalElements:JM.array().optional(),role:D.string().optional(),name:D.string().optional(),numChildren:D.number().optional(),content:D.string().optional(),pathFromRoot:D.string().optional(),serializedHtml:D.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:D.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:D.string().url().optional(),boundingBox:D.object({x:D.number().optional(),y:D.number().optional(),width:D.number(),height:D.number()}).describe("css pixel bounding box").optional(),frameCache:XM.optional(),inputDescription:D.string().optional().describe("the description that generated this cache"),targetSource:D.nativeEnum(no).optional(),targetUpdateTime:D.string().optional(),targetUpdateLoggerTags:D.record(D.string(),D.string()).optional(),cacheResolutionUpdateSource:D.string().optional(),cacheResolutionUpdateTime:D.string().optional(),cacheResolutionUpdateLoggerTags:D.record(D.string(),D.string()).optional(),memory:ic.optional()}).openapi({ref:"ElementTargetCache"});function ac(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var QM=D.object({type:D.literal("description"),elementDescriptor:D.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),ZM=D.object({x:D.number(),y:D.number()}),eO=D.object({type:D.literal("coordinates"),pixels:ZM}).openapi({ref:"CoordinatesTarget"});function io(r){return r.type==="description"}function dn(r){return r.type==="coordinates"}var Bt=D.discriminatedUnion("type",[QM,eO]).openapi({ref:"ElementTarget"});function em(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function zt(r){if(!r)return"";switch(r.type){case"description":return r.elementDescriptor;case"coordinates":return`x: ${r.pixels.x}, y: ${r.pixels.y}`}}function sc(r){return ic.safeParse(r).success}import{v4 as Ie}from"uuid";import*as A from"zod";import{extendZodWithOpenApi as lO}from"zod-openapi";import{z as ce}from"zod";import{extendZodWithOpenApi as tO}from"zod-openapi";import{z as fs}from"zod";import ay from"zod";var hs=ay.object({updatedAt:ay.coerce.date().optional()});var tm=fs.object({result:fs.boolean(),traceId:fs.string()}).array(),rm=fs.object({type:fs.literal("GCS_TRACES"),traces:tm}),nm=hs.extend({memory:rm.optional()});tO(ce);var sy=ce.object({plan:ce.string().optional(),evidence:ce.string().optional(),thoughts:ce.string(),result:ce.boolean(),relevantElements:ce.array(ce.number()).optional(),updatedMemory:tm.optional()}),Un=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Un||{});var rO=ce.object({type:ce.literal("ELEMENT_NAME"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Un),value:ce.string()}).openapi({ref:"ElementNameAssertion"}),nO=ce.object({type:ce.literal("ELEMENT_STYLE"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Un),property:ce.string(),value:ce.string()}).openapi({ref:"ElementStyleAssertion"}),oO=ce.object({type:ce.literal("ELEMENT_CONTENT"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Un),value:ce.string()}).openapi({ref:"ElementContentAssertion"}),iO=ce.object({type:ce.literal("ELEMENT_ATTRIBUTE"),negated:ce.boolean().optional(),operation:ce.nativeEnum(Un),attr:ce.string(),value:ce.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Yo=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Yo||{}),aO=ce.object({type:ce.literal("ELEMENT_EXISTENCE"),negated:ce.boolean().optional(),condition:ce.nativeEnum(Yo).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),ly=ce.discriminatedUnion("type",[oO,iO,aO,rO,nO]).openapi({ref:"ManualElementAssertion"});var sO=ce.object({type:ce.literal("CONTENT"),negated:ce.boolean().optional(),value:ce.string()}).openapi({ref:"PageContentAssertion"}),cy=ce.discriminatedUnion("type",[sO]).openapi({ref:"ManualPageAssertion"});import Jt from"zod";var om=Jt.discriminatedUnion("type",[Jt.object({type:Jt.literal("SUBSTRING"),url:Jt.string()}),Jt.object({type:Jt.literal("GLOB"),glob:Jt.string()}),Jt.object({type:Jt.literal("REGEX"),regex:Jt.string()}),Jt.object({type:Jt.literal("DOMAIN"),domain:Jt.string()})]),Ss=Jt.object({urlMatcher:om,method:Jt.string().optional()});import{z as _e}from"zod";var $i=_e.object({url:_e.string(),method:_e.union([_e.literal("GET"),_e.literal("POST"),_e.literal("PUT"),_e.literal("DELETE"),_e.literal("PATCH")]),headers:_e.record(_e.string(),_e.string()).optional(),params:_e.record(_e.string(),_e.string()).optional(),body:_e.string().optional(),timeout:_e.number().int().optional().describe("Max seconds to wait for the request to complete")}),uy=_e.object({url:_e.string(),headers:_e.record(_e.string(),_e.string()).optional(),query:_e.string(),variables:_e.string().optional(),timeout:_e.number().int().optional().describe("Max seconds to wait for the request to complete")}),lc=_e.object({code:_e.string(),fragment:_e.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:_e.union([_e.literal("NODE"),_e.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:_e.number().int().max(60).optional().describe("Max seconds for the code to complete")});var $e=(K=>(K.AI_EXTRACT="AI_EXTRACT",K.AI_ASSERTION="AI_ASSERTION",K.AUTH_LOAD="AUTH_LOAD",K.AUTH_SAVE="AUTH_SAVE",K.BLUR="BLUR",K.CAPTCHA="CAPTCHA",K.CLICK="CLICK",K.COOKIE="COOKIE",K.COPY="COPY",K.DIALOG="DIALOG",K.DRAG="DRAG",K.ELEMENT_CHECK="ELEMENT_CHECK",K.FILE_UPLOAD="FILE_UPLOAD",K.FOCUS="FOCUS",K.GO_BACK="GO_BACK",K.GO_FORWARD="GO_FORWARD",K.HOVER="HOVER",K.JAVASCRIPT="JAVASCRIPT",K.LOCAL_STORAGE="LOCAL_STORAGE",K.MOUSE_DRAG="MOUSE_DRAG",K.NAVIGATE="NAVIGATE",K.NEW_TAB="NEW_TAB",K.PAGE_CHECK="PAGE_CHECK",K.PASTE="PASTE",K.PRESS="PRESS",K.KEY_DOWN="KEY_DOWN",K.KEY_UP="KEY_UP",K.REFRESH="REFRESH",K.REQUEST="REQUEST",K.GRAPHQL_REQUEST="GRAPHQL_REQUEST",K.SCROLL_DOWN="SCROLL_DOWN",K.SCROLL_UP="SCROLL_UP",K.SCROLL_LEFT="SCROLL_LEFT",K.SCROLL_RIGHT="SCROLL_RIGHT",K.SELECT_OPTION="SELECT_OPTION",K.SWITCH_TAB="TAB",K.TYPE="TYPE",K.VISUAL_DIFF="VISUAL_DIFF",K.WAIT="WAIT",K.WAIT_FOR_URL="WAIT_FOR_URL",K.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",K.AWAIT_LISTENER="AWAIT_LISTENER",K.RECORD_REQUESTS="RECORD_REQUESTS",K.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",K.SET_HEADER="SET_HEADER",K.MOCK_ROUTE="MOCK_ROUTE",K.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",K.OFFLINE_MODE="OFFLINE_MODE",K.SUCCESS="SUCCESS",K))($e||{});lO(A);var Z=A.object({thoughts:A.string().optional(),id:A.string().uuid().describe("unique identifier to this step, used for step cache")}),Ar=A.object({useSelector:A.boolean().optional(),force:A.boolean().optional(),disableCache:A.boolean().optional().describe("disable element caching for this step"),iframeUrl:A.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),mr=hs.extend({target:oo}).optional().openapi({ref:"SingleTargetCache"});function dy(r){return mr.safeParse(r).success}var uc=A.object({loadTimeout:A.number().int().max(60).optional().describe("Max seconds for the page to load")}),cO=Z.merge(uc).merge(A.object({type:A.literal("NAVIGATE"),url:A.string()})).openapi({ref:"NavigateCommand"}),dc=Ar.merge(A.object({cache:mr})),Wi=Z.merge(dc.merge(A.object({target:Bt.optional(),type:A.literal("SCROLL_UP"),deltaY:A.number().optional()}))).openapi({ref:"ScrollUpCommand"}),qi=Z.merge(dc.merge(A.object({target:Bt.optional(),type:A.literal("SCROLL_DOWN"),deltaY:A.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ki=Z.merge(dc.merge(A.object({target:Bt.optional(),type:A.literal("SCROLL_LEFT"),deltaX:A.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Yi=Z.merge(dc.merge(A.object({target:Bt.optional(),type:A.literal("SCROLL_RIGHT"),deltaX:A.number().optional()}))).openapi({ref:"ScrollRightCommand"}),O2=A.discriminatedUnion("type",[Wi,qi,Ki,Yi]).openapi({ref:"AllScrollCommands"}),uO=Z.merge(A.object({type:A.literal("DIALOG"),action:A.union([A.literal("ACCEPT"),A.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),dO=Z.merge(A.object({type:A.literal("WAIT"),delay:A.number()})).openapi({ref:"WaitCommand"}),pO=A.object({caseInsensitive:A.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:A.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:A.number().int().optional().describe("Max seconds to wait for the URL to match")}),py=Z.extend({type:A.literal("WAIT_FOR_URL"),matcher:om}).merge(pO).openapi({ref:"WaitUrlCommand"}),my=Z.merge(uc).merge(A.object({type:A.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),mO=Z.merge(A.object({type:A.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),gy=Z.merge(A.object({type:A.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),gO=Z.extend({type:A.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),hO=Z.extend({type:A.literal("AUTH_LOAD"),storageState:A.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),im=Z.merge(Ar).extend({type:A.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),hy=Z.extend({type:A.literal("COPY"),value:A.string()}).openapi({ref:"CopyCommand"}),fy=Z.extend({type:A.literal("PASTE")}).openapi({ref:"PasteCommand"}),Sy=Z.merge(lc).extend({type:A.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Es=Z.merge(Ar).extend({type:A.literal("CLICK"),target:Bt,doubleClick:A.boolean().optional(),rightClick:A.boolean().optional(),waitForDownload:A.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:A.number().optional(),downloadTimeoutMs:A.number().optional(),cache:mr,relativePosition:A.object({x:A.number(),y:A.number()}).optional()}).openapi({ref:"ClickCommand"}),am=hs.extend({fromTarget:oo.optional(),toTarget:oo.optional()}),Xi=Z.merge(Ar).merge(A.object({type:A.literal("DRAG"),fromTarget:Bt,toTarget:Bt,steps:A.number().optional(),hoverSeconds:A.number().optional().describe("Seconds to hover the object before dropping"),cache:am.optional()})).openapi({ref:"DragCommand"}),Ji=Z.merge(Ar).merge(A.object({type:A.literal("MOUSE_DRAG"),target:Bt.optional(),deltaX:A.string().describe("pixels to move horizontally, can be template"),deltaY:A.string().describe("pixels to move vertically, can be template"),steps:A.number().optional(),cache:mr})).openapi({ref:"MouseDragCommand"}),Ts=Z.merge(Ar).merge(A.object({type:A.literal("HOVER"),target:Bt,cache:mr})).openapi({ref:"HoverCommand"}),bs=Z.merge(Ar).merge(A.object({type:A.literal("FOCUS"),target:Bt,cache:mr})).openapi({ref:"FocusCommand"}),vs=Z.merge(Ar).extend({type:A.literal("BLUR"),target:Bt.optional(),cache:mr}).openapi({ref:"BlurCommand"}),fO=A.object({type:A.literal("URL"),url:A.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),SO=A.object({type:A.literal("USER_FILE"),name:A.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),yO=Z.extend({type:A.literal("FILE_UPLOAD"),fileSource:A.discriminatedUnion("type",[fO,SO]),filename:A.string().optional()}).openapi({ref:"FileUploadCommand"}),sm=A.discriminatedUnion("type",[A.object({type:A.literal("VALUE"),value:A.string()}),A.object({type:A.literal("LABEL"),label:A.string()}),A.object({type:A.literal("INDEX"),index:A.coerce.string()})]),As=Z.merge(Ar).extend({type:A.literal("SELECT_OPTION"),target:Bt,cache:mr,choice:sm.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),lm=A.union([A.literal("MULTIMODAL"),A.literal("VISION_ONLY")]),pc=Z.merge(A.object({type:A.literal("AI_ASSERTION"),assertion:A.string(),disableCache:A.boolean().optional(),iframeUrl:A.string().optional(),contextChoice:lm.optional(),timeout:A.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:nm.optional()})).openapi({ref:"AIAssertionCommand"}),pn=5,cm=600,Qi=Z.merge(Ar).extend({type:A.literal("ELEMENT_CHECK"),target:Bt,assertion:ly,cache:mr.or(nm).optional(),timeout:A.number().int().min(0).max(cm).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),yy=Z.extend({type:A.literal("PAGE_CHECK"),assertion:cy,iframeUrl:A.string().optional().describe("url or url regex for the iframe"),timeout:A.number().int().min(0).max(cm).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Ey=Z.merge(A.object({type:A.literal("AI_EXTRACT"),goal:A.string(),schema:A.string().optional(),envKey:A.string().optional(),disableCache:A.boolean().optional(),iframeUrl:A.string().optional()})).openapi({ref:"AIExtractCommand"}),EO=A.object({clearContent:A.boolean().optional(),forceClearContent:A.boolean().optional(),delay:A.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:A.boolean().optional(),pressEnter:A.boolean().optional(),relativePosition:A.object({x:A.number(),y:A.number()}).optional()}),Ty=25,Rs=Z.merge(Ar).merge(EO).extend({type:A.literal("TYPE"),target:Bt.optional(),value:A.string(),cache:mr}).openapi({ref:"TypeCommand"}),TO=Z.merge(A.object({type:A.literal("PRESS"),value:A.string(),repeat:A.number().optional(),convertMeta:A.boolean().optional(),delayMs:A.number().optional()})).openapi({ref:"PressCommand"}),bO=Z.merge(A.object({type:A.literal("KEY_DOWN"),value:A.string(),convertMeta:A.boolean().optional()})).openapi({ref:"KeyDownCommand"}),vO=Z.merge(A.object({type:A.literal("KEY_UP"),value:A.string(),convertMeta:A.boolean().optional()})).openapi({ref:"KeyUpCommand"}),AO=A.object({type:A.literal("SUBSTRING"),substring:A.string()}),RO=A.object({type:A.literal("REGEX"),pattern:A.string()}),wO=A.object({type:A.literal("INDEX"),index:A.coerce.string()}),CO=A.discriminatedUnion("type",[AO,RO,wO]),xO=Z.merge(uc).merge(A.object({type:A.literal("TAB"),action:CO})).openapi({ref:"TabCommand"}),by=Z.merge(uc).merge(A.object({type:A.literal("NEW_TAB"),url:A.string()})).openapi({ref:"NewTabCommand"}),_O=Z.merge(A.object({type:A.literal("COOKIE"),value:A.string()})).openapi({ref:"CookieCommand"}),vy=Z.merge(A.object({type:A.literal("LOCAL_STORAGE"),key:A.string(),value:A.string()})).openapi({ref:"LocalStorageCommand"}),Ay=Z.extend({type:A.literal("REQUEST")}).merge($i).openapi({ref:"RequestCommand"}),IO=Z.extend({type:A.literal("GRAPHQL_REQUEST")}).merge(uy).openapi({ref:"GraphQLRequestCommand"}),PO=Z.merge(A.object({type:A.literal("SUCCESS"),condition:pc.optional()})).openapi({ref:"SuccessCommand"}),Ry=Z.merge(A.object({type:A.literal("FAILURE")})).openapi({ref:"FailureCommand"}),MO=A.object({data:A.string().describe("location at which to find a jpg"),width:A.number(),height:A.number()}),ws=Z.merge(Ar).merge(A.object({type:A.literal("VISUAL_DIFF"),threshold:A.number().optional().describe("default 0.1"),target:Bt.optional(),screenshot:MO.optional(),cache:mr})).openapi({ref:"VisualDiffCommand"}),OO=Z.merge(A.object({type:A.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:Ss,key:A.string()})).openapi({ref:"RegisterRequestListenerCommand"}),LO=Z.merge(A.object({type:A.literal("AWAIT_LISTENER"),key:A.string(),timeout:A.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),NO=Z.merge(A.object({type:A.literal("RECORD_REQUESTS"),requestMatcher:Ss,key:A.string()})).openapi({ref:"RecordRequestsCommand"}),DO=Z.merge(A.object({type:A.literal("GET_RECORDED_REQUESTS"),key:A.string()})).openapi({ref:"GetRecordedRequestsCommand"}),kO=Z.merge(A.object({type:A.literal("SET_HEADER"),name:A.string(),value:A.string(),requestMatcher:Ss.optional()})).openapi({ref:"SetHeaderCommand"}),UO=Z.merge(A.object({type:A.literal("MOCK_ROUTE"),requestMatcher:Ss,responseGenerator:A.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:A.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:A.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"})),FO=Z.merge(A.object({type:A.literal("REMOVE_ROUTE_MOCK"),key:A.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),BO=Z.merge(A.object({type:A.literal("OFFLINE_MODE"),enable:A.boolean()})).openapi({ref:"OfflineModeCommand"}),zO=A.discriminatedUnion("type",[Es,Rs,TO,bO,vO,As,cO,qi,Wi,pc,mO,Ts,dO]),um=A.discriminatedUnion("type",[...zO.options,PO]),dm=A.discriminatedUnion("type",[...um.options,Xi,Sy,Qi,yy,by,py,Ey,hy,gy,vy,Ji,fy,my,Ay]),HO=A.discriminatedUnion("type",[Ey,hO,gO,im,_O,hy,uO,Xi,Qi,yO,gy,Sy,vy,Ji,by,yy,fy,my,Ay,IO,Ki,Yi,xO,ws,bs,vs,py,OO,LO,NO,DO,kO,UO,FO,BO]),Zi=A.discriminatedUnion("type",[...um.options,...HO.options]).openapi({ref:"Command"}),mc=A.discriminatedUnion("type",[...um.options,Ry]),L2=A.discriminatedUnion("type",[...dm.options,Ry]);function Fn(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:Ie(),type:r};break;case"AUTH_LOAD":{e={id:Ie(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:Ie(),type:r,goal:""};break;case"DIALOG":e={id:Ie(),type:r,action:"DISMISS"};break;case"DRAG":e={id:Ie(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Ie(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Ie(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Ie(),type:r,delay:1};break;case"BLUR":e={id:Ie(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Ie(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Ie(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Ie(),type:r,value:""};break;case"SELECT_OPTION":e={id:Ie(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Ie(),type:r,url:""};case"TAB":e={id:Ie(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Ie(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Ie(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Ie(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:Ie(),type:r,code:""};break;case"AI_ASSERTION":e={id:Ie(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:Ie(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Ie(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Ie(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Ie(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Ie(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:Ie(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Ie(),type:r,key:""};break}case"SET_HEADER":{e={id:Ie(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Ie(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Ie(),type:r};break}case"OFFLINE_MODE":{e={id:Ie(),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 wy(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 GO}from"zod";var F2=GO.discriminatedUnion("type",[vs,im,Es,Xi,bs,Ts,Ji,Wi,qi,Ki,Yi,As,Rs,ws,Qi]);function Cy(r){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(r)}import{z as jO}from"zod";import{z as ao}from"zod";function Cs(r){return ao.object({key:ao.string(),testId:ao.string().optional(),moduleId:ao.string().optional(),organizationId:ao.string(),value:r})}function xs(r){return Cs(r).extend({uniqueKey:ao.string()})}function gc(r){return ao.record(ao.string(),xs(r))}var Qt={type:!0,cache:!0},Bn=jO.discriminatedUnion("type",[pc.pick(Qt),vs.pick(Qt),Es.pick(Qt),Xi.pick(Qt),Qi.pick(Qt),bs.pick(Qt),Ts.pick(Qt),Ji.pick(Qt),Wi.pick(Qt),qi.pick(Qt),Ki.pick(Qt),Yi.pick(Qt),As.pick(Qt),Rs.pick(Qt),ws.pick(Qt)]),hc=Object.values($e).filter(r=>Bn.options.some(e=>e.shape.type.safeParse(r).success));Zi.options.forEach(r=>{if("target"in r.shape&&!hc.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function fc(r){return hc.includes(r.type)}var xy=Cs(Bn),_y=xs(Bn),W2=gc(Bn);import{v4 as We}from"uuid";import{z as w}from"zod";var Py=Symbol("Let zodToJsonSchema decide on which parser to use");var Iy={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"},My=r=>typeof r=="string"?{...Iy,name:r}:{...Iy,...r};var Oy=r=>{let e=My(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 pm(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function Te(r,e,t,n,o){r[e]=t,pm(r,e,n,o)}var Sc=(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 ye}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"?Sc(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as VO}from"zod";function Ly(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==VO.ZodAny&&(t.items=ee(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&Te(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&Te(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(Te(t,"minItems",r.exactLength.value,r.exactLength.message,e),Te(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function Ny(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?Te(t,"minimum",n.value,n.message,e):Te(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),Te(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?Te(t,"maximum",n.value,n.message,e):Te(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),Te(t,"maximum",n.value,n.message,e));break;case"multipleOf":Te(t,"multipleOf",n.value,n.message,e);break}return t}function Dy(){return{type:"boolean"}}function yc(r,e){return ee(r.type._def,e)}var ky=(r,e)=>ee(r.innerType._def,e);function mm(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>mm(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 $O(r,e)}}var $O=(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":Te(t,"minimum",n.value,n.message,e);break;case"max":Te(t,"maximum",n.value,n.message,e);break}return t};function Uy(r,e){return{...ee(r.innerType._def,e),default:r.defaultValue()}}function Fy(r,e){return e.effectStrategy==="input"?ee(r.schema._def,e):Ze(e)}function By(r){return{type:"string",enum:Array.from(r.values)}}var WO=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function zy(r,e){let t=[ee(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),ee(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(WO(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 Hy(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 _s}from"zod";var gm,Xr={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:()=>(gm===void 0&&(gm=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),gm),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 Ec(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":Te(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":Te(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":Jr(t,"email",n.message,e);break;case"format:idn-email":Jr(t,"idn-email",n.message,e);break;case"pattern:zod":Zt(t,Xr.email,n.message,e);break}break;case"url":Jr(t,"uri",n.message,e);break;case"uuid":Jr(t,"uuid",n.message,e);break;case"regex":Zt(t,n.regex,n.message,e);break;case"cuid":Zt(t,Xr.cuid,n.message,e);break;case"cuid2":Zt(t,Xr.cuid2,n.message,e);break;case"startsWith":Zt(t,RegExp(`^${hm(n.value,e)}`),n.message,e);break;case"endsWith":Zt(t,RegExp(`${hm(n.value,e)}$`),n.message,e);break;case"datetime":Jr(t,"date-time",n.message,e);break;case"date":Jr(t,"date",n.message,e);break;case"time":Jr(t,"time",n.message,e);break;case"duration":Jr(t,"duration",n.message,e);break;case"length":Te(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),Te(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Zt(t,RegExp(hm(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Jr(t,"ipv4",n.message,e),n.version!=="v4"&&Jr(t,"ipv6",n.message,e);break}case"base64url":Zt(t,Xr.base64url,n.message,e);break;case"jwt":Zt(t,Xr.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Zt(t,Xr.ipv4Cidr,n.message,e),n.version!=="v4"&&Zt(t,Xr.ipv6Cidr,n.message,e);break}case"emoji":Zt(t,Xr.emoji(),n.message,e);break;case"ulid":{Zt(t,Xr.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Jr(t,"binary",n.message,e);break}case"contentEncoding:base64":{Te(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Zt(t,Xr.base64,n.message,e);break}}break}case"nanoid":Zt(t,Xr.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function hm(r,e){return e.patternStrategy==="escape"?KO(r):r}var qO=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function KO(r){let e="";for(let t=0;t<r.length;t++)qO.has(r[t])||(e+="\\"),e+=r[t];return e}function Jr(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}}})):Te(r,"format",e,t,n)}function Zt(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:Gy(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):Te(r,"pattern",Gy(e,n),t,n)}function Gy(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
5
5
  ]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
6
6
  ]))`;continue}}if(t.s&&n[c]==="."){o+=a?`${n[c]}\r
@@ -24,8 +24,8 @@ ${this.decisions.map(e=>e.toString()).join(`
24
24
  `);process.stderr.write(`${o}
25
25
  `),globalThis.console=e}}var ft=" ".repeat(6);function Sv(r,e="",t=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=r.split(`
26
26
  `),a=[];for(let s of i)if(t){let c=s;for(;c.length>o;){let u=c.slice(0,o+1).lastIndexOf(" "),d=u>-1?u:o;a.push(e+c.slice(0,d)),c=c.slice(d).trimStart()}a.push(e+c)}else{let c=s.split(" "),l="";for(let u of c){if(!l.length){l=u;continue}let d=`${l} ${u}`;d.length<=o?l=d:(a.push(e+l),l=u)}a.push(e+l)}return a.join(`
27
- `)}import R0 from"fetch-retry";import w0 from"os";import yv,{multistream as C0}from"pino";import x0 from"pino-pretty";import _0 from"pino-std-serializers";var ha=new Map,I0=!0,Ev="Log throttle exceeded",P0=100,M0=5e3,O0=R0(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}}),kg=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??w0.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=I0?yv(a):yv(a,C0([{stream:x0({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 O0(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:pi(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===Ev)return!0;let t=Date.now();return t-this.lastWindowStart>M0&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,Ev),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<P0?(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(Xs[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=_0.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:sb({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,ha.set("app",this),ha.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=lb[e]):(this.minLevelValue=Xs[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},fa=({app:r,hostname:e,disableConsoleLogs:t})=>(ha.has(r)||ha.set(r,new kg({bindings:{app:r},hostname:e,disableConsoleLogs:t})),ha.get(r));async function bv(){await Promise.all([...ha.values()].map(r=>r.flush()))}import{hostname as L0}from"os";var q=fa({app:"cli",hostname:L0(),disableConsoleLogs:!0}).child({cliVersion:"2.23.0"});var D0=5;async function uu({getResults:r,checkDone:e,name:t,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>D0&&(E.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),i=0}catch(l){i++,q.warn({err:l},"Failed to fetch run status, retrying..."),E.warn({err:l},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(e(a))return a;let c=Math.max(1e4,Math.floor(n/100));await new Promise(l=>setTimeout(l,c))}E.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Sa({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 fv(()=>{if(c.forEach(u=>{E.log(""),o(u)}),c.length){E.log("");let u=c.length===1?"":"s";E.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{E.dimmed(n(d))})}if(l.length){E.log("");let u=l.length===1?"":"s";E.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{E.dimmed(n(d))})}if(a.length){E.log("");let u=a.length===1?"":"s";E.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{E.dimmed(n(d))})}if(s.length){E.log("");let u=s.length===1?"":"s";E.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{E.dimmed(n(d))})}if(i.length){E.log("");let u=i.length===1?"":"s";E.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{E.dimmed(n(d))})}E.log(""),E.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 du=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=bc[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||ea[r.failureReason],o=r.failureDetails.classification?.rootCause;if(E.error(e),o){E.log(`${ft}- Error type: ${En.dim(t)}`);let i="- Root cause analysis:",a=Sv(`${i} ${o}`,`${ft} `,!1),s=a.indexOf(":");E.log(`${ft}${i} ${En.dim(a.slice(s+1))}`)}else E.log(`${ft}Reason: ${En.red(t)}`),E.log(`${ft}Description: ${En.red(n)}`)},el=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=En.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=En.bgGreen.white("PASS"),a=3):r.includes("START")?(i=En.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=En.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=En.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=En.bgMagenta.white("RUNNING"),a=0):(E.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),N0||(i=`${i}`),E.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import k0 from"fs";import{tmpdir as U0}from"os";import F0 from"path";import{registry as tl}from"playwright-core/lib/server";import vv from"proper-lockfile";var Av=F0.join(U0(),"momenticBrowserInstallation");var Ug=["chrome","chromium","chrome-for-testing","ffmpeg"],B0={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},Rv={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function wv(r){let e=Rv[B0[r]??""]??"",t=tl.findExecutable(e);return!t||t.installType==="none"?!1:Fg(t)}function Fg(r){let e=r.executablePath();return k0.existsSync(e)}function z0(r,e){let t=Rv[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=tl.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Fg(n)))return n}async function H0({browser:r,force:e}){let t=z0(r,e);if(!t){E.info(`Browser '${r}' is already installed, skipping...`);return}E.info(`Installing browser '${r}'...`);try{await tl.installDeps([t],!1),await tl.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){E.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=tl.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Fg(o);)E.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function Cv({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Ug:Array.from(new Set(r));try{await vv.lock(Av,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){E.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 H0({browser:i,force:e})}catch(a){o=a,E.error(`Failed to install the ${i} browser: ${a}`)}}finally{await vv.unlock(Av,{realpath:!1})}if(o)throw o}import G0 from"blocked-at";import j0 from"why-is-node-running";function xv(r){V0(r),$0()}function V0(r){G0((e,t)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=t.join(`
28
- `);console.warn(n),r.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function $0(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let r=process._getActiveHandles();console.log("Active handles:",r.map(e=>e.constructor?.name))}j0(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}import{randomUUID as Hq}from"crypto";import IP from"body-parser";import xW from"cors";import _W from"dedent";import{Router as FU}from"express";import nr from"fs";import{globSync as BU}from"glob";import It from"path";import Uu from"fs";import{z as Z0}from"zod";var B="v1",Bg="cli",hi="2.23.0";var Eo=3.1783027;function W0(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 St(r){return Math.ceil(zg(r)/Eo)}function zg(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
27
+ `)}import R0 from"fetch-retry";import w0 from"os";import yv,{multistream as C0}from"pino";import x0 from"pino-pretty";import _0 from"pino-std-serializers";var ha=new Map,I0=!0,Ev="Log throttle exceeded",P0=100,M0=5e3,O0=R0(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}}),kg=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??w0.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=I0?yv(a):yv(a,C0([{stream:x0({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 O0(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:pi(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===Ev)return!0;let t=Date.now();return t-this.lastWindowStart>M0&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,Ev),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<P0?(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(Xs[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=_0.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:sb({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,ha.set("app",this),ha.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=lb[e]):(this.minLevelValue=Xs[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},fa=({app:r,hostname:e,disableConsoleLogs:t})=>(ha.has(r)||ha.set(r,new kg({bindings:{app:r},hostname:e,disableConsoleLogs:t})),ha.get(r));async function bv(){await Promise.all([...ha.values()].map(r=>r.flush()))}import{hostname as L0}from"os";var q=fa({app:"cli",hostname:L0(),disableConsoleLogs:!0}).child({cliVersion:"2.23.1"});var D0=5;async function uu({getResults:r,checkDone:e,name:t,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>D0&&(E.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),i=0}catch(l){i++,q.warn({err:l},"Failed to fetch run status, retrying..."),E.warn({err:l},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(e(a))return a;let c=Math.max(1e4,Math.floor(n/100));await new Promise(l=>setTimeout(l,c))}E.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function Sa({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 fv(()=>{if(c.forEach(u=>{E.log(""),o(u)}),c.length){E.log("");let u=c.length===1?"":"s";E.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{E.dimmed(n(d))})}if(l.length){E.log("");let u=l.length===1?"":"s";E.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{E.dimmed(n(d))})}if(a.length){E.log("");let u=a.length===1?"":"s";E.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{E.dimmed(n(d))})}if(s.length){E.log("");let u=s.length===1?"":"s";E.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{E.dimmed(n(d))})}if(i.length){E.log("");let u=i.length===1?"":"s";E.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{E.dimmed(n(d))})}E.log(""),E.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 du=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=bc[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||ea[r.failureReason],o=r.failureDetails.classification?.rootCause;if(E.error(e),o){E.log(`${ft}- Error type: ${En.dim(t)}`);let i="- Root cause analysis:",a=Sv(`${i} ${o}`,`${ft} `,!1),s=a.indexOf(":");E.log(`${ft}${i} ${En.dim(a.slice(s+1))}`)}else E.log(`${ft}Reason: ${En.red(t)}`),E.log(`${ft}Description: ${En.red(n)}`)},el=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=En.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=En.bgGreen.white("PASS"),a=3):r.includes("START")?(i=En.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=En.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=En.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=En.bgMagenta.white("RUNNING"),a=0):(E.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),N0||(i=`${i}`),E.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import k0 from"fs";import{tmpdir as U0}from"os";import F0 from"path";import{registry as tl}from"playwright-core/lib/server";import vv from"proper-lockfile";var Av=F0.join(U0(),"momenticBrowserInstallation");var Ug=["chrome","chromium","chrome-for-testing","ffmpeg"],B0={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},Rv={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function wv(r){let e=Rv[B0[r]??""]??"",t=tl.findExecutable(e);return!t||t.installType==="none"?!1:Fg(t)}function Fg(r){let e=r.executablePath();return k0.existsSync(e)}function z0(r,e){let t=Rv[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=tl.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Fg(n)))return n}async function H0({browser:r,force:e}){let t=z0(r,e);if(!t){E.info(`Browser '${r}' is already installed, skipping...`);return}E.info(`Installing browser '${r}'...`);try{await tl.installDeps([t],!1),await tl.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){E.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=tl.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Fg(o);)E.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function Cv({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Ug:Array.from(new Set(r));try{await vv.lock(Av,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){E.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 H0({browser:i,force:e})}catch(a){o=a,E.error(`Failed to install the ${i} browser: ${a}`)}}finally{await vv.unlock(Av,{realpath:!1})}if(o)throw o}import G0 from"blocked-at";import j0 from"why-is-node-running";function xv(r){V0(r),$0()}function V0(r){G0((e,t)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=t.join(`
28
+ `);console.warn(n),r.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function $0(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let r=process._getActiveHandles();console.log("Active handles:",r.map(e=>e.constructor?.name))}j0(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}import{randomUUID as Hq}from"crypto";import IP from"body-parser";import xW from"cors";import _W from"dedent";import{Router as FU}from"express";import nr from"fs";import{globSync as BU}from"glob";import It from"path";import Uu from"fs";import{z as Z0}from"zod";var B="v1",Bg="cli",hi="2.23.1";var Eo=3.1783027;function W0(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 St(r){return Math.ceil(zg(r)/Eo)}function zg(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
29
29
  `,""),t=t.replaceAll(" ","");let n=W0(t);return t.length-n+Eo*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+=zg(t)}),e;if(typeof r=="object"){let t=r;return Object.keys(t).forEach(n=>{e+=String(n).length,n==="image_url"?(t[n]??{}).detail==="high"?e+=1105*Eo:e+=85*Eo:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*Eo:e+=zg(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 To=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var _v=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 H(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(_v(p));l=()=>c(_v(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 To(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)})})}var pu=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};var q0=9e4,K0=3,Y0=1500,X0=15e3,en=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function J0(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Hg=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return hi&&(e[iu]=hi),Bg&&(e[gb]=Bg),e}async sendRequest(e,t){let{retries:n=K0,requestTimeoutMs:o=q0,initialRetryDelayMs:i=Y0,maxRetryDelayMs:a=X0,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 en&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new To),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 J0(u);throw new en(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)}}},Dt=class extends Hg{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[mb]:this.mode??""}}};import{createAnthropic as Q0}from"@ai-sdk/anthropic";var rl=({baseUrl:r,apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o})=>i=>{let a={Authorization:`Bearer ${e}`,[iu]:hi??"",...t&&{[fb]:t},...n||{}};return o&&(a[hb]=JSON.stringify(o)),Q0({baseURL:`${r}/v1/llm/anthropic/${i}`,headers:a,apiKey:e})(i)};var jn=class extends Dt{agentConfig;constructor(e,t){let n={...Vc,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${B}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return XE.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${B}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:hi,...e},signal:t.abortSignal});return YE.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${B}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return Z0.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(`/${B}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return Tb.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(`/${B}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Rg.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${B}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return Eb.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${B}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return yb.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(`/${B}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Rg.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${B}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Sb.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${B}/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(`/${B}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Um.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${B}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return bb.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${B}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Nm.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${B}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return CE.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${B}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return xE.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${B}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return fm.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${B}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return lT.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${B}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return vE.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${B}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return RE.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${B}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return AE.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${B}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return ny.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return rl({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as Gg}from"zod";var Ke=class extends Dt{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(`/${B}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{E.warn(`API key check failed: ${t.message}`)}});return Nb.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${B}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Pb.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${B}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return Ab.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${B}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${B}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return wb.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${B}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${B}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Cb.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${B}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return vb.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${B}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return Lb.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${B}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Db.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${B}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return Xb.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${B}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${B}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${B}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${B}/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(`/${B}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return kb.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${B}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return VE.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${B}/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(`/${B}/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(`/${B}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ub.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${B}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${B}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return Fb.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${B}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return Bb.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${B}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return zb.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${B}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return tv.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${B}/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(`/${B}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Js.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${B}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Js.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${B}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return _g.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(`/${B}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Js.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${B}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Js.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${B}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return _g.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${B}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Gg.record(Gg.string(),Gg.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${B}/quarantine`,{method:"GET"});return Hb.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${B}/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(`/${B}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${B}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return Gb.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${B}/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(`/${B}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return jb.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${B}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${B}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vb.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${B}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function jg(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(E.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),E.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return E.debug("Got auth info from API"),n}var mu=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var bo=class extends Dt{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${B}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return oy.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var ya=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 eU,en as tU}from"@faker-js/faker";var Ea="v1",Tn=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 eU({locale:tU}),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 en?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 en?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 en?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 en?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 en?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 en?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function Iv(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var gu=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await Iv(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}};import{diff as nU}from"deep-object-diff";import{cloneDeep as yu}from"lodash-es";function fi(r){let e={parentChain:[]};return hu(r,e),e}function hu(r,e){let{onPresetAction:t,onSimpleStepContainer:n,onConditional:o,earlyStop:i}=r;for(let a of r.steps)switch(a.type){case"PRESET_ACTION":if(t(a,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(a,e)&&i)return!0;e.parentChain.push(a);for(let c of a.blocks)if(t(c.assertion,e)&&i||hu({...r,steps:c.steps},e)&&i)return!0;if(hu({...r,steps:a.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"SECTION":case"AI_ACTION":if(n?.(a,e)&&i)return!0;if(a.steps){if(e.parentChain.push(a),hu({...r,steps:a.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(n?.(a,e)&&i)return!0;break}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(a)}}function Pv(r,e,t,n){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==i[s])return!1;i.shift()}return!!rU([r],t,i).result}function rU(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 fi({steps:r,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:n,parentChain:o}}function Mv(r,e){e(r);for(let t in r){let n=r[t];n&&(Array.isArray(n)?Su(n,e):typeof n=="object"&&Mv(n,e))}}function Su(r,e){for(let t of r)t&&(Array.isArray(t)?Su(t,e):typeof t=="object"&&Mv(t,e))}function Vg(r,e){if(r.length>e.length)return Vg(e,r);for(let t=0;t<r.length;t++)if(r[t]!==e[t])return!1;return!0}function fu(r){for(let e of r.results)switch(e.type){case"PRESET_ACTION":r.onPresetAction(e);break;case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":r.onSimpleStepContainer?.(e),fu({...r,results:e.results});break;case"CONDITIONAL":r.onConditional?.(e),e.assertionResult&&r.onPresetAction(e.assertionResult),fu({...r,results:e.results});break;default:throw new Error(`Unsupported result type: ${e.type}`)}}function vo(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(nU(r,e)).length>0}function Ta({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=Bn.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=oU(p.id,m),h=g.find(f=>!!n[f]);if(h)u(p,n[h]);else{if(p.type==="AI_ASSERTION")return;s.push(g[0])}};for(let p of r)switch(p.type){case"RESOLVED_MODULE":{l+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:g,uniqueKeysHit:h}=Ta({...t,steps:p.steps,keyPrefix:i?`${i}:${p.id}`:p.id,topLevel:!1});a.push(...m),s.push(...g),c.push(...h);break}case"SECTION":case"AI_ACTION":{if(l+=p.steps?.length??0,!p.steps?.length)break;let{cacheKeysHit:m,cacheKeysMissed:g,uniqueKeysHit:h}=Ta({...t,steps:p.steps,topLevel:!1});a.push(...m),s.push(...g),c.push(...h);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!hc.includes(p.command.type)||(p.command.type==="TYPE"||p.command.type==="MOUSE_DRAG"||p.command.type==="VISUAL_DIFF"||p.command.type==="SCROLL_DOWN"||p.command.type==="SCROLL_UP"||p.command.type==="SCROLL_LEFT"||p.command.type==="SCROLL_RIGHT")&&!p.command.target||"cache"in p.command&&p.command.cache)continue;l++,d(p.command,i);break}case"CONDITIONAL":{for(let m of p.blocks){l++,d(m.assertion.command,i),l+=m.steps.length;let{cacheKeysHit:g,cacheKeysMissed:h,uniqueKeysHit:f}=Ta({...t,steps:m.steps,topLevel:!1});a.push(...g),s.push(...h),c.push(...f)}if(p.elseSteps){l+=p.elseSteps.length;let{cacheKeysHit:m,cacheKeysMissed:g,uniqueKeysHit:h}=Ta({...t,steps:p.elseSteps,topLevel:!1});a.push(...m),s.push(...g),c.push(...h)}break}default:return(g=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(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 Ov(r,e){return e?`${e}:${r}`:r}function oU(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 $g(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
30
30
  ${JSON.stringify(t)}`);let n=[];return n.push({key:Ov(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function Lv(r){let e=new Set;return Su(r,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let n=t.moduleId;typeof n=="string"&&!e.has(n)&&e.add(n)}}),e}function Eu({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"&&fc(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 Tu(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;vo(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 Nv({steps:r}){let e={};return fi({steps:r,onPresetAction:(t,n)=>{let o=t.command;if(!("cache"in o)||!o.cache)return;let i=n.parentChain.filter(c=>c.type==="RESOLVED_MODULE").map(c=>c.id).join(":"),a=Ov(o.id,i),s=Bn.parse(o);e[a]=s},onSimpleStepContainer:(t,n)=>{},onConditional:(t,n)=>{}}),e}function nl(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 iU(r,e){return vo(r.memory,e.memory)?{...r,memory:e.memory,updatedAt:e.updatedAt}:r}function Wg(r,e){return r?vo(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:nl(e.target),updatedAt:e.updatedAt}}function aU(r,e){let t=yu(r);return t.fromTarget?vo(r.fromTarget?.memory,e.fromTarget?.memory)&&(t.fromTarget={...t.fromTarget,memory:e.fromTarget?.memory},t.updatedAt=e.updatedAt):(t.fromTarget=e.fromTarget,t.fromTarget&&(t.fromTarget=nl(t.fromTarget),t.updatedAt=e.updatedAt)),t.toTarget?vo(r.toTarget?.memory,e.toTarget?.memory)&&(t.toTarget={...t.toTarget,memory:e.toTarget?.memory},t.updatedAt=e.updatedAt):(t.toTarget=e.toTarget,t.toTarget&&(t.toTarget=nl(t.toTarget),t.updatedAt=e.updatedAt)),t}function Dv({newEntries:r,originalCachesMap:e,logger:t}){let n=[];for(let o of r){let i=e[o.key];if(!i||!i.cache){n.push(o);continue}if(o.value.type!==i.type){n.push(o);continue}let a=o.value.cache;if(o.value={...i},!a){n.push(o);continue}if("memory"in a&&a.memory){let s=i.cache&&"memory"in i.cache?i.cache.memory:void 0;vo(s,a.memory)&&(o.value.cache=iU(i.cache,a),n.push(o))}else if("target"in a&&a.target.memory){let s=i.cache&&"memory"in i.cache?i.cache.memory:void 0;if(vo(s,a.target.memory)){let c=mr.safeParse(o.value.cache);o.value.cache=Wg(c.data,a),n.push(o)}}else if("fromTarget"in a||"toTarget"in a){let s=am.optional().parse(o.value.cache);if(!s)continue;let c={from:s.fromTarget?.memory,to:s.toTarget?.memory},l={from:i.cache&&"fromTarget"in i.cache?i.cache.fromTarget?.memory:void 0,to:i.cache&&"toTarget"in i.cache?i.cache.toTarget?.memory:void 0};vo(l,c)&&(o.value.cache=aU(s,a),n.push(o))}}return n}async function bu({cacheStorage:r,logger:e,schemaVersion:t,stepLists:n,testId:o}){let i=yu(n.steps),a=yu(n.beforeSteps)??void 0,s=yu(n.afterSteps)??void 0,c={steps:i,beforeSteps:a,afterSteps:s};try{await r.resolveStepCacheEntries({testId:o,stepLists:c,schemaVersion:t,logger:e})}catch(l){throw e.error({err:l},"Failed to resolve step cache entries"),new Error(`Failed to resolve step cache entries. Please ensure you are running using a supported version of Momentic. If you believe this is a Momentic issue, please contact Support with the following error: ${l}`)}return c}function st(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var Lr={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},Nr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},qg={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},Kg={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function sU(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?Nr[r.operation]:Lr[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?Nr[r.operation]:Lr[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?Nr[r.operation]:Lr[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?Nr[r.operation]:Lr[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?Kg[r.condition]:qg[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 Ole={CONTENT:"The page"};function lU(r){switch(r.type){case"VALUE":return`the option with value ${r.value}`;case"LABEL":return`the option with label ${r.label}`;case"INDEX":return`the option at index ${r.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function Au(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 vu(r){let e="";return r.method&&(e=` with method ${r.method}`),`${Au(r.urlMatcher)}${e}`}function cU(r){switch(r.type){case"CONTENT":return`${r.negated?Nr.CONTAINS:Lr.CONTAINS} '${r.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.type)}}function vn(r,e=!0){switch(r.type){case"SUCCESS":return r.condition?.assertion?`Check success condition: ${r.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${r.goal}`;case"NAVIGATE":return`Go to URL: ${e?st(r.url,30):r.url}`;case"DIALOG":return`Automatically ${r.action.toLowerCase()} the next dialog`;case"CAPTCHA":return"Solve captchas on the page";case"GO_BACK":return"Go back to the previous page";case"GO_FORWARD":return"Go forward to the next page";case"SCROLL_DOWN":return`Scroll down ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${zt(r.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${zt(r.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${zt(r.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${zt(r.target)}`:""}`;case"WAIT":return`Wait for ${r.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(r.target?.type==="coordinates")return`Click at coordinates: ${zt(r.target)}`;let n="";return r.target?.elementDescriptor.length?n=` on element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` on element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Click${n}`}case"FOCUS":return`Focus ${zt(r.target)}`;case"BLUR":return`Focus ${zt(r.target)}`;case"DRAG":return`Drag ${zt(r.fromTarget)} onto ${zt(r.toTarget)}`;case"MOUSE_DRAG":return r.target?.type==="description"&&r.target.elementDescriptor?`Click and drag ${zt(r.target)} by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`:`Click and drag mouse by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`;case"TYPE":{let n="";return r.target?.type==="coordinates"?n=` in element at coordinates: ${zt(r.target)}`:r.target?.elementDescriptor.length?n=` in element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` in element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Type '${r.value}'${n||""}`}case"HOVER":{let n="";return r.target.type==="coordinates"?n=` over coordinates: ${zt(r.target)}`:r.target.elementDescriptor.length>0?n=` over element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` over element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Hover${n}`}case"PRESS":return`Press ${r.value}`;case"KEY_DOWN":return`Hold down ${r.value} on the keyboard`;case"KEY_UP":return`Release ${r.value} on the keyboard`;case"SELECT_OPTION":{let n="",o=lU(r.choice);return r.target.type==="coordinates"?n=` from element at coordinates: ${zt(r.target)}`:r.target.elementDescriptor.length>0?n=` from: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(n=` from: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${o}'${n}`}case"TAB":switch(r.action.type){case"SUBSTRING":return`Switch to tab with substring: ${r.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${r.action.pattern}`;case"INDEX":return`Switch to tab at index: ${r.action.index}`;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${r.url}`;case"REQUEST":return`Send ${r.method} request to ${r.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${r.url}`;case"COOKIE":return`Set cookie: ${r.value}`;case"LOCAL_STORAGE":return`Set local storage: ${r.key}: ${r.value}`;case"JAVASCRIPT":return`Run JavaScript: ${e?st(r.code,30):r.code}`;case"AI_ASSERTION":return`Assertion: '${r.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${r.target?`for element: ${zt(r.target)}`:"for entire page"}`;case"FILE_UPLOAD":return r.fileSource.type==="URL"?`Upload file: ${r.fileSource.url}`:`Upload file: ${r.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${zt(r.target)} ${sU(r.assertion)}`;case"PAGE_CHECK":return`Check the page ${cU(r.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${Au(r.matcher)}`;case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return r.requestMatcher?`Register a listener for network requests that ${vu(r.requestMatcher)}`:"Register a listener for network requests";case"AWAIT_LISTENER":return r.key?`Wait for the listener ${r.key} to resolve`:"Wait for a listener to resolve";case"RECORD_REQUESTS":return r.requestMatcher?`Start recording requests that match ${vu(r.requestMatcher)}`:"Start recording network requests";case"GET_RECORDED_REQUESTS":return r.key?`Get the requests that were recorded for ${r.key}`:"Get the requests that were recorded";case"SET_HEADER":return r.name?r.requestMatcher?`Set a ${r.name} header for requests that match ${vu(r.requestMatcher)}`:`Set a ${r.name} header for all requests`:"Set a header";case"MOCK_ROUTE":return r.requestMatcher?`Mock requests that ${vu(r.requestMatcher)}`:"Mock a network route";case"REMOVE_ROUTE_MOCK":return r.key?`Remove the mock with key ${r.key}`:"Remove all route mocks";case"OFFLINE_MODE":return r.enable?"Enable offline mode":"Disable offline mode";default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function uU(r){return typeof r=="object"&&r!==null}function bn(r){if(Array.isArray(r))return r.map(bn);if(uU(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=bn(n))}),e}return r}function kv(r){let e=[];for(let t of r){t.sort((a,s)=>a.timestamp-s.timestamp);let n=[],o,i=1;for(let a of t)o&&o.text===a.text&&o.type===a.type&&JSON.stringify(o.args??null)===JSON.stringify(a.args??null)?i++:(o&&(i>1?o.args&&o.args.length?o.args.push(`(repeated ${i} times)`):o.text+=` (repeated ${i} times)`:n.push(o)),o=a,i=1);o&&n.push(o),e.push(n)}return e}import{cloneDeep as Gle}from"lodash-es";import{cloneDeep as Zle}from"lodash-es";import{v4 as sce}from"uuid";import{cloneDeep as dU}from"lodash-es";import Gv from"truncate-json";import{v4 as Uv}from"uuid";import{cloneDeep as bce,unset as vce}from"lodash-es";function Ao(r){switch(r.type){case"AI_ACTION":return`AI action: ${st(r.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${st(r.text,100)}`;case"PRESET_ACTION":return vn(r.command);case"MODULE":return`Module: ${r.id}`;case"RESOLVED_MODULE":return`Module: ${r.name}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section${r.description?`with goal: ${st(r.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}function Si(r,e){return r.split(`
31
31
  `).map(t=>" ".repeat(e)+t).join(`
@@ -38,26 +38,26 @@ ${Si(`Sub-steps: ${e}`,2)}`}default:return(t=>{throw new Error("You missed a cas
38
38
  ${o}`:o)(Yg(r))}function wu(r,e={}){let t=e.followingStepStart??e.precedingStepEnd??new Date;return{type:"PRESET_ACTION",id:Uv(),message:`Starting the ${r.replace("-"," ")} section`,startedAt:t,finishedAt:t,status:"SUCCESS",command:{id:Uv(),type:"SUCCESS"},results:[]}}function Ru(r,e={}){let{index:t,includeDomState:n=!1,header:o}=e,i=mU(r,o),a;r.type==="PRESET_ACTION"&&(a=r.results?.[0]?.elementInteracted);let s=r.message!=="Successfully executed preset action."?r.message:void 0,c=i;r.status==="FAILED"&&(c=`${pU} ${c}`);let l={description:c,startedAt:r.startedAt.toISOString(),finishedAt:r.finishedAt.toISOString(),beforeUrl:r.beforeUrl,afterUrl:r.afterUrl,beforeSnapshot:r.beforeSnapshot,afterSnapshot:r.afterSnapshot,elementInteracted:a,message:s,index:t};if(r.status==="FAILED"&&n)try{let u=$E.array().parse(r.details);for(let d of u)"pageState"in d&&(l.pageState=d.pageState)}catch{}return l}async function jv(r,e,t,{addIndices:n=!0,includeDomState:o=!1,flatten:i=!0,maxItemsFromEnd:a=15,indexOffset:s=0}){let c,l=[];for(let u=0;u<t.length;u++){let d=t[u],p=n?u+s:void 0;switch(d.type){case"PRESET_ACTION":{l.push(Ru(d,{index:p,includeDomState:o,header:void 0})),d.status==="FAILED"&&(c=p);break}case"CONDITIONAL":case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":case"SECTION":{if(i){l.push(Ru(d,{index:n?p:void 0,includeDomState:o,header:"start"})),s+=1;let{failureIndex:m,results:g}=await jv(r,e,d.results,{addIndices:n,includeDomState:o,flatten:i,maxItemsFromEnd:a,indexOffset:s+u});l.push(...g),m!==void 0&&(c=m),s+=g.length,l.push(Ru(d,{index:n?s+u:void 0,includeDomState:o,header:"end"})),s+=1}else l.push(Ru(d,{index:n?s+u:void 0,includeDomState:o,header:void 0}));break}default:return(g=>{throw new Error("You missed a case in the switch above")})(d)}}return{results:l,failureIndex:c}}async function ba(r,e,t,{numStepsWithScreenshots:n=5,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,flatten:s=!0,maxItemsFromEnd:c=20}){let l=await jv(r,e,t,{addIndices:o,includeDomState:a,flatten:s,maxItemsFromEnd:c,indexOffset:0}),{results:u}=l,{failureIndex:d}=l;d!==void 0&&u.length>0&&(u=u.slice(0,d+1));let p=[],m=0;if(c!==void 0&&u.length>c&&(m=u.length-c),d!==void 0&&d<u.length-1&&r.warn({failureIndex:d,flattenedResultsLength:u.length,lastIndex:u.length-1,isLastIndex:d===u.length-1,offset:m},"PROCESS_RESULTS_FOR_LLM: Failure index check - should not be possible"),d!==void 0&&m>d)throw new Error("Failure index is out of bounds");for(let g=m;g<u.length;g++){let h=u[g],f={description:h.description,startedAt:h.startedAt,finishedAt:h.finishedAt,beforeUrl:h.beforeUrl,afterUrl:h.afterUrl,elementInteracted:h.elementInteracted,message:h.message,pageState:h.pageState,index:h.index},y,S;(n===void 0||n>0&&g>=u.length-n)&&(h.afterSnapshot&&(S=await zv(r,e,h.afterSnapshot)),i&&h.beforeSnapshot&&(y=await zv(r,e,h.beforeSnapshot))),f.beforeScreenshot=y,f.afterScreenshot=S,p.push(f)}return{results:p,failureIndex:d!==void 0?d-m:void 0}}function va({json:r,keysToRedact:e,maxJsonStringSize:t}){try{if(!r)return r;if(typeof r=="string")return st(r,t??2e4);if(typeof r=="object"){let{jsonString:n}=Gv(JSON.stringify(r,(o,i)=>e?.includes(o)||typeof i=="string"&&i.length>3e4?"REDACTED":i),t??2e4);return JSON.parse(n)}return r}catch{return r}}function Xg(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=Gv(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.details&&(n.details=void 0),n.type){case"PRESET_ACTION":Hv(n);break;case"CONDITIONAL":n.assertionResult&&Hv(n.assertionResult),Xg(n.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":{Xg(n.results,e);break}default:return(i=>{throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")})(n)}}}function Hv(r){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Cu(r,e){let t=dU(r);if(Xg(t,e),t.length>Fv)return e.error("Results too long, truncating before insertion"),t.slice(t.length-Fv,t.length);let n=JSON.stringify(t);if(n.length>Bv)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>Bv;)t.splice(0,1),n=JSON.stringify(t);try{return Ct.array().parse(JSON.parse(n))}catch(o){throw e.error({serialized:n,err:o},"Could not parse serialized results into JSON structure after processing"),o}}import{cloneDeep as jce}from"lodash-es";var gU=/^(?!.*\S+\s+\S+).*$/,hU=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,fU=/style="([^"]*)/g,SU=/data-[\w-]+/g,yU=r=>{switch(r.type){case"AI_ASSERTION":return{type:r.type,assertion:r.assertion};case"DRAG":if(r.fromTarget.type==="description")return{type:r.type,description:r.fromTarget.elementDescriptor};break;case"CLICK":case"BLUR":case"TYPE":case"SELECT_OPTION":case"ELEMENT_CHECK":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"VISUAL_DIFF":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":if(r.target?.type==="description")return{type:r.type,description:r.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function Vv(r){let e=yU(r),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:gU.test(t)&&hU.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:fU.test(t)?{thoughts:"Style tags are not recommended in the command description as they change frequently. Please remove them and describe the target in a different way.",category:"STYLE_TAG"}:SU.test(t)?{thoughts:"Hardcoded data attributes are not recommended in the command description as they change frequently.",category:"HARDCODED_ATTRIBUTE"}:new RegExp(`\\b${e.type}\\b`,"gi").test(t)?{thoughts:`The element description you provided starts with the command type (${e.type}). This can confuse our AI agents since the element itself is unrelated to the desired action.`,category:"TYPE_IN_DESCRIPTION"}:{thoughts:"NONE",category:"NONE"}}function $v(r,e){if(!(!r.envs||!r.envs.length)){for(let t of r.envs){let n=t;e in t&&(n[e]&&(t.default=!0),delete n.defaultOnCloud,delete n.defaultOnLocal)}r.envs.some(t=>t.default)||(r.envs[0].default=!0)}}import{cloneDeep as yA}from"lodash-es";import AU from"diff-lines";import _u,{gte as RU}from"semver";var Wv={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 qv={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 EU=["target","fromTarget","toTarget"];function Kv(r){for(let e of EU){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var Yv={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 Kv(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])Kv(n);return e}default:return e}})};import{v4 as TU}from"uuid";var Xv={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=TU()),e;default:return e}})};import{v4 as Jv}from"uuid";var Qv={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??Jv(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??Jv()}})),delete e.commands),e;default:return e}})};var Zv={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 bU}from"uuid";var eA={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=bU()),e))};import{v4 as tA}from"uuid";var rA={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=tA())}return e.id=tA(),e})};var nA={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 vU}from"uuid";var oA={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=vU()),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 iA={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 aA={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&&sA(t),e})};function sA(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){sA(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 lA={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 cA={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 uA={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 dA={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 pA={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 mA={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 xu=new Set(["CLICK","TYPE","SELECT_OPTION"]),gA={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||xu.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||xu.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||xu.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||xu.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var hA={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 fA={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 yi=[mA,hA,fA,gA,Wv,qv,Yv,Xv,Qv,Zv,eA,rA,nA,oA,iA,aA,lA,cA,uA,dA,pA];if(ve!==yi[yi.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");yi.forEach((r,e)=>{if(!_u.valid(r.toVersion)||!_u.valid(r.fromVersion))throw new Error(`Migration '${r.name}' has invalid version`);if(!_u.gt(r.toVersion,r.fromVersion))throw new Error(`Migration '${r.name}' has toVersion <= fromVersion`);if(e===0)return;if(yi[e-1].toVersion!==r.fromVersion)throw new Error(`Migration '${r.name}' at index ${e} is not contiguous with previous migration`)});function wU(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var ol=async({metadata:r,steps:e,logger:t,toVersion:n})=>{let o=e,{schemaVersion:i,id:a}=r,s=yi.findIndex(u=>_u.gt(u.toVersion,i));if(s===-1)return{steps:o,newVersion:i};let c=i;for(let u=s;u<yi.length;u++){if(n&&RU(c,n)){t.debug("Stopping migration early because toVersion was reached");break}let d=yi[u],p={id:a,migration:d.name,toVersion:d.toVersion};try{o=await SA(o,d),c=d.toVersion}catch(m){throw t.error({err:m,...p},"Migration failed"),new Error(`Step migration ${d.name} failed: ${m}`)}}let l=AU(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return l.trim()&&t.debug({diffs:l,id:a},"Migration diffs"),{newVersion:c,steps:o}};async function SA(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)||wU(i)&&(n[o]=await SA(i,e))}return t}async function EA({rawSteps:r,metadata:e,logger:t,callbacks:n}){$v(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await Iu({rawSteps:r.steps,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o}),s={...e,steps:i,schemaVersion:a};for(let c of["beforeSteps","afterSteps"]){let l=r[c];if(!l)continue;let{resolvedSteps:u}=await Iu({rawSteps:l,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o});s[c]=u}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function Ei(r,e,t){let{newVersion:n,steps:o}=await ol({metadata:r,steps:e,logger:t});try{return{steps:qe.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 Ac(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function Iu({rawSteps:r,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await Ei(e,r,t),s=[];for(let c of a)s.push(await il({step:c,callbacks:n,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function il({step:r,callbacks:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"AI_ACTION":return r;case"AI_ACTION_DYNAMIC":return r;case"PRESET_ACTION":return r;case"MODULE":{let c=r.moduleId,l=n[c];if(l)return{...yA(l),...r,type:"RESOLVED_MODULE"};let u=await e.onFetchModule({id:c,logger:t});if(!u)throw new Error(`Could not find module with id ${c}`);let{newVersion:d,steps:p}=await ol({metadata:{id:c,schemaVersion:u.schemaVersion},steps:u.steps,logger:t}),m;try{m=qe.array().parse(p)}catch(f){throw t.error({type:"zod",err:f,steps:p,newVersion:d,id:c},"Module failed to parse"),f}let g;try{g=await Promise.all(m.map(f=>il({step:f,callbacks:e,logger:t,resolvedModuleCache:n})))}catch(f){throw t.error({err:f,...r},`Failed to recursively resolve module '${u.name}': ${f}`),f}let h={...u,steps:g};return n[c]=yA(h),{...h,...r,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let c of r.blocks){let l=[];for(let u of c.steps)l.push(await il({step:u,callbacks:e,logger:t,resolvedModuleCache:n}));o.push({...c,steps:l})}let i;if(r.elseSteps){i=[];for(let c of r.elseSteps)i.push(await il({step:c,callbacks:e,logger:t,resolvedModuleCache:n}))}return{...r,blocks:o,elseSteps:i};case"SECTION":let a=[];for(let c of r.steps)a.push(await il({step:c,callbacks:e,logger:t,resolvedModuleCache:n}));return{...r,steps:a};default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{diff as bA}from"deep-object-diff";import{cloneDeep as TA}from"lodash-es";import{v4 as Jg}from"uuid";async function pt(r){let e=new Map,t=new Set,n=so.parse({steps:r.stepLists.steps??[],beforeSteps:r.stepLists.beforeSteps??void 0,afterSteps:r.stepLists.afterSteps??void 0}),o=TA(n.steps),i=await Ti({...r,steps:o,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),a={stepsToSave:{steps:i.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:i.cachesToSave,moduleUpdates:i.moduleUpdates};for(let s of["beforeSteps","afterSteps"]){let c=TA(n[s]);if(!c)continue;let l=await Ti({...r,steps:c,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});a.cachesToSave.push(...l.cachesToSave),a.moduleUpdates.push(...l.moduleUpdates),a.stepsToSave[s]=l.stepsToSave}return a}async function Ti({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(delete u.index,delete u.aiSuggested,u.id=c?Jg():u.id,u.type){case"PRESET_ACTION":{let p=u.command;p.id=c?Jg():p.id,"cache"in p&&p.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat($g({id:p.id,orgId:n.orgId,testId:n.testId,value:Bn.parse(p),moduleIdParents:o,moduleStepParents:i}))),delete p.cache),p.thoughts&&delete p.thoughts,l.stepsToSave.push({...u,command:p});break}case"RESOLVED_MODULE":{let p=c?Jg():u.id,m=u.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(u),a.set(u.moduleId,m));let{cachesToSave:g,stepsToSave:h,moduleUpdates:f}=await Ti({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,p],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(f),l.cachesToSave=l.cachesToSave.concat(g),t.has(m)||(t.add(m),l.moduleUpdates.push({...sr.parse(u),steps:qe.array().parse(h),moduleId:m}));let y=Qr.parse({...u,type:"MODULE",moduleId:m,inputs:u.inputs,id:p,skipped:u.skipped,cacheConfig:u.cacheConfig,envKey:u.envKey});l.stepsToSave.push(y);break}case"AI_ACTION":{if(!u.steps){l.stepsToSave.push(u);break}let{stepsToSave:p,cachesToSave:m}=await Ti({...e,steps:u.steps});try{u.steps=gr.array().parse(p)}catch(g){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${g}`)}l.stepsToSave.push(u),l.cachesToSave=l.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{l.stepsToSave.push(u);break}case"CONDITIONAL":{let p=[];for(let g of u.blocks){let{stepsToSave:h,cachesToSave:f,moduleUpdates:y}=await Ti({...e,steps:g.steps});p.push({...g,steps:h}),l.cachesToSave=l.cachesToSave.concat(f),l.moduleUpdates=l.moduleUpdates.concat(y)}let m={...u,elseSteps:void 0,blocks:p};if(u.elseSteps){let{stepsToSave:g,cachesToSave:h,moduleUpdates:f}=await Ti({...e,steps:u.elseSteps});m.elseSteps=g,l.cachesToSave=l.cachesToSave.concat(h),l.moduleUpdates=l.moduleUpdates.concat(f)}l.stepsToSave.push(m);break}case"SECTION":{let{stepsToSave:p,cachesToSave:m,moduleUpdates:g}=await Ti({...e,steps:u.steps}),h={...u,steps:p};l.moduleUpdates=l.moduleUpdates.concat(g),l.stepsToSave.push(h),l.cachesToSave=l.cachesToSave.concat(m);break}default:return(p=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(u)}return l}async function Pu({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let a=bA(o,i);if(Object.keys(a).length!==0){r.debug("Updating step caches post-success");try{let{cachesToSave:s}=await pt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});await e.saveStepCacheEntries({logger:r,testId:n,entries:s})}catch(s){r.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}async function Mu({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let a=bA(o,i);if(Object.keys(a).length===0)return;r.debug("Updating memory post-run failure");let s={};for(let u of["steps","beforeSteps","afterSteps"]){let d=o[u];if(!d||!d.length)continue;let p=Nv({steps:d});for(let[m,g]of Object.entries(p))s[m]=g}let{cachesToSave:c}=await pt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});r.debug({newEntries:c.length,originalCaches:Object.keys(s).length},"Comparing caches for memory pruning");let l=Dv({newEntries:c,originalCachesMap:s,logger:r});if(l.length){r.debug({prunedCaches:l},"Saving pruned memory post-failure");try{await e.saveStepCacheEntries({logger:r,testId:n,entries:c})}catch(u){r.error({err:u},"Failed to save memory after successful execution. This is not critical, but can impact future performance.")}}}import{cloneDeep as CU}from"lodash-es";import{stringify as vA}from"yaml";async function AA({test:r,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let n={id:r.id,name:r.name,description:r.description,baseUrl:r.baseUrl,schemaVersion:r.schemaVersion,advanced:r.advanced,retries:r.retries,envs:r.envs,disabled:r.disabled,labels:r.labels},o={},i=await xU({originalStepLists:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:pe.TEST,...n,beforeSteps:i.beforeSteps&&i.beforeSteps.length>0?i.beforeSteps:void 0,steps:i.steps,afterSteps:i.afterSteps&&i.afterSteps.length>0?i.afterSteps:void 0};return{test:vA(a),modules:o}}async function xU({originalStepLists:r,modules:e,processedModuleNames:t,createNewCacheIds:n}){let o=CU(r);Object.values(o).forEach(s=>{_U(s??[])});let{stepsToSave:i,moduleUpdates:a}=await pt({stepLists:o,createNewCacheIds:n});for(let s of a)t.has(s.name)||(e[s.name]=IU(s),t.add(s.name));return i}function _U(r){fi({steps:r,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function IU(r){let e=sr.parse(r),t={fileType:pe.MODULE,...e,schemaVersion:ve,steps:r.steps};return vA(t)}async function ie(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 al({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 sl({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 al({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function RA(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}function Ou(r){let e=[];for(let t of r)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let n={...t,type:"MODULE"};e.push(Qr.parse(n));break}case"SECTION":{let n={...t,steps:Ou(t.steps)};e.push(qe.parse(n));break}case"CONDITIONAL":{let n={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Ou(o.steps)})),elseSteps:t.elseSteps?Ou(t.elseSteps):void 0};e.push(Zo.parse(n));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function Lu(r){return Ou([r])[0]}import PU from"picomatch";var Nu=(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||PU(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},Du=(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}},Aa=r=>{try{return new URL(r),!0}catch{return!1}},wA=r=>!r.toLowerCase().startsWith("http"),Ra=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function bi(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}async function MU(r){let{logger:e,browserStateStorage:t,generator:n,results:o,error:i,maxItemsFromEnd:a,numStepsWithScreenshots:s,disableCache:c}=r,l=[];if(o.length>0){let{results:d}=await ba(e,t,o,{numStepsWithScreenshots:s,maxItemsFromEnd:a,includeBeforeScreenshots:!0,includeContainerTagsInDescription:!0});l=d}return await n.getTestResultClassification({results:l,errorMessage:i.message,errorStack:i.stack},{disableCache:c??!1})}async function CA(r){let{logger:e,browserStateStorage:t,generator:n,fullResults:o,failureReason:i,error:a,maxItemsFromEnd:s,numStepsWithScreenshots:c,disableCache:l}=r,u=o?.results??[];if(i==="SetupFailureError"){let d=(o?.beforeResults??[]).at(0);u=[wu("setup",{followingStepStart:d?.startedAt}),...o?.beforeResults??[]]}else if(i==="TeardownFailureError"){let d=u.at(-1),p=(o?.afterResults??[])[0],m=wu("teardown",{precedingStepEnd:d?.finishedAt,followingStepStart:p?.startedAt});u=[...u,m,...o?.afterResults??[]]}else if(u.length<20){let d=(o?.beforeResults??[]).at(-1),p=u.at(0),m=wu("main-test-body",{precedingStepEnd:d?.finishedAt,followingStepStart:p?.startedAt});u=[...o?.beforeResults??[],m,...u]}if(!t||!u||u.length===0)return{};try{let d=await MU({logger:e,browserStateStorage:t,generator:n,results:u,error:a,maxItemsFromEnd:s,numStepsWithScreenshots:c,disableCache:l});return{classification:d,aiFailureReason:d.reason}}catch(d){return e.error({err:d},"Failed to classify test result"),{}}}import{v4 as xA}from"uuid";function Qg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var ku=class{reporter;asyncWork;metadata;creditsUsedV1=0;creditsUsedV2=0;constructor({logger:e,reporter:t,runType:n,runId:o,testMetadata:i,suiteMetadata:a}){this.reporter=t,this.metadata={testId:i.id,testName:i.name,suiteId:a?.id,suiteName:a?.name},this.asyncWork=[t.reportBillableEvents(e,[{event:n,timestamp:new Date().toISOString(),transactionId:o,properties:Qg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(OT(e.type)){this.creditsUsedV2+=1;return}let t=Qm(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=Zm(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:xA(),properties:Qg({creditsUsed:this.creditsUsedV1},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),this.creditsUsedV2>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used-v2",timestamp:new Date().toISOString(),transactionId:xA(),properties:Qg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as OU}from"lodash-es";function _A(r){let e=OU(r);return fi({steps:e,earlyStop:!1,onPresetAction:t=>{Zg(t);let n;if(fc(t.command)&&t.command.cache!==void 0){let i=NU(t.command.cache);i&&"target"in i&&(n=i.target)}let o=t.command;return n!==void 0?o.cache=n:delete o.cache,o.thoughts&&delete o.thoughts,delete o.id,"index"in t&&delete t.index,!1},onConditional:t=>(Zg(t),!1),onSimpleStepContainer:t=>{if(t.type==="AI_ACTION"){let n=t,o=t.text;return Object.keys(n).forEach(i=>{delete n[i]}),n.type="AI_ACTION_DYNAMIC",n.text=o,!1}if(Zg(t),t.type==="RESOLVED_MODULE"){let n=t;delete n.cacheConfig,delete n.enabled,delete n.defaultCacheKey,delete n.defaultCacheTtl,delete n.defaultCacheAllInvocations,delete n.autoAuth,delete n.advanced}return!1}}),e}function Zg(r){let e=r;delete e.aiSuggested,delete e.id,delete e.retries,delete e.skipped}function LU(r){return r.selector?r.selector:r.generatedSelectors?.[0]}function eh(r){let e=LU(r),t=r.nodeOnlySerializedHtml,n={};return e&&(n.selector=e),t&&(n.nodeOnlySerializedHtml=t),Object.keys(n).length?n:void 0}function NU(r){if(!r)return;let e={};if("target"in r)return{target:eh(r.target)};if("fromTarget"in r||"toTarget"in r){let t=r.fromTarget?eh(r.fromTarget):void 0,n=r.toTarget?eh(r.toTarget):void 0;return t&&(e.fromTarget=t),n&&(e.toTarget=n),Object.keys(e).length?e:void 0}}function Ro({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i}){return i?new au:new th(r,e,t,{regenerateCache:n,alwaysSaveCache:o})}var th=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=wg(n),this.readCaches=!i,a?this.writeCaches=!0:s?this.writeCaches=!c.includes(s):this.writeCaches=!0}cacheHeaders;readCaches;writeCaches;async saveStepCacheEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t,beforeSteps:n,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}for(let s of[t,n,o])s&&Ta({steps:s,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await pt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import DU from"path";var kU=new pu(30,60*1e3),ih="https://api.momentic.ai",nh,PA=r=>{ih=r},hr=()=>ih,MA=()=>nh;var wa,oh,Fu,OA=async r=>{if(nh&&wa&&Fu)return wa;let e=new Ke({baseUrl:ih,apiKey:r,logger:E});nh=e;try{let t=await e.getAuthInfo();return wa=t.orgId,oh=t.userId,Fu=r,wa}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},vt=()=>{if(!wa)throw new Error("Your organization ID is invalid.");return wa},wo=()=>{if(!oh)throw new Error("Your user ID is invalid.");return oh},fr=()=>{if(!Fu)throw new Error("Your API key is invalid.");return Fu},ah,rh,Bu=(r,e)=>{ah=r,rh?.abort(),rh=new AbortController;let t=rh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=DU.resolve(r.rootDir,o.envFile);try{if(Uu.lstatSync(i).isSymbolicLink())return;Uu.existsSync(i)&&n.push(i)}catch(a){E.warn({err:a},`Failed to check if env file ${i} exists`)}});try{UU({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){E.error({err:o},"Failed to start config file watchers")}},ae=()=>ah;function UU({filesToWatch:r,revalidator:e,signal:t,project:n}){E.debug("Starting watch on the following files:"),r.forEach(o=>{E.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(kU.increment("setLocalProject")&&E.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.`),ah=await Promise.resolve(e(n.configFilePath)))};Uu.watchFile(o,{persistent:!1},i);let a=()=>{Uu.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Re(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var cl=FU();function ll(r){let e=ae(),t=It.dirname(e.configFilePath);return It.join(t,...r)}function zU(r){let e=ae(),t=It.dirname(e.configFilePath),n=It.relative(t,r);return n?n.split(It.sep):[]}function HU(r,e){let t=nr.statSync(r),n=zU(r);return Sg.parse({name:e,absolutePath:r,relativePath:n.join(It.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}cl.post("/",Re(async(r,e,t)=>{let n;try{n=tb.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=ll(n);if(!nr.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(It.sep)}`});return}if(!nr.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(It.sep)}`});return}let a=ae(),s=Array.from(a.config.exclude??[]).concat(tu),l=BU("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=It.join(o,d);return HU(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));cl.put("/",Re(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=ll(n);if(nr.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(It.sep)}`,pathSegments:n});return}nr.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(It.sep)}`,pathSegments:n};e.status(201).json(i)}));cl.patch("/",Re(async(r,e,t)=>{let n,o;try{let l=nb.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=ll(n),a=ll(o);if(!nr.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(It.sep)}`});return}if(nr.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(It.sep)}`});return}let s=It.dirname(a);nr.existsSync(s)||nr.mkdirSync(s,{recursive:!0}),nr.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(It.sep)} to ${o.join(It.sep)}`,pathSegments:o};e.status(200).json(c)}));cl.delete("/",Re(async(r,e,t)=>{let n,o=!0;try{let c=ob.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=ll(n);if(!nr.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(It.sep)}`,pathSegments:n});return}if(!nr.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(It.sep)}`});return}if(o)nr.rmSync(i,{recursive:!0,force:!0});else{if(nr.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}nr.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var sh=cl;import{Router as WF}from"express";import{diff as $U}from"deep-object-diff";import rn from"fs";import Ai from"path";import Ca from"yaml";import{z as DA}from"zod";import{execSync as GU}from"child_process";function Vn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,E.debug({postSaveCommand:n},"Executing post-save hook command");try{GU(n,{encoding:"utf-8"})}catch(o){E.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as LA}from"deep-object-diff";import An from"fs";import{cloneDeep as jU}from"lodash-es";import ul from"path";import{v4 as VU}from"uuid";import dl from"yaml";function Sr({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.modules[r.moduleId]?.fullFilePath;if(!i||!An.existsSync(i))throw new Error(`Tried to update module ${r.moduleId} that could not be found on disk`);let a=An.readFileSync(i,"utf-8"),s=dl.parse(a),c;if(r.name&&r.name!==s.name){let m=`${Le(r.name)}.module.yaml`;if(c=ul.join(ul.dirname(i),m),An.existsSync(c))throw new Error(`A conflicting file '${r.name}' already exists at path '${c}'`)}let l={...r,schemaVersion:e},u=bn({fileType:pe.MODULE,...Tg.parse(l),steps:qe.array().parse(r.steps)}),d=LA(u,s);if(d&&Object.keys(d).length===0&&!o){E.debug(`Skipping save for module ${r.moduleId} since there are no changes`);return}let p=dl.stringify(u);An.writeFileSync(i,p,"utf-8"),c&&An.renameSync(i,c),Vn(c||i,n.config)}function NA({moduleId:r,content:e,momenticFiles:t,project:n,logger:o}){let i=t.modules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${r} that could not be found on disk`);let a=$n(i,o),s={...a,...e},c=bn({fileType:pe.MODULE,...Tg.parse(s),steps:a.steps}),l=LA(c,a);if(l&&Object.keys(l).length===0){E.debug(`Skipping save for module ${r} since there are no changes`);return}let u=dl.stringify(c);An.writeFileSync(i,u,"utf-8");let d;if(e.name){let p=`${Le(e.name)}.module.yaml`;if(d=ul.join(ul.dirname(i),p),An.existsSync(d))throw new Error(`Module with name '${e.name}' already exists at path '${d}'`);An.renameSync(i,d)}Vn(d||i,n.config)}async function zu({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=Le(r),s=ul.join(o,`${a}.module.yaml`),c=VU(),{stepsToSave:l}=await pt({stepLists:{steps:n}}),u={fileType:pe.MODULE,schemaVersion:ve,moduleId:c,name:r,description:e,enabled:t,steps:l.steps},d=dl.stringify(u);return An.writeFileSync(s,d,"utf-8"),Vn(s,i.config),{moduleId:c,name:r,description:e,enabled:t,steps:n}}function $n(r,e){let t=An.readFileSync(r,"utf-8"),n=dl.parse(t);try{return sg.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic module`),o}}async function tn(r,e,t,n){let o=$n(r.fullFilePath,t),{resolvedSteps:i}=await Iu({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:t,callbacks:{onFetchModule:async({id:s})=>{let c=e.modules[s]?.fullFilePath;if(c)return $n(c,t)}}}),a={...o,steps:i};return n&&(n[r.id]=jU(a)),a}async function Hu(r,e){let t={};return await Promise.all(Object.values(r.modules).map(async n=>{await tn(n,r,e,t)})),Array.from(Object.values(t))}async function kA({test:r,name:e,folder:t}){let n=await AA({test:r});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Le(e)}.test.yaml`,a=Ai.join(t,i);return rn.writeFileSync(a,n.test,"utf-8"),a}function lh(r,e,t){let n=Ai.join(t.rootDir,r);if(!rn.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=rn.readFileSync(n,"utf-8"),i=Ca.parse(o),a,s;if(e.name&&e.name!==i.name){let p=`${Le(e.name)}.test.yaml`;if(a=Ai.join(Ai.dirname(r),p),s=Ai.join(t.rootDir,a),rn.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let c={...i,...e},l=Pr.parse(c),u={fileType:pe.TEST,...Pr.parse(l),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},d=Ca.stringify(u);return rn.writeFileSync(n,d,"utf-8"),s&&rn.renameSync(n,s),Vn(n,t.config),{newRelativeTestPath:a}}function ur({relativeTestPath:r,steps:e,schemaVersion:t,project:n,forceSaveOnNoDiffs:o}){let i=Ai.join(n.rootDir,r);if(!rn.existsSync(i))throw new Error(`Test not found at path '${r}' in project '${n.rootDir}'`);let a=rn.readFileSync(i,"utf-8"),s=Ca.parse(a),c=Pr.parse({...s,schemaVersion:t}),l=qe.array().or(DA.undefined()).parse(e.beforeSteps),u=qe.array().parse(e.steps),d=qe.array().or(DA.undefined()).parse(e.afterSteps),p=bn({fileType:pe.TEST,...c,beforeSteps:l&&l.length>0?l:void 0,steps:u,afterSteps:d&&d.length>0?d:void 0}),m=$U(p,s);if(m&&Object.keys(m).length===0&&!o){E.debug(`Skipping save for test ${c.name} since there are no changes`);return}let g=Ca.stringify(p);rn.writeFileSync(i,g,"utf-8"),E.debug(`Saving test ${c.name} to ${i}`),Vn(i,n.config)}function pl(r,e){let t=Ai.join(e.rootDir,r);if(!t)throw new Error(`Could not find test with path ${r} in Momentic project (${e.rootDir})`);let n;try{n=rn.readFileSync(t,"utf8"),n=n.replace(/\r\n|\r/g,`
39
39
  `)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Ca.parse(n)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return $t.parse(o)}function Ri(r,e,t){let n=t.project.rootDir,o;try{o=rn.readFileSync(r,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=Ca.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${r} is missing steps`);return i}async function lt(r,e,t){let n=Ri(r,e,t),o;try{o=Pr.parse(n)}catch(a){throw new Error(`Test ${r} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await EA({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let c=t.modules[a]?.fullFilePath;if(c)return $n(c,s)}}});return i}import WU from"@dotenvx/dotenvx";import qU from"fs";import UA from"path";function Gu(r,e){return(r.config.environments??[]).map(t=>wi(t.name,r,e))}function FA(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 KU(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=FA(i);s&&(n[o]=s);continue}let a;try{a=qU.readFileSync(UA.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&&E.debug(n,"Set environment variables with interpolation from project configuration"),n}function YU(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=WU.config({path:UA.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 wi(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`);if(!n.baseUrl)throw new Error(`Browser environment ${r} does not have a baseUrl configured`);let o={[yt]:FA(n.baseUrl)},i=KU({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=YU({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,browser:n.browser}}import{existsSync as lF,readFileSync as cF,readdirSync as uF,writeFileSync as dF}from"fs";import{glob as pF}from"glob";import Ci,{dirname as HA}from"path";import{cwd as mh}from"process";import GA from"yaml";import{z as He}from"zod";import BA from"fs";import{glob as XU}from"glob";import ml from"path";import JU from"yaml";import{z as ch}from"zod";var zA=!1,uh=["**/*.test.yaml","**/*.module.yaml"],dh=ch.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),ph=15,QU=ch.object({fileType:ch.nativeEnum(pe)});async function J(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??uh,o=Array.from(r.config.exclude??[]).concat(tu),i=AbortSignal.timeout(5e3),a;try{a=await XU(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:ph,nodir:!0,signal:i})}catch(s){throw E.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=ZU(r.rootDir,s,t,e?yn:E);c&&(t.duplicateEntities[c.id]=c.paths)}return zA=!0,t}function ZU(r,e,t,n){let o=ml.join(r,e),i=eF(o,n);if(!i)return;let a=tF(i,o,n);if(!a)return;let s=QU.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=rF(o,n);if(!l)return;let u=nF(e,o,l);switch(c){case pe.TEST:try{return oF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case pe.MODULE:try{return iF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case pe.MOBILE_TEST:try{return sF(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case pe.MOBILE_MODULE:try{return aF(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 eF(r,e){try{return BA.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function tF(r,e,t){try{let n=JU.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 rF(r,e){try{return BA.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function nF(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:ml.sep,fullPathSegments:e.split(ml.sep),relativePathSegments:r.split(ml.sep),fileName:ml.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function oF(r,e,t,n,o){let i=Pr.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:pe.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function iF(r,e,t,n,o){let i=sr.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:pe.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!zA&&Le(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 aF(r,e,t,n,o){let i=Xc.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:pe.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function sF(r,e,t,n,o){let i=qs.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:pe.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,...t},a}var xa="momentic.config.yaml",gh="momentic.workspace.yaml",mF=He.object({projects:He.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),gF=He.union([He.string(),He.object({fromFile:He.string(),json:He.boolean().optional()})]),hF=He.object({name:dh,baseUrl:He.string().optional().describe("Optional for mobile tests"),envFile:He.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:He.record(He.string(),gF).optional(),inheritFromShell:He.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:ni.optional().describe("NB: most things should use project-level configuration only")}),fF=He.object({postSave:He.string().optional()}),SF=He.object({name:dh,include:He.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:He.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:He.string().optional(),reporterDir:He.string().optional(),outputDir:He.string().optional(),recordVideo:He.boolean().optional(),retries:He.number().optional().describe("number of retries per test"),parallel:He.number().optional().describe("degree of parallelism"),environments:He.array(hF).optional(),gitMainBranch:He.string().optional(),gitProtectedBranches:He.string().array().optional(),ai:bg.optional(),browser:ni.optional(),emulator:ug.optional(),advanced:vg.optional(),hooks:fF.optional()});function jA(r,e){let t;try{t=cF(r,"utf-8")}catch(o){E.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=GA.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){E.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function hh(r){let e=jA(r,"project configuration");if(e!==void 0)try{return SF.parse(e)}catch(t){E.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function yF(r){let e=jA(r,"workspace configuration");if(e!==void 0)try{return mF.parse(e)}catch(t){E.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function EF(){let r=[],e=mh(),t=Ci.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=Ci.basename(e);if(eu.includes(i))return E.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of uF(e))if(a.endsWith(xa)){let s=Ci.join(e,a),c=hh(s);c&&r.push({configFilePath:s,config:c,rootDir:HA(s)})}if(r.length)return r;if(e=Ci.dirname(e),e===t)break}return r}async function At(r={}){let{configFilePath:e,nameFilter:t}=r,n=await fh(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:
40
40
  ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return E.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function TF(r){let e=yF(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${xa}`)),n=AbortSignal.timeout(2e3),o;try{o=await pF(t,{absolute:!1,cwd:mh(),dotRelative:!1,maxDepth:ph,nodir:!0,signal:n})}catch(a){throw E.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${gh} is misconfigured.`),a}let i=[];for(let a of o){let s=Ci.join(mh(),a),c=hh(s);c&&i.push({configFilePath:s,config:c,rootDir:HA(s)})}return i}async function fh(r){if(r){r=Ci.resolve(r);let t=hh(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:Ci.dirname(r)}]}if(lF(gh)){let t=await TF(gh);if(t)return t}return EF()}function Co(r,e){let t=GA.stringify(r);dF(e,t)}import _a from"fs";import Sh from"path";import{z as yh}from"zod";var VA="golden/visual-diff",$A="reports",WA="test-results";var bF=yh.object({width:yh.number(),height:yh.number()}),Ia=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let n=Sh.join(e.rootDir,e.config.goldenFileDir??VA);this.defaultGoldenScreenshotDir=n,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,n){if(t.screenshot?.data?.startsWith("https://")){let a=await fetch(t.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=Sh.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return _a.mkdirSync(Sh.dirname(o),{recursive:!0}),_a.writeFileSync(o,n.buffer),_a.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(_a.existsSync(o)){let a=_a.readFileSync(o),s=bF.parse(JSON.parse(_a.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new _("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as vF}from"node:child_process";import{promisify as AF}from"node:util";import RF from"simple-git";var Ge=RF(),qA=AF(vF);async function wF(r){let e=await Ye(r,Ge.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
41
- `)){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 CF(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 qA("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 qA("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function xF(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return CF(r,e,t);if(o)return}catch{}}function ju(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Ye(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function _F(){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 IF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.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 PF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.listRemote(["--get-url","origin"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.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 MF(r){let[e,t,n,o]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.listRemote(["--get-url","origin"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),a=t?.includes("gitlab.com"),s=t?ju(t):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:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function OF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?ju(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function LF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?ju(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function NF(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Ye(r,Ge.revparse(["HEAD"])),Ye(r,Ge.revparse(["--short","HEAD"])),Ye(r,Ge.revparse(["--abbrev-ref","HEAD"])),Ye(r,Ge.listRemote(["--get-url","origin"])),Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"])),e?Ye(r,Ge.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),wF(r)]),d=l?await Ye(r,Ge.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?ju(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,y=u["user.username"]||void 0,S=await xF(r,i,u)??y??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:S,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 DF(){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 kF(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Wn(r,e){let t=_F();if(!t)return NF(r,e);switch(t){case"GithubActions":return IF(r);case"GitlabCI":return PF(r);case"CircleCI":return MF(r);case"Buildkite":return OF(r);case"AzureDevOps":return LF(r);case"GCPCloudBuild":return DF()}}async function UF(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 FF(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 BF(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await FF(r,e,n,o,t)}else if(t.gitlabProjectPath)return await UF(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function Dr(r,e,t){let n=await kF(t),o=await Wn(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 BF(r,e,i);return{...n,...o,...a}}async function KA(){try{return!!(await Ge.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as zhe}from"deep-object-diff";import{cloneDeep as Ghe}from"lodash-es";import{v4 as efe}from"uuid";import rfe from"yaml";import yfe from"yaml";import{randomUUID as zF}from"crypto";import xo from"fs";import Pa from"path";var YA=new Set([".DS_Store","__MACOSX"]),XA={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 HF(r,e,t){if(XA[t]){let i=XA[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 JA(r,e){try{let t=Pa.join(e,"metadata.json");return su.parse(JSON.parse(xo.readFileSync(t,"utf-8")))}catch{throw new Eh(r,e)}}function QA(r,e,t){let n=zF(),o=r.child({runGroupId:n});xo.rmSync(e,{recursive:!0,force:!0});let i=xo.readdirSync(t).filter(c=>!YA.has(c)).map(c=>Pa.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);xo.mkdirSync(e,{recursive:!0});let a={...JA(t,i[0]),id:n};for(let c of i){let l=Pa.join(c,"runs");if(!xo.existsSync(l))continue;let u=JA(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=HF(a,u,m)}let d=xo.readdirSync(l);for(let p of d){if(YA.has(p))continue;let m=Pa.join(l,p),g=Pa.join(e,"runs",p);xo.cpSync(m,g,{recursive:!0})}}let s=Pa.join(e,"metadata.json");xo.writeFileSync(s,JSON.stringify(a,null,2))}import ZA from"adm-zip";import Th from"fs";import Vu from"path";function GF(r){let e=new ZA,t=Vu.join(r,"metadata.json"),n=su.parse(JSON.parse(Th.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Th.readdirSync(Vu.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new ZA(Vu.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(Vu.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function $u(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Th.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new gu(e);try{let{runGroupId:i,buffer:a}=GF(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 jF from"adm-zip";import kt from"fs";import yr from"path";var gl=class r{constructor(e){this.filePath=e;kt.rmSync(this.filePath,{recursive:!0,force:!0}),kt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(yr.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){kt.mkdirSync(yr.join(this.filePath,e),{recursive:!0})}readFile(e){let t=yr.join(this.filePath,e);if(kt.existsSync(t))return kt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=yr.join(this.filePath,t);try{kt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=yr.join(this.filePath,e);return kt.createWriteStream(t)}createRunArchive(e){return new bh(yr.join(this.filePath,"runs"),e)}},bh=class{constructor(e,t){this.filePath=e;this.tempPath=yr.join(e,`.${t}`),this.finalPath=yr.join(e,`${t}.zip`),kt.rmSync(this.tempPath,{recursive:!0,force:!0}),kt.rmSync(this.finalPath,{recursive:!0,force:!0}),kt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=yr.join(this.tempPath,e);if(kt.existsSync(t))return kt.readFileSync(t)}mkdir(e){kt.mkdirSync(yr.join(this.tempPath,e),{recursive:!0})}cd(e){return new gl(yr.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=yr.join(this.tempPath,t);kt.writeFileSync(o,n)}createFileStream(e){let t=yr.join(this.tempPath,e);return kt.createWriteStream(t)}close(){let e=new jF;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();kt.writeFileSync(this.finalPath,t),kt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import{hostname as VF}from"os";var $F="2.23.0",hl=fa({app:"desktop-server",hostname:VF(),disableConsoleLogs:!0}).child({cliVersion:$F});(async()=>{try{let r=await Wn(hl);r.gitBranchName&&hl.addBinding("branch",r.gitBranchName)}catch{}})();var eR=WF();eR.get("/",async(r,e)=>{let t=ae(),n=MA();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Dr(hl,n,t);e.status(200).json(o)});var vh=eR;import IW from"events";import PP,{Router as PW}from"express";import MW from"http";import OW from"path";import{Server as t$}from"socket.io";var qF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{e.info({sessionId:n},"Cancel event received");let o=t.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},tR={event:"cancel",createHandler:qF};var KF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},rR={event:"fetchA11yTree",createHandler:KF};var YF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},nR={event:"fetchDom",createHandler:YF};var XF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),t.removeSession(n,e)}},oR={event:"disconnect",createHandler:XF};function nn(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=JF(t);QF(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await ZF(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function JF(r){let e=r[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":t=r[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){t=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(t)break}let n=r[r.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function QF(r,e,t){e&&(r.beforeUrl=e.beforeUrl),t&&(r.afterUrl=t.afterUrl,r.data=t.data,t.status!=="SUCCESS"&&(r.message=t.message))}async function ZF(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as uB}from"crypto";import{faker as eB}from"@faker-js/faker";import tB from"assert";import rB from"axios";import*as nB from"child_process";import oB from"moment";import*as iB from"otpauth";import aB from"pg";async function iR(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=$c(n,e);t.push(...o)}),t}function sB(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 lB(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 cB=Object.getPrototypeOf(async function(){}).constructor;async function aR(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=(T,b)=>{o[T]=b,l[T]=b},d={},p=(T,b)=>{o[T]=b,d[T]=b},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 cB("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(rB,oB,c.fakerInstance??eB,tB,aB,m,g,iB,nB,iR,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>c.sms.send(b),b=>c.sms.fetchLatest(b),c.email,c.sms,c.ai,sB(a,s),...Object.values(i??{}))),f=!0,y,S;try{let T=await H(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});y=await lB(e.options.responseSerialization??"RAW",T)}catch(T){t.error({err:T,env:o,evalCode:n},`[${r}] Error executing code: ${T}`),f=!1,T instanceof To?S=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:S=T instanceof Error?T.message:`${T}`}return{result:y,variableUpdates:l,persistentVariableUpdates:d,success:f,error:S}}async function sR({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=fo,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=uB(),p=await aR(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return E.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as dB,randomUUID as pB}from"crypto";import mB from"fetch-retry";var gB=mB(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}}),lR=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,cR=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function uR({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=fo,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!lR)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!cR)throw new Error("Missing lambda auth secret.");let h=dB("sha256",cR).update(r).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let y={id:pB(),orgId:r,momenticLambdaAuthHash:h,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await H(gB(lR,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)}),{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(S){m=S}}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=NT.parse(await p.json())}catch(y){throw new Error(`Code evaluation server returned invalid response: ${y}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function _o(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await uR(r);else if(r.localTools)e=await sR({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
41
+ `)){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 CF(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 qA("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 qA("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function xF(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return CF(r,e,t);if(o)return}catch{}}function ju(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Ye(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function _F(){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 IF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.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 PF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.listRemote(["--get-url","origin"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.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 MF(r){let[e,t,n,o]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.listRemote(["--get-url","origin"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),a=t?.includes("gitlab.com"),s=t?ju(t):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:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function OF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?ju(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function LF(r){let[e,t,n]=await Promise.all([Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?ju(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function NF(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Ye(r,Ge.revparse(["HEAD"])),Ye(r,Ge.revparse(["--short","HEAD"])),Ye(r,Ge.revparse(["--abbrev-ref","HEAD"])),Ye(r,Ge.listRemote(["--get-url","origin"])),Ye(r,Ge.show(["--no-patch","--format=%ci"])),Ye(r,Ge.show(["-s","--pretty=%B"])),Ye(r,Ge.show(["-s","--pretty=%an"])),e?Ye(r,Ge.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),wF(r)]),d=l?await Ye(r,Ge.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?ju(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,y=u["user.username"]||void 0,S=await xF(r,i,u)??y??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:S,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 DF(){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 kF(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Wn(r,e){let t=_F();if(!t)return NF(r,e);switch(t){case"GithubActions":return IF(r);case"GitlabCI":return PF(r);case"CircleCI":return MF(r);case"Buildkite":return OF(r);case"AzureDevOps":return LF(r);case"GCPCloudBuild":return DF()}}async function UF(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 FF(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 BF(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await FF(r,e,n,o,t)}else if(t.gitlabProjectPath)return await UF(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function Dr(r,e,t){let n=await kF(t),o=await Wn(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 BF(r,e,i);return{...n,...o,...a}}async function KA(){try{return!!(await Ge.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as zhe}from"deep-object-diff";import{cloneDeep as Ghe}from"lodash-es";import{v4 as efe}from"uuid";import rfe from"yaml";import yfe from"yaml";import{randomUUID as zF}from"crypto";import xo from"fs";import Pa from"path";var YA=new Set([".DS_Store","__MACOSX"]),XA={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 HF(r,e,t){if(XA[t]){let i=XA[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 JA(r,e){try{let t=Pa.join(e,"metadata.json");return su.parse(JSON.parse(xo.readFileSync(t,"utf-8")))}catch{throw new Eh(r,e)}}function QA(r,e,t){let n=zF(),o=r.child({runGroupId:n});xo.rmSync(e,{recursive:!0,force:!0});let i=xo.readdirSync(t).filter(c=>!YA.has(c)).map(c=>Pa.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);xo.mkdirSync(e,{recursive:!0});let a={...JA(t,i[0]),id:n};for(let c of i){let l=Pa.join(c,"runs");if(!xo.existsSync(l))continue;let u=JA(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=HF(a,u,m)}let d=xo.readdirSync(l);for(let p of d){if(YA.has(p))continue;let m=Pa.join(l,p),g=Pa.join(e,"runs",p);xo.cpSync(m,g,{recursive:!0})}}let s=Pa.join(e,"metadata.json");xo.writeFileSync(s,JSON.stringify(a,null,2))}import ZA from"adm-zip";import Th from"fs";import Vu from"path";function GF(r){let e=new ZA,t=Vu.join(r,"metadata.json"),n=su.parse(JSON.parse(Th.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Th.readdirSync(Vu.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new ZA(Vu.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(Vu.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function $u(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Th.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new gu(e);try{let{runGroupId:i,buffer:a}=GF(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 jF from"adm-zip";import kt from"fs";import yr from"path";var gl=class r{constructor(e){this.filePath=e;kt.rmSync(this.filePath,{recursive:!0,force:!0}),kt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(yr.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){kt.mkdirSync(yr.join(this.filePath,e),{recursive:!0})}readFile(e){let t=yr.join(this.filePath,e);if(kt.existsSync(t))return kt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=yr.join(this.filePath,t);try{kt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=yr.join(this.filePath,e);return kt.createWriteStream(t)}createRunArchive(e){return new bh(yr.join(this.filePath,"runs"),e)}},bh=class{constructor(e,t){this.filePath=e;this.tempPath=yr.join(e,`.${t}`),this.finalPath=yr.join(e,`${t}.zip`),kt.rmSync(this.tempPath,{recursive:!0,force:!0}),kt.rmSync(this.finalPath,{recursive:!0,force:!0}),kt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=yr.join(this.tempPath,e);if(kt.existsSync(t))return kt.readFileSync(t)}mkdir(e){kt.mkdirSync(yr.join(this.tempPath,e),{recursive:!0})}cd(e){return new gl(yr.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=yr.join(this.tempPath,t);kt.writeFileSync(o,n)}createFileStream(e){let t=yr.join(this.tempPath,e);return kt.createWriteStream(t)}close(){let e=new jF;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();kt.writeFileSync(this.finalPath,t),kt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import{hostname as VF}from"os";var $F="2.23.1",hl=fa({app:"desktop-server",hostname:VF(),disableConsoleLogs:!0}).child({cliVersion:$F});(async()=>{try{let r=await Wn(hl);r.gitBranchName&&hl.addBinding("branch",r.gitBranchName)}catch{}})();var eR=WF();eR.get("/",async(r,e)=>{let t=ae(),n=MA();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await Dr(hl,n,t);e.status(200).json(o)});var vh=eR;import IW from"events";import PP,{Router as PW}from"express";import MW from"http";import OW from"path";import{Server as t$}from"socket.io";var qF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{e.info({sessionId:n},"Cancel event received");let o=t.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},tR={event:"cancel",createHandler:qF};var KF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},rR={event:"fetchA11yTree",createHandler:KF};var YF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async(o,i)=>{let a=t.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},nR={event:"fetchDom",createHandler:YF};var XF=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),t.removeSession(n,e)}},oR={event:"disconnect",createHandler:XF};function nn(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=JF(t);QF(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await ZF(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function JF(r){let e=r[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":t=r[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){t=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(t)break}let n=r[r.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function QF(r,e,t){e&&(r.beforeUrl=e.beforeUrl),t&&(r.afterUrl=t.afterUrl,r.data=t.data,t.status!=="SUCCESS"&&(r.message=t.message))}async function ZF(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as uB}from"crypto";import{faker as eB}from"@faker-js/faker";import tB from"assert";import rB from"axios";import*as nB from"child_process";import oB from"moment";import*as iB from"otpauth";import aB from"pg";async function iR(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=$c(n,e);t.push(...o)}),t}function sB(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 lB(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 cB=Object.getPrototypeOf(async function(){}).constructor;async function aR(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=(T,b)=>{o[T]=b,l[T]=b},d={},p=(T,b)=>{o[T]=b,d[T]=b},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 cB("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(rB,oB,c.fakerInstance??eB,tB,aB,m,g,iB,nB,iR,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,b=>c.sms.send(b),b=>c.sms.fetchLatest(b),c.email,c.sms,c.ai,sB(a,s),...Object.values(i??{}))),f=!0,y,S;try{let T=await H(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});y=await lB(e.options.responseSerialization??"RAW",T)}catch(T){t.error({err:T,env:o,evalCode:n},`[${r}] Error executing code: ${T}`),f=!1,T instanceof To?S=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:S=T instanceof Error?T.message:`${T}`}return{result:y,variableUpdates:l,persistentVariableUpdates:d,success:f,error:S}}async function sR({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=fo,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=uB(),p=await aR(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return E.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as dB,randomUUID as pB}from"crypto";import mB from"fetch-retry";var gB=mB(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}}),lR=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,cR=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function uR({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=fo,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!lR)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!cR)throw new Error("Missing lambda auth secret.");let h=dB("sha256",cR).update(r).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let y={id:pB(),orgId:r,momenticLambdaAuthHash:h,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await H(gB(lR,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)}),{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(S){m=S}}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=NT.parse(await p.json())}catch(y){throw new Error(`Code evaluation server returned invalid response: ${y}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function _o(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await uR(r);else if(r.localTools)e=await sR({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
42
42
  ${e.error}
43
43
  Code received:
44
44
  ${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 hB}from"lodash-es";async function or(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=fo,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 _o({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 _("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 Wu(r){return dR(r)}async function dR({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 or({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 dR({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function pR(r,e){for(let{path:t,original:n}of e)hB(r,t,n)}import fB from"fetch-retry";var Mye=process.env.MAILINATOR_API_KEY,Oye=fB(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import{hostname as AB}from"os";import{cloneDeep as gR}from"lodash-es";async function hR(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>dy(e.cache)?e.cache:void 0,a=i(),s=gR(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=Wg(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 ie(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await mR({cacheToUse:a,params:r});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new _("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&ac(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await mR({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=nl(g.target),g.updatedAt=new Date),d}async function mR({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!io(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=yB(t.assertion),l,u=!1,d=gR(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=>SB(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:ri(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 _)||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 SB(r,{command:e,fixtures:t}){let n=e.assertion;await t.browser.highlight(r);let o=!0,i,a;switch(n.type){case"ELEMENT_CONTENT":{let c=await r.textContent()??"";if(a={elementTextContent:st(c,500,!0)},!qu(c,n.value,n.operation,!!n.negated)){let l=n.negated?Lr[n.operation]:Nr[n.operation];o=!1,i=new _("AssertionFailureError",`The content ${l} '${n.value}': ${c}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:st(await r.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let c;try{c=await r.getAttribute(n.attr,{timeout:3e3})??""}catch(l){i=new _("AssertionFailureError",`The element does not have an attribute named ${n.attr}: ${l}`),o=!1;break}if(!qu(c,n.value,n.operation,!!n.negated)){let l=n.negated?Lr[n.operation]:Nr[n.operation];o=!1,n.operation==="EXISTS"?i=new _("AssertionFailureError",`The attribute ${n.attr} ${l}`):i=new _("AssertionFailureError",`The attribute ${n.attr} ${l} '${n.value}': ${c}`)}break}case"ELEMENT_EXISTENCE":{switch(n.condition){case"VISIBLE":{o=await r.evaluate(async(l,u)=>{let d=Date.now();for(;Date.now()-d<u;){await new Promise(m=>setTimeout(m,250));let p=l.getBoundingClientRect();if(!(p.width===0||p.height===0)&&window.getComputedStyle(l).visibility!=="hidden"&&window.getComputedStyle(l).display!=="none")return!0}return!1},pn*1e3);break}case"EDITABLE":{o=await r.isEditable({timeout:pn*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await r.isEnabled({timeout:pn*1e3});break}case"FOCUSED":{o=await r.evaluate(l=>l===document.activeElement);break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.condition)}if(o=n.negated?!o:o,!o){let c=n.negated?qg[n.condition]:Kg[n.condition];i=new _("AssertionFailureError",`The element ${c}`)}break}case"ELEMENT_NAME":{let c=await r.evaluate(l=>l.tagName);if(!qu(c,n.value,n.operation,!!n.negated)){let l=n.negated?Lr[n.operation]:Nr[n.operation];o=!1,i=new _("AssertionFailureError",`The element tag name ${l} '${n.value}': ${c}`)}break}case"ELEMENT_STYLE":{let c=await r.evaluate((l,u)=>window.getComputedStyle(l).getPropertyValue(u),n.property);if(!qu(c,n.value,n.operation,!!n.negated)){let l=n.negated?Lr[n.operation]:Nr[n.operation];o=!1,n.operation==="EXISTS"?i=new _("AssertionFailureError",`The style property ${n.property} ${l}`):i=new _("AssertionFailureError",`The style property ${n.property} ${l} '${n.value}': ${c}`)}break}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{success:o,data:a,err:i}}function qu(r,e,t,n){let o;switch(t){case"CONTAINS":{o=r.includes(e);break}case"EQUALS":{o=r.trim()===e.trim();break}case"STARTS_WITH":{o=r.trim().startsWith(e);break}case"EXISTS":{o=r.trim().length>0;break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return n?!o:o}function yB(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function fR(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as EB}from"jimp";async function fl(r,e){let t=await r.screenshot(e),n=await EB.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as SR}from"jimp";import Ah from"jpeg-js";import TB from"pixelmatch";async function yR({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!io(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 G=>fl(o,{locator:G.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await fl(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 $=`${l.width}x${l.height}`,G=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${$}) does not match saved screenshot dimensions (${G}) - 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 SR.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await SR.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,y=g.width*g.height,S=Math.abs(p.height-g.height),T=Math.abs(p.width-g.width);if(f>y){let $=d.cover({w:g.width,h:g.height});l.buffer=await $.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(y>f){let $=m.cover({w:p.width,h:p.height});u.buffer=await $.getBuffer("image/jpeg"),h="saved"}let b={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},R=t.threshold??.1,x=TB(Ah.decode(u.buffer).data,Ah.decode(l.buffer).data,b.data,l.width,l.height,{threshold:R,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=x>R*100,P=`Visual diff of ${x.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${R*100}%.`;if(h&&(P+=` The ${h} screenshot was cropped since it was taller by ${S} pixels and wider by ${T} pixels.`),I)throw new _("ActionFailureError",P);return{fail:I,thoughts:P,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:Ah.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var bB=3e4;async function ER({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??bB/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([m,g])=>m&&g)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([m,g])=>m&&g).forEach(([m,g])=>{a.append(m,g)});let s=a.toString(),c;if(Aa(r.url)&&(c=r.url),t&&Ra(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new _("ActionFailureError",`Invalid URL: ${r.url}`);e.info({url:c,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let u=await H((async()=>{let m=s?`${c}?${s}`:c;try{return await n(m,{headers:i,method:r.method,body:r.body})}catch(g){throw e.error({err:g},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${g}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new _("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!u.ok){let m;try{m=await u.text()}catch(g){m=`Failed to read response body: ${g}`}throw new _("ActionFailureError",`Fetch request failed with status ${u.status}: ${m}`)}let d={};u.headers.forEach((m,g)=>{d[g]=m});let p={status:u.status,headers:d};if(u.headers.get("content-type")?.includes("json"))try{p.json=await u.json()}catch{}else u.headers.get("content-type")?.includes("text")&&(p.text=await u.text());return p}var vB=5e3;async function Ku({timeout:r=pn,...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 TR(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 ie(s,e.signal),s=Math.min(Math.floor(s*1.5),vB);else return i}return i=await TR(e),i}async function TR({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(bR,{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(bR,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?Lr.CONTAINS:Nr.CONTAINS;a=new _("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new _("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.type)}}function bR({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 Rh=async r=>{let{step:e,resolvedInputs:t}=r.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=r.fixtures,c=s.browser,{orgId:l,runId:u}=r.inputs,d=s.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),n.info(va({json:{inputs:t,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,g,h;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",y=await or({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});h={orgId:l,cacheKeys:[y,...Object.entries(t).map(([T,b])=>`${T}:${b}`)]},n.info({original:f,keyParams:h},"Module cache key params");let S=Date.now();for(;Date.now()-S<ub;){d?.throwIfAborted();let T=await i.getCacheResult(h);if(T){n.info({cacheResult:st(T,1e3,!0)},"Got result from module execution cache"),p=Yu(e,t,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(T),m=!0;break}else n.info({cacheKey:f,keyParams:h},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:h,clientMetadata:`hostName:${AB()};runId:${u}`},d);if(b.acquired){g=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:g,cacheKey:f,keyParams:h},"Failed to acquire cache lock, retrying...");await ie(2500+Math.random()*1e4,d)}}try{if(!p)p=await RB(r);else if(e.autoAuth){let f=Wc.safeParse(p.data);if(!f.success)throw new _("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let y=!1,S=e.advanced?.cacheInvalidation;if(S&&S.type==="PAGE_CHECK"){let T={type:"CONTENT",value:S.substring},b=await Ku({timeout:pn,assertion:T,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});b.success?n.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(n.info({invalResult:b},"Invalidating cached result due to page check failure"),y=!0)}if(h&&y)return await i.deleteCacheResult(h),Rh(r)}}finally{try{g!==void 0&&!m&&p?.status==="SUCCESS"&&await wB({step:e,result:p,browser:s.browser,cacheKeyPrefix:g,logger:n,storage:i})}finally{g!==void 0&&await i.releaseCacheLock(g)}}return p},RB=async r=>{let{step:e,tracer:t}=r.moduleParams,n=Yu(e,r.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:a}=await r.executeStepList({...r,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,nn({asyncTasks:r.work.asyncTasks,nestedResults:a,result:n,logger:r.fixtures.logger}),n};function Yu(r,e,t){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:r.id,moduleId:r.moduleId,moduleName:r.name,startedAt:new Date,cacheConfig:r.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:t}}async function vR({orgId:r,step:e,context:t,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await _o({orgId:r,code:c,fragment:!0,context:t,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new _("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function wB({step:r,result:e,browser:t,cacheKeyPrefix:n,logger:o,storage:i}){let a=r.cacheConfig?.cacheExpiryMs;(!a||a===Jb)&&(a=r.defaultCacheTtl??Qb);let s;r.autoAuth?s=JSON.stringify(await t.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:va({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function xi(r,e,t){return CB(r,e,t)}async function CB(r,e,t){let n=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof _?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,r.type==="RESOLVED_MODULE"){let c=Yu(r,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...Lu(r),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Ma(r,e){let t=!1;try{return r&&!r.state.failureRecoveryDisabled&&(r.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{r&&t&&(r.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as dG}from"lodash-es";import{randomUUID as AR}from"crypto";import{diff as xB}from"deep-object-diff";import{cloneDeep as RR}from"lodash-es";var Xu=async r=>{let{step:e,tracer:t}=r.presetParams,{logger:n,controller:o,context:i}=r.fixtures,{collectDebugData:a}=r.options,{testMetadata:s}=r.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?RR(e.command.cache):{},d=o.browser.url(),p=new Date,m,g=AR(),h=AR();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let b=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:l,snapshotId:g,html:b})}}catch(b){l.debug({err:b},"Failed to take before screenshot, continuing...")}let f,y,S,T=Gc();try{let b=await o.executePresetCommand(T,t,e.command,i,s?.advanced.disableAICaching??!1);b.beforeScreenshotOverride&&(m=b.beforeScreenshotOverride),S=b.afterScreenshotOverride;let R=new Date,C=o.browser.url();y={beforeUrl:d,afterUrl:C,startedAt:p,finishedAt:R,viewport:o.browser.getViewport(),status:b.fail?"FAILED":"SUCCESS",elementInteracted:b.elementInteracted},f={...e,message:b.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:C,finishedAt:R,startedAt:p,status:b.fail?"FAILED":"SUCCESS",data:b.data,results:[y],details:T.details},"assertion"in e.command&&(f.message=b.thoughts||"Assertion passed.")}catch(b){l.error({message:b.message,stack:b.stack},`Failed executing preset step ${vn(e.command)}`);let R=o.browser.url(),C=new Date,x=b instanceof Error?b.message:`${b}`;y={beforeUrl:d,afterUrl:R,startedAt:p,finishedAt:C,viewport:o.browser.getViewport(),status:b instanceof DOMException&&b.name==="AbortError"?"CANCELLED":"FAILED",message:x},f={...e,startedAt:p,finishedAt:C,beforeUrl:d,afterUrl:R,status:b instanceof DOMException&&b.name==="AbortError"?"CANCELLED":"FAILED",message:x,failureReason:b instanceof _?b.reason:void 0,results:[y],details:T.details}}finally{let b="cache"in e.command&&e.command.cache?RR(e.command.cache):{},R=xB(u,b);R&&Object.keys(R).length>0&&l.info({diffs:R},"Updated cache")}if(a)try{if(S||(S=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let b=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:l,snapshotId:h,html:b})}}catch(b){l.debug({err:b},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return y.beforeSnapshot=g,f.beforeSnapshot=g,y.afterSnapshot=h,f.afterSnapshot=h,m&&t.attachBeforeScreenshot({logger:l,snapshotId:g,screenshot:m}),S&&t.attachAfterScreenshot({logger:l,snapshotId:h,screenshot:S}),f};async function wR(r){let{step:e,tracer:t}=r.conditionalParams,{logger:n,controller:o}=r.fixtures,i=new Date,a=Lu(e),s=e.elseSteps,c=!0,l=[],u,d=Gc();for(let f=0;f<e.blocks.length;f++){n.info(`Evaluating condition ${f} in conditional step`);let y=e.blocks[f];try{let S=await Xu({...r,presetParams:{tracer:t,step:y.assertion}});l.push(S),u=S,S.status==="SUCCESS"?(n.info(`Condition ${f} resolved to true, executing the corresponding ${y.steps.length} steps`),c=!1,s=y.steps):n.info(S.message,`Condition ${f} resolved to false`)}catch(S){n.info({err:S},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(s)c&&n.info("No conditions resolved to true, executing the else block steps");else{n.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let f={...a,assertionResult:u,status:"SUCCESS",startedAt:i,data:l[l.length-1]?.data,message:l[l.length-1]?.message,results:[],finishedAt:new Date,details:d.details};return nn({asyncTasks:r.work.asyncTasks,nestedResults:[...l],result:f,logger:n}),f}n.info(`Executing ${s.length} steps in the selected conditional block`);let p=await r.conditionalParams.tracer.startSubSteps(),m=await r.executeStepList({...r,listParams:{steps:s,containerName:"conditional block",tracer:p}}),h={...a,assertionResult:u,...m,startedAt:i,finishedAt:new Date};return nn({asyncTasks:r.work.asyncTasks,nestedResults:[...l,...m.results],result:h,logger:n}),h}import{randomUUID as CR}from"crypto";var xR=async r=>{let{tracer:e}=r.aiStepParams,{controller:t,logger:n}=r.fixtures;await t.browser.waitForDOMStability();let o=await t.browser.screenshot({}),i=await _B(r);i.finishedAt=new Date,nn({asyncTasks:r.work.asyncTasks,result:i,nestedResults:i.results,logger:r.fixtures.logger});let a=await t.browser.screenshot({}),s=CR();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:n,snapshotId:s,screenshot:o});let c=CR();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:n,snapshotId:c,screenshot:a}),i},_B=async r=>{let{step:e,tracer:t}=r.aiStepParams,{controller:n,context:o,logger:i}=r.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new _("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await t.startSubSteps(),{status:l}=await r.executeStepList({...r,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as wh}from"crypto";var _R=15,IB=7,IR=async r=>{let{tracer:e}=r.aiStepParams,{logger:t,controller:n}=r.fixtures;await n.browser.waitForDOMStability();let o=await n.browser.screenshot({quality:75}),i=await PB(r);i.finishedAt=new Date,nn({asyncTasks:r.work.asyncTasks,result:i,nestedResults:i.results,logger:r.fixtures.logger});let a=await n.browser.screenshot({quality:75}),s=wh();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:t,snapshotId:s,screenshot:o});let c=wh();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:t,snapshotId:c,screenshot:a}),i},PB=async r=>{let{step:e,tracer:t}=r.aiStepParams,{testMetadata:n,orgId:o}=r.inputs,{controller:i,context:a,logger:s,codeEvalTools:c}=r.fixtures,{step:l}=r.callbacks,u=`${e.id}-${Date.now()}`,d=s.child({stepId:e.id,langfuseSessionId:u}),p={...e,startedAt:new Date,beforeTestContext:a.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await or({orgId:o,s:e.text,context:a,logger:d,localTools:c});await i.browser.waitForDOMStability({logger:d});let h=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],y=0,S=0,T,b;for(;;){if(y>_R)return p.message=`Exceeded the maximum number of commands allowed per AI step (${_R})`,p.status="FAILED",p;if(i.executeAbortController.signal.aborted)return p.message="Test execution was cancelled",p.status="CANCELLED",p;l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let R=await i.evaluateAiAction({goal:m,startingScreenshot:y===0?void 0:h,history:f,logger:d,langfuseSessionId:u,lastError:b}),{evaluation:C,reasoning:x,summary:I}=R;d.info(R,"Got AI evaluation");let P=p.results[y-1]?.id;switch(C.type){case"DONE":return p.message=`Our AI evaluator confirmed all tasks are complete: ${x}`,p.status="SUCCESS",P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:`${I}
45
45
  ${x}`}),p;case"RIGHT_TRACK":{T=void 0,y===0?l.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:x}):P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:x});break}case"WRONG_TRACK":{if(T=`${x}
46
46
  ${C.feedback}`,S++,S>=IB)return p.message=`Our AI agent requires additional information to achieve this goal:
47
47
  ${x}
48
- ${C.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${x}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:p.message}),p}let $=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:y,lastActionHint:T},`Generating new sub-command ${y} within AI action`);let G,F;try{({command:G,reasoning:F}=await i.promptToCommand({goal:m,history:f,startingScreenshot:h,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:T,langfuseSessionId:u})),d.info({command:G,reasoning:F},"Got proposed command")}finally{clearTimeout($)}if(G.type==="FAILURE")return clearTimeout($),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${F}`,p;let ne={id:wh(),type:"PRESET_ACTION",command:G},U={substepIndex:y+1,message:F||"Generated new command."};l.onDynamicCommandGenerated?.({...U,step:ne,parentStepId:e.id}),d.info({commandId:G.id},`Executing sub-command ${y} within AI step: ${vn(G)}`);let j=await t.startSubSteps(),W=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[ne],tracer:j}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let Qe=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(W),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Qe.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:vn(G),elementInteracted:W.results[0]?.elementInteracted,thoughts:F});let ke={substepIndex:y,output:{...W,message:W.message??"Successfully executed preset action."},step:ne,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(ke),await t.finish({output:Lc.parse(W),step:W,message:W.message,attempt:1}),W.status==="FAILED")if(p.status="FAILED",p.message=W.message,S<3)S++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${W.message}`;else return p;else if(W.status==="CANCELLED")return p.status="CANCELLED",p.message=W.message,p;y++}};import{randomUUID as oG}from"crypto";import qTe,{multistream as YTe}from"pino";import JTe from"pino-pretty";var ebe=5*1024,MB="...[truncated]",tbe=Buffer.byteLength(MB,"utf8");import{PostHog as OB}from"posthog-node";async function PR(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let s=await H(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=s.featureFlags||{},a=s.featureFlagPayloads||{};break}catch(s){t=s,n++,await new Promise(c=>setTimeout(c,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var Ju=class r extends Ys{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new OB("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await PR(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await PR(this.client,this.orgId);this.flags=t,this.payloads=n}};import{randomUUID as LB}from"node:crypto";import{PostHog as NB}from"posthog-node";var Qu=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new NB("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new r({...this.bindings,...e},this.options)}track(e,t){if(!pT(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:n,...o}=e;return this.client.capture({distinctId:LB(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};import{execSync as DB}from"child_process";import Oa from"os";import kB from"v8";var MR,Rn,OR=Oa.platform(),UB=Oa.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),{}),Zu=r=>{try{let e={},t=!1,n=FB(),o=BB(),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=kB.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"),gi&&E.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}},LR=r=>{Zu(r),setTimeout(()=>Zu(r),5e3)};function NR(r){if(!Or)return Zu(r),{interval:setInterval(()=>Zu(r),2e4),cpuMetadata:UB,platform:OR}}function FB(){let r=Oa.totalmem(),e=OR==="darwin"?zB():(()=>{let n=Oa.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function BB(){let r=Oa.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,!Rn)return Rn=t,null;let n={user:t.user-Rn.user,nice:t.nice-Rn.nice,sys:t.sys-Rn.sys,idle:t.idle-Rn.idle,irq:t.irq-Rn.irq,total:t.total-Rn.total};return MR={measurementTime:e,intervalMs:e-Rn.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},Rn=t,MR}function zB(){try{let r=DB("/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=Oa.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var ed=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function HB(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 td(r,e){let t=HB(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var sw="=",id=";",Uh=",";var lw=8192;var ka={};KM(ka,{getKeyPairs:()=>Tz,parseKeyPairsIntoRecord:()=>bz,parsePairKeyValue:()=>cw,serializeKeyPairs:()=>Ez});je();var yz=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 Ez(r){return r.reduce(function(e,t){var n=""+e+(e!==""?Uh:"")+t;return n.length>lw?e:n},"")}function Tz(r){return r.getAllEntries().map(function(e){var t=yz(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=id+o.metadata.toString()),i})}function cw(r){var e=r.split(id);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(sw);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=xh(e.join(id))),{key:o,value:i,metadata:a}}}}}function bz(r){return typeof r!="string"||r.length===0?{}:r.split(Uh).map(function(e){return cw(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}je();var ad;(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"})(ad||(ad={}));var vz=",",Az=["OTEL_SDK_DISABLED"];function Rz(r){return Az.indexOf(r)>-1}var wz=["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 Cz(r){return wz.indexOf(r)>-1}var xz=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function _z(r){return xz.indexOf(r)>-1}var Fh=1/0,Bh=128,Iz=128,Pz=128,zh={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:Je.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:Fh,OTEL_ATTRIBUTE_COUNT_LIMIT:Bh,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:Fh,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:Bh,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:Fh,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:Bh,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:Iz,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:Pz,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:ad.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 Mz(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function Oz(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 Lz(r,e,t,n){n===void 0&&(n=vz);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var Nz={ALL:Je.ALL,VERBOSE:Je.VERBOSE,DEBUG:Je.DEBUG,INFO:Je.INFO,WARN:Je.WARN,ERROR:Je.ERROR,NONE:Je.NONE};function Dz(r,e,t){var n=t[r];if(typeof n=="string"){var o=Nz[n.toUpperCase()];o!=null&&(e[r]=o)}}function uw(r){var e={};for(var t in zh){var n=t;switch(n){case"OTEL_LOG_LEVEL":Dz(n,e,r);break;default:if(Rz(n))Mz(n,e,r);else if(Cz(n))Oz(n,e,r);else if(_z(n))Lz(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Ut(){var r=uw(process.env);return Object.assign({},zh,r)}function dw(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function sd(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=dw(r.charCodeAt(n)),i=dw(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var pw="1.25.1";var kz="deployment.environment";var Uz="process.runtime.name";var Fz="service.name";var Bz="service.instance.id";var zz="telemetry.sdk.name",Hz="telemetry.sdk.language",Gz="telemetry.sdk.version";var mw=kz;var gw=Uz;var ld=Fz;var hw=Bz;var Al=zz,Rl=Hz,wl=Gz;var jz="nodejs";var fw=jz;var Ua,cd=(Ua={},Ua[Al]="opentelemetry",Ua[gw]="node",Ua[Rl]=fw,Ua[wl]=pw,Ua);var Vz=9,$z=6,Wz=Math.pow(10,$z),qz=Math.pow(10,Vz);function Sw(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*Wz);return[t,n]}function yw(r){return r[0]*qz+r[1]}function Cl(r){return r[0]*1e6+r[1]/1e3}var Ii;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Ii||(Ii={}));var Ew=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 Kz=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},Yz=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))},Tw=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new Ew}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,Yz([this._that],Kz(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 kr;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(kr||(kr={}));var Kt;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Kt||(Kt={}));var Xz=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 DAe=function(r){Xz(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function bw(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}je();var Ur;(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"})(Ur||(Ur={}));var vw=function(){function r(){this.kind=Ur.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var me;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(me||(me={}));var Jz=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 Qz(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 Hh=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=Qz(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=bw(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 Gh=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Ur.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Hh(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 Hh(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 Hh(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:Kt.HISTOGRAM,dataPoints:n.map(function(i){var a=Jz(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();je();var jh=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},Vh=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))},$h=function(){function r(e,t,n,o){e===void 0&&(e=new Zz),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 Zz=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,Vh([n,this._counts.length-t],jh(this._counts.slice(t)),!1)),o.splice.apply(o,Vh([0,t],jh(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(Vh([],jh(this._counts),!1))},r}();var Aw=52,e1=2146435072,t1=1048575,Wh=1023,ud=-Wh+1,dd=Wh,xl=Math.pow(2,-1022);function pd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&e1)>>20;return n-Wh}function md(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&t1)*Math.pow(2,32);return o+n}function _l(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function ww(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var r1=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)}}(),Io=function(r){r1(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var xw=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<xl)return this._minNormalLowerBoundaryIndex();var t=pd(e),n=this._rightShift(md(e)-1,Aw);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Io("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Io("overflow: "+e+" is > maximum lower boundary: "+n);return _l(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=ud>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return dd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var _w=function(){function r(e){this._scale=e,this._scaleFactor=_l(Math.LOG2E,e),this._inverseFactor=_l(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=xl)return this._minNormalLowerBoundaryIndex()-1;if(md(e)===0){var t=pd(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 Io("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return xl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Io("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 ud<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(dd+1<<this._scale)-1},r}();var Iw=-10,Pw=20,n1=Array.from({length:31},function(r,e){return e>10?new _w(e-10):new xw(e-10)});function qh(r){if(r>Pw||r<Iw)throw new Io("expected scale >= "+Iw+" && <= "+Pw+", got: "+r);return n1[r+10]}var o1=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},gd=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}(),i1=20,a1=160,Kh=2,s1=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=a1),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 $h),u===void 0&&(u=new $h),d===void 0&&(d=qh(i1)),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<Kh&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Kh),this._maxSize=Kh)}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=ww(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=qh(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=gd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=gd.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 gd(0,-1);var o=t-n;return new gd(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 Mw=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Ur.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new s1(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:Kt.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=o1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var l1=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},Yh=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=Sw(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ow=function(){function r(){this.kind=Ur.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Yh(e)},r.prototype.merge=function(e,t){var n=Cl(t.sampleTime)>=Cl(e.sampleTime)?t:e;return new Yh(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Cl(t.sampleTime)>=Cl(e.sampleTime)?t:e;return new Yh(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Kt.GAUGE,dataPoints:n.map(function(i){var a=l1(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var c1=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},Il=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 Xh=function(){function r(e){this.monotonic=e,this.kind=Ur.SUM}return r.prototype.createAccumulation=function(e){return new Il(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Il(t.startTime,this.monotonic,o,t.reset):new Il(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 Il(t.startTime,this.monotonic,o,!0):new Il(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Kt.SUM,dataPoints:n.map(function(i){var a=c1(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Pi=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)}}(),Cn=function(){function r(){}return r.Drop=function(){return zw},r.Sum=function(){return Hw},r.LastValue=function(){return Gw},r.Histogram=function(){return jw},r.ExponentialHistogram=function(){return u1},r.Default=function(){return d1},r}();var Lw=function(r){Pi(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 vw,e}(Cn);var Nw=function(r){Pi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Xh(!0),e.NON_MONOTONIC_INSTANCE=new Xh(!1),e}(Cn);var Dw=function(r){Pi(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 Ow,e}(Cn);var kw=function(r){Pi(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 Gh([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Cn);var Uw=function(r){Pi(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 Gh(this._boundaries,this._recordMinMax)},e}(Cn);var Fw=function(r){Pi(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 Mw(this._maxSize,this._recordMinMax)},e}(Cn);var Bw=function(r){Pi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case me.COUNTER:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return Hw;case me.GAUGE:case me.OBSERVABLE_GAUGE:return Gw;case me.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Uw(t.advice.explicitBucketBoundaries):jw}return V.warn("Unable to recognize instrument type: "+t.type),zw},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Cn);var zw=new Lw,Hw=new Nw,Gw=new Dw,jw=new kw,u1=new Fw,d1=new Bw;je();function hd(){return"unknown_service:"+process.argv0}var Po=function(){return Po=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},Po.apply(this,arguments)},p1=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())})},m1=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}}},g1=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},Jh=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[ld]=hd(),e[Rl]=cd[Rl],e[Al]=cd[Al],e[wl]=cd[wl],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 p1(this,void 0,void 0,function(){return m1(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=Po(Po({},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=g1(a,2),l=c[0],u=c[1];return Po(Po(Po(Po({},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 Mi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Mi||(Mi={}));je();var h1=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())})},f1=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}}},Qh=function(){return kr.CUMULATIVE},Vw=function(r){switch(r){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.GAUGE:case me.HISTOGRAM:case me.OBSERVABLE_GAUGE:return kr.DELTA;case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return kr.CUMULATIVE}},$w=function(r){switch(r){case me.COUNTER:case me.HISTOGRAM:return kr.DELTA;case me.GAUGE:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_GAUGE:return kr.CUMULATIVE}};function S1(){var r=Ut(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Qh:e==="delta"?Vw:e==="lowmemory"?$w:(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."),Qh)}function y1(r){return r!=null?r===Mi.DELTA?Vw:r===Mi.LOWMEMORY?$w:Qh:S1()}function E1(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Cn.Default()}}var Ww=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=E1(t),this._aggregationTemporalitySelector=y1(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return h1(this,void 0,void 0,function(){return f1(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}();je();je();var T1=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},qw=1e4,Kw=5,Yw=1e3,Xw=5e3,Jw=1.5;function Pl(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=T1(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 Zh(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function ef(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 tf(r){return typeof r=="number"?r<=0?rf(r,qw):r:b1()}function b1(){var r,e=Number((r=Ut().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Ut().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?rf(e,qw):e}function rf(r,e){return V.warn("Timeout must be greater than 0",r),e}function Qw(r){var e=[429,502,503,504];return e.includes(r)}function Zw(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 eC=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 Tw(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=tf(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:Ii.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:Ii.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:Ii.SUCCESS})}).catch(function(n){t({code:Ii.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}();je();import*as nf from"url";import*as Sd from"http";import*as yd from"https";import*as tC from"zlib";import{Readable as A1}from"stream";var Mo;(function(r){r.NONE="none",r.GZIP="gzip"})(Mo||(Mo={}));var v1=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)}}(),Fa=function(r){v1(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 fd=function(){return fd=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},fd.apply(this,arguments)};function of(r,e,t,n,o){var i=r.timeoutMillis,a=new nf.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 Fa("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:fd({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?Sd.request:yd.request,g=function(h,f){switch(h===void 0&&(h=Kw),f===void 0&&(f=Yw),l=m(p,function(S){var T="";S.on("data",function(b){return T+=b}),S.on("aborted",function(){if(u){var b=new Fa("Request Timeout");o(b)}}),S.on("end",function(){if(u===!1)if(S.statusCode&&S.statusCode<299)V.debug("statusCode: "+S.statusCode,T),n(),clearTimeout(d),clearTimeout(c);else if(S.statusCode&&Qw(S.statusCode)&&h>0){var b=void 0;f=Jw*f,S.headers["retry-after"]?b=Zw(S.headers["retry-after"]):b=Math.round(Math.random()*(Xw-f)+f),c=setTimeout(function(){g(h-1,f)},b)}else{var R=new Fa(S.statusMessage,S.statusCode,T);o(R),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(S){if(u){var T=new Fa("Request Timeout",S.code);o(T)}else o(S);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var S=new Fa("Request Timeout");o(S)}clearTimeout(d),clearTimeout(c)}),r.compression){case Mo.GZIP:{l.setHeader("Content-Encoding","gzip");var y=R1(e);y.on("error",o).pipe(tC.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function R1(r){var e=new A1;return e.push(r),e.push(null),e}function af(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 nf.URL(r.url),t=e.protocol==="http:"?Sd.Agent:yd.Agent;return new t(fd({keepAlive:!0},r.httpAgentOptions))}catch(n){V.error("collector exporter failed to create http agent. err: "+n.message);return}}function sf(r){if(r)return r;var e=Ut().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Ut().OTEL_EXPORTER_OTLP_COMPRESSION;return e===Mo.GZIP?Mo.GZIP:Mo.NONE}je();var w1=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)}}(),Ed=function(r){w1(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,Pl(t.headers),ka.parseKeyPairsIntoRecord(Ut().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=af(t),i.compression=sf(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;of(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}(eC);function nC(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function C1(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function oC(r){var e=nC(r);return C1(e)}function x1(r){var e=nC(r);return e.toString()}var _1=typeof BigInt<"u"?x1:yw;function rC(r){return r}function iC(r){if(r!==void 0)return sd(r)}var I1={encodeHrTime:oC,encodeSpanContext:sd,encodeOptionalSpanContext:iC};function aC(r){var e,t;if(r===void 0)return I1;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?oC:_1,encodeSpanContext:o?rC:sd,encodeOptionalSpanContext:o?rC:iC}}var P1=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 sC(r){return{name:r.name,version:r.version}}function Ba(r){return Object.keys(r).map(function(e){return lC(e,r[e])})}function lC(r,e){return{key:r,value:cC(e)}}function cC(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(cC)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=P1(t,2),o=n[0],i=n[1];return lC(o,i)})}}:{}}function uC(r){return{attributes:Ba(r.attributes),droppedAttributesCount:0}}je();function pC(r,e){var t=aC(e);return{resource:uC(r.resource),schemaUrl:void 0,scopeMetrics:M1(r.scopeMetrics,t)}}function M1(r,e){return Array.from(r.map(function(t){return{scope:sC(t.scope),metrics:t.metrics.map(function(n){return O1(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function O1(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=k1(r.aggregationTemporality);switch(r.dataPointType){case Kt.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:dC(r,e)};break;case Kt.GAUGE:t.gauge={dataPoints:dC(r,e)};break;case Kt.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:N1(r,e)};break;case Kt.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:D1(r,e)};break}return t}function L1(r,e,t){var n={attributes:Ba(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Er.INT:n.asInt=r.value;break;case Er.DOUBLE:n.asDouble=r.value;break}return n}function dC(r,e){return r.dataPoints.map(function(t){return L1(t,r.descriptor.valueType,e)})}function N1(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ba(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 D1(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ba(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 k1(r){switch(r){case kr.DELTA:return 1;case kr.CUMULATIVE:return 2}}function mC(r,e){return{resourceMetrics:r.map(function(t){return pC(t,e)})}}var lf={serializeRequest:function(r){var e=mC(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 gC="0.52.1";var hC=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)}}(),za=function(){return za=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},za.apply(this,arguments)},fC="v1/metrics",U1="http://localhost:4318/"+fC,F1={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+gC},B1=function(r){hC(e,r);function e(t){var n=r.call(this,t,lf,"application/json")||this;return n.headers=za(za(za(za({},n.headers),F1),ka.parseKeyPairsIntoRecord(Ut().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),Pl(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Ut().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?ef(Ut().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Ut().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?Zh(Ut().OTEL_EXPORTER_OTLP_ENDPOINT,fC):U1},e}(Ed),SC=function(r){hC(e,r);function e(t){return r.call(this,new B1(t),t)||this}return e}(Ww);var Ha;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Ha||(Ha={}));var xn;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(xn||(xn={}));je();var z1=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)}}(),yC=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())})},EC=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}}},H1=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},G1=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))},j1=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 TC(r){return r!=null}function Td(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function bC(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var cf=function(r){z1(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Oo(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new cf("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function vC(r){return yC(this,void 0,void 0,function(){var e=this;return EC(this,function(t){return[2,Promise.all(r.map(function(n){return yC(e,void 0,void 0,function(){var o,i;return EC(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 AC(r){return r.status==="rejected"}function uf(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,G1([],H1(e(n)),!1))}),t}function RC(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=j1(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 wC(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 CC(r,e){return r.toLowerCase()===e.toLowerCase()}je();var Fr;(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"})(Fr||(Fr={}));var df=function(){function r(){this.kind=Fr.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}();je();var Ae;(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"})(Ae||(Ae={}));function _n(r,e,t){var n,o,i,a;return $1(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:Er.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function xC(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 _C(r,e){return CC(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var V1=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function $1(r){return r.match(V1)!=null}var W1=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 q1(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 bd=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=q1(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=wC(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 vd=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Fr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new bd(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 bd(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 bd(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:xn.HISTOGRAM,dataPoints:n.map(function(i){var a=W1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ae.GAUGE||e.type===Ae.UP_DOWN_COUNTER||e.type===Ae.OBSERVABLE_GAUGE||e.type===Ae.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}();je();var pf=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mf=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))},gf=function(){function r(e,t,n,o){e===void 0&&(e=new K1),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 K1=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,mf([n,this._counts.length-t],pf(this._counts.slice(t)),!1)),o.splice.apply(o,mf([0,t],pf(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(mf([],pf(this._counts),!1))},r}();var IC=52,Y1=2146435072,X1=1048575,hf=1023,Ad=-hf+1,Rd=hf,Ml=Math.pow(2,-1022);function wd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&Y1)>>20;return n-hf}function Cd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&X1)*Math.pow(2,32);return o+n}function Ol(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function MC(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var J1=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)}}(),Lo=function(r){J1(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var LC=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Ml)return this._minNormalLowerBoundaryIndex();var t=wd(e),n=this._rightShift(Cd(e)-1,IC);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Lo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Lo("overflow: "+e+" is > maximum lower boundary: "+n);return Ol(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=Ad>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Rd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var NC=function(){function r(e){this._scale=e,this._scaleFactor=Ol(Math.LOG2E,e),this._inverseFactor=Ol(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Ml)return this._minNormalLowerBoundaryIndex()-1;if(Cd(e)===0){var t=wd(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 Lo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Ml;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Lo("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 Ad<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Rd+1<<this._scale)-1},r}();var DC=-10,kC=20,Q1=Array.from({length:31},function(r,e){return e>10?new NC(e-10):new LC(e-10)});function ff(r){if(r>kC||r<DC)throw new Lo("expected scale >= "+DC+" && <= "+kC+", got: "+r);return Q1[r+10]}var Z1=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},xd=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}(),eH=20,tH=160,Sf=2,UC=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=tH),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 gf),u===void 0&&(u=new gf),d===void 0&&(d=ff(eH)),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<Sf&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Sf),this._maxSize=Sf)}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=MC(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=ff(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=xd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=xd.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 xd(0,-1);var o=t-n;return new xd(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 yf=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Fr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new UC(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:xn.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Z1(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ae.GAUGE||e.type===Ae.UP_DOWN_COUNTER||e.type===Ae.OBSERVABLE_GAUGE||e.type===Ae.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}();je();var rH=_h("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function FC(r){return r.setValue(rH,!0)}je();function BC(){return function(r){V.error(nH(r))}}function nH(r){return typeof r=="string"?r:JSON.stringify(oH(r))}function oH(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 iH=BC();function _d(r){try{iH(r)}catch{}}var zC="1.30.1";var aH="process.runtime.name";var sH="service.name";var lH="telemetry.sdk.name",cH="telemetry.sdk.language",uH="telemetry.sdk.version";var HC=aH;var GC=sH;var Ll=lH,Nl=cH,Dl=uH;var dH="nodejs";var jC=dH;var Ga,Oi=(Ga={},Ga[Ll]="opentelemetry",Ga[HC]="node",Ga[Nl]=jC,Ga[Dl]=zC,Ga);function kl(r){r.unref()}var yH=9,EH=6,TH=Math.pow(10,EH),BCe=Math.pow(10,yH);function Li(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*TH);return[t,n]}function ja(r){return r[0]*1e6+r[1]/1e3}var Ul;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Ul||(Ul={}));je();function VC(r,e){return new Promise(function(t){Da.with(FC(Da.active()),function(){r.export(e,function(n){t(n)})})})}var $C={_export:VC};var bH=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},Id=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=Li(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ef=function(){function r(){this.kind=Fr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Id(e)},r.prototype.merge=function(e,t){var n=ja(t.sampleTime)>=ja(e.sampleTime)?t:e;return new Id(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=ja(t.sampleTime)>=ja(e.sampleTime)?t:e;return new Id(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.GAUGE,dataPoints:n.map(function(i){var a=bH(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var vH=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},Va=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 Pd=function(){function r(e){this.monotonic=e,this.kind=Fr.SUM}return r.prototype.createAccumulation=function(e){return new Va(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Va(t.startTime,this.monotonic,o,t.reset):new Va(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 Va(t.startTime,this.monotonic,o,!0):new Va(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.SUM,dataPoints:n.map(function(i){var a=vH(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Ni=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)}}(),Br=function(){function r(){}return r.Drop=function(){return QC},r.Sum=function(){return ZC},r.LastValue=function(){return ex},r.Histogram=function(){return tx},r.ExponentialHistogram=function(){return AH},r.Default=function(){return RH},r}();var WC=function(r){Ni(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 df,e}(Br);var qC=function(r){Ni(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Ae.COUNTER:case Ae.OBSERVABLE_COUNTER:case Ae.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Pd(!0),e.NON_MONOTONIC_INSTANCE=new Pd(!1),e}(Br);var KC=function(r){Ni(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 Ef,e}(Br);var YC=function(r){Ni(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 vd([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Br);var Fl=function(r){Ni(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 vd(this._boundaries,this._recordMinMax)},e}(Br);var XC=function(r){Ni(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 yf(this._maxSize,this._recordMinMax)},e}(Br);var JC=function(r){Ni(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Ae.COUNTER:case Ae.UP_DOWN_COUNTER:case Ae.OBSERVABLE_COUNTER:case Ae.OBSERVABLE_UP_DOWN_COUNTER:return ZC;case Ae.GAUGE:case Ae.OBSERVABLE_GAUGE:return ex;case Ae.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Fl(t.advice.explicitBucketBoundaries):tx}return V.warn("Unable to recognize instrument type: "+t.type),QC},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Br);var QC=new WC,ZC=new qC,ex=new KC,tx=new YC,AH=new XC,RH=new JC;var rx=function(r){return Br.Default()},nx=function(r){return Ha.CUMULATIVE};var Tf=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())})},bf=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}}},ox=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},wH=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))},ix=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:rx,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:nx,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 Tf(this,void 0,void 0,function(){var t,n,o,i,a,s;return bf(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(wH([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],ox(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=ox.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(uf(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(uf(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Tf(this,void 0,void 0,function(){return bf(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,Oo(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Tf(this,void 0,void 0,function(){return bf(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,Oo(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();je();var CH=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)}}(),Md=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())})},Od=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}}},xH=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},_H=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))},vf=function(r){CH(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 Md(this,void 0,void 0,function(){var t;return Od(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,Oo(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof cf?(V.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(_d(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Md(this,void 0,void 0,function(){var o,i,a,s,c,l;return Od(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,_H(["PeriodicExportingMetricReader: metrics collection errors"],xH(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),_d(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,$C._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==Ul.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),kl(this._interval)},e.prototype.onForceFlush=function(){return Md(this,void 0,void 0,function(){return Od(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 Md(this,void 0,void 0,function(){return Od(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}(ix);je();je();function Ld(){return"unknown_service:"+process.argv0}var No=function(){return No=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},No.apply(this,arguments)},IH=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())})},PH=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}}},MH=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},Nd=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[GC]=Ld(),e[Nl]=Oi[Nl],e[Ll]=Oi[Ll],e[Dl]=Oi[Dl],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 IH(this,void 0,void 0,function(){return PH(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=No(No({},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=MH(a,2),l=c[0],u=c[1];return No(No(No(No({},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 ax=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}();je();var Di=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)}}(),Dd=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=Da.active()),typeof e!="number"){V.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Er.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,Li(Date.now()))},r}();var sx=function(r){Di(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}(Dd);var lx=function(r){Di(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}(Dd);var cx=function(r){Di(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}(Dd);var ux=function(r){Di(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}(Dd);var kd=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 dx=function(r){Di(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(kd);var px=function(r){Di(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(kd);var mx=function(r){Di(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(kd);function Bl(r){return r instanceof kd}var gx=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=_n(e,Ae.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new cx(o,n)},r.prototype.createHistogram=function(e,t){var n=_n(e,Ae.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new ux(o,n)},r.prototype.createCounter=function(e,t){var n=_n(e,Ae.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new lx(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=_n(e,Ae.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new sx(o,n)},r.prototype.createObservableGauge=function(e,t){var n=_n(e,Ae.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new px(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=_n(e,Ae.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new dx(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=_n(e,Ae.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new mx(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 Ud=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=_n(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var OH=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)}}(),hx=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}}},LH=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 hx(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 hx(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 on=function(r){OH(e,r);function e(){return r.call(this,Td)||this}return e}(LH);var NH=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},Fd=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new on,this._cumulativeMemoStorage=new on,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Td(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=NH(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 on,e},r}();var Af=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.")},fx=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(){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===Ha.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=DH(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=Af(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 on,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Af(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=fx(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=Af(e.keys()),s=a.next();!s.done;s=a.next()){var c=fx(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 DH(r){return Array.from(r.entries())}var kH=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)}}(),UH=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},Sx=function(r){kH(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 Fd(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Bd(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new on;Array.from(t.entries()).forEach(function(a){var s=UH(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}(Ud);je();function Rf(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
48
+ ${C.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;P&&l.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${x}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:p.message}),p}let $=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:y,lastActionHint:T},`Generating new sub-command ${y} within AI action`);let G,F;try{({command:G,reasoning:F}=await i.promptToCommand({goal:m,history:f,startingScreenshot:h,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:T,langfuseSessionId:u})),d.info({command:G,reasoning:F},"Got proposed command")}finally{clearTimeout($)}if(G.type==="FAILURE")return clearTimeout($),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${F}`,p;let ne={id:wh(),type:"PRESET_ACTION",command:G},U={substepIndex:y+1,message:F||"Generated new command."};l.onDynamicCommandGenerated?.({...U,step:ne,parentStepId:e.id}),d.info({commandId:G.id},`Executing sub-command ${y} within AI step: ${vn(G)}`);let j=await t.startSubSteps(),W=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[ne],tracer:j}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let Qe=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(W),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Qe.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:vn(G),elementInteracted:W.results[0]?.elementInteracted,thoughts:F});let ke={substepIndex:y,output:{...W,message:W.message??"Successfully executed preset action."},step:ne,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(ke),await t.finish({output:Lc.parse(W),step:W,message:W.message,attempt:1}),W.status==="FAILED")if(p.status="FAILED",p.message=W.message,S<3)S++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${W.message}`;else return p;else if(W.status==="CANCELLED")return p.status="CANCELLED",p.message=W.message,p;y++}};import{randomUUID as oG}from"crypto";import qTe,{multistream as YTe}from"pino";import JTe from"pino-pretty";var ebe=5*1024,MB="...[truncated]",tbe=Buffer.byteLength(MB,"utf8");import{PostHog as OB}from"posthog-node";async function PR(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let s=await H(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=s.featureFlags||{},a=s.featureFlagPayloads||{};break}catch(s){t=s,n++,await new Promise(c=>setTimeout(c,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var Ju=class r extends Ys{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new OB("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await PR(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await PR(this.client,this.orgId);this.flags=t,this.payloads=n}};import{randomUUID as LB}from"node:crypto";import{PostHog as NB}from"posthog-node";var Qu=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new NB("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new r({...this.bindings,...e},this.options)}track(e,t){if(!pT(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:n,...o}=e;return this.client.capture({distinctId:LB(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};import{execSync as DB}from"child_process";import Oa from"os";import kB from"v8";var MR,Rn,OR=Oa.platform(),UB=Oa.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),{}),Zu=r=>{try{let e={},t=!1,n=FB(),o=BB(),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=kB.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"),gi&&E.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}},LR=r=>{Zu(r),setTimeout(()=>Zu(r),5e3)};function NR(r){if(!Or)return Zu(r),{interval:setInterval(()=>Zu(r),2e4),cpuMetadata:UB,platform:OR}}function FB(){let r=Oa.totalmem(),e=OR==="darwin"?zB():(()=>{let n=Oa.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function BB(){let r=Oa.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,!Rn)return Rn=t,null;let n={user:t.user-Rn.user,nice:t.nice-Rn.nice,sys:t.sys-Rn.sys,idle:t.idle-Rn.idle,irq:t.irq-Rn.irq,total:t.total-Rn.total};return MR={measurementTime:e,intervalMs:e-Rn.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},Rn=t,MR}function zB(){try{let r=DB("/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=Oa.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var ed=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function HB(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 td(r,e){let t=HB(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var sw="=",id=";",Uh=",";var lw=8192;var ka={};KM(ka,{getKeyPairs:()=>Tz,parseKeyPairsIntoRecord:()=>bz,parsePairKeyValue:()=>cw,serializeKeyPairs:()=>Ez});je();var yz=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 Ez(r){return r.reduce(function(e,t){var n=""+e+(e!==""?Uh:"")+t;return n.length>lw?e:n},"")}function Tz(r){return r.getAllEntries().map(function(e){var t=yz(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=id+o.metadata.toString()),i})}function cw(r){var e=r.split(id);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(sw);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=xh(e.join(id))),{key:o,value:i,metadata:a}}}}}function bz(r){return typeof r!="string"||r.length===0?{}:r.split(Uh).map(function(e){return cw(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}je();var ad;(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"})(ad||(ad={}));var vz=",",Az=["OTEL_SDK_DISABLED"];function Rz(r){return Az.indexOf(r)>-1}var wz=["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 Cz(r){return wz.indexOf(r)>-1}var xz=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function _z(r){return xz.indexOf(r)>-1}var Fh=1/0,Bh=128,Iz=128,Pz=128,zh={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:Je.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:Fh,OTEL_ATTRIBUTE_COUNT_LIMIT:Bh,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:Fh,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:Bh,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:Fh,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:Bh,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:Iz,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:Pz,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:ad.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 Mz(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function Oz(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 Lz(r,e,t,n){n===void 0&&(n=vz);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var Nz={ALL:Je.ALL,VERBOSE:Je.VERBOSE,DEBUG:Je.DEBUG,INFO:Je.INFO,WARN:Je.WARN,ERROR:Je.ERROR,NONE:Je.NONE};function Dz(r,e,t){var n=t[r];if(typeof n=="string"){var o=Nz[n.toUpperCase()];o!=null&&(e[r]=o)}}function uw(r){var e={};for(var t in zh){var n=t;switch(n){case"OTEL_LOG_LEVEL":Dz(n,e,r);break;default:if(Rz(n))Mz(n,e,r);else if(Cz(n))Oz(n,e,r);else if(_z(n))Lz(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Ut(){var r=uw(process.env);return Object.assign({},zh,r)}function dw(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function sd(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=dw(r.charCodeAt(n)),i=dw(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var pw="1.25.1";var kz="deployment.environment";var Uz="process.runtime.name";var Fz="service.name";var Bz="service.instance.id";var zz="telemetry.sdk.name",Hz="telemetry.sdk.language",Gz="telemetry.sdk.version";var mw=kz;var gw=Uz;var ld=Fz;var hw=Bz;var Al=zz,Rl=Hz,wl=Gz;var jz="nodejs";var fw=jz;var Ua,cd=(Ua={},Ua[Al]="opentelemetry",Ua[gw]="node",Ua[Rl]=fw,Ua[wl]=pw,Ua);var Vz=9,$z=6,Wz=Math.pow(10,$z),qz=Math.pow(10,Vz);function Sw(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*Wz);return[t,n]}function yw(r){return r[0]*qz+r[1]}function Cl(r){return r[0]*1e6+r[1]/1e3}var Ii;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Ii||(Ii={}));var Ew=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 Kz=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},Yz=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))},Tw=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new Ew}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,Yz([this._that],Kz(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 kr;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(kr||(kr={}));var Kt;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Kt||(Kt={}));var Xz=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 DAe=function(r){Xz(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function bw(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}je();var Ur;(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"})(Ur||(Ur={}));var vw=function(){function r(){this.kind=Ur.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var me;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(me||(me={}));var Jz=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 Qz(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 Hh=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=Qz(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=bw(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 Gh=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Ur.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Hh(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 Hh(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 Hh(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:Kt.HISTOGRAM,dataPoints:n.map(function(i){var a=Jz(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();je();var jh=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},Vh=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))},$h=function(){function r(e,t,n,o){e===void 0&&(e=new Zz),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 Zz=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,Vh([n,this._counts.length-t],jh(this._counts.slice(t)),!1)),o.splice.apply(o,Vh([0,t],jh(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(Vh([],jh(this._counts),!1))},r}();var Aw=52,eH=2146435072,tH=1048575,Wh=1023,ud=-Wh+1,dd=Wh,xl=Math.pow(2,-1022);function pd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&eH)>>20;return n-Wh}function md(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&tH)*Math.pow(2,32);return o+n}function _l(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function ww(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var rH=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)}}(),Io=function(r){rH(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var xw=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<xl)return this._minNormalLowerBoundaryIndex();var t=pd(e),n=this._rightShift(md(e)-1,Aw);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Io("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Io("overflow: "+e+" is > maximum lower boundary: "+n);return _l(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=ud>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return dd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var _w=function(){function r(e){this._scale=e,this._scaleFactor=_l(Math.LOG2E,e),this._inverseFactor=_l(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=xl)return this._minNormalLowerBoundaryIndex()-1;if(md(e)===0){var t=pd(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 Io("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return xl;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Io("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 ud<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(dd+1<<this._scale)-1},r}();var Iw=-10,Pw=20,nH=Array.from({length:31},function(r,e){return e>10?new _w(e-10):new xw(e-10)});function qh(r){if(r>Pw||r<Iw)throw new Io("expected scale >= "+Iw+" && <= "+Pw+", got: "+r);return nH[r+10]}var oH=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},gd=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}(),iH=20,aH=160,Kh=2,sH=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=aH),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 $h),u===void 0&&(u=new $h),d===void 0&&(d=qh(iH)),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<Kh&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Kh),this._maxSize=Kh)}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=ww(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=qh(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=gd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=gd.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 gd(0,-1);var o=t-n;return new gd(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 Mw=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Ur.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new sH(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:Kt.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=oH(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var lH=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},Yh=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=Sw(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ow=function(){function r(){this.kind=Ur.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Yh(e)},r.prototype.merge=function(e,t){var n=Cl(t.sampleTime)>=Cl(e.sampleTime)?t:e;return new Yh(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=Cl(t.sampleTime)>=Cl(e.sampleTime)?t:e;return new Yh(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Kt.GAUGE,dataPoints:n.map(function(i){var a=lH(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var cH=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},Il=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 Xh=function(){function r(e){this.monotonic=e,this.kind=Ur.SUM}return r.prototype.createAccumulation=function(e){return new Il(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Il(t.startTime,this.monotonic,o,t.reset):new Il(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 Il(t.startTime,this.monotonic,o,!0):new Il(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Kt.SUM,dataPoints:n.map(function(i){var a=cH(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Pi=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)}}(),Cn=function(){function r(){}return r.Drop=function(){return zw},r.Sum=function(){return Hw},r.LastValue=function(){return Gw},r.Histogram=function(){return jw},r.ExponentialHistogram=function(){return uH},r.Default=function(){return dH},r}();var Lw=function(r){Pi(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 vw,e}(Cn);var Nw=function(r){Pi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Xh(!0),e.NON_MONOTONIC_INSTANCE=new Xh(!1),e}(Cn);var Dw=function(r){Pi(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 Ow,e}(Cn);var kw=function(r){Pi(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 Gh([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Cn);var Uw=function(r){Pi(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 Gh(this._boundaries,this._recordMinMax)},e}(Cn);var Fw=function(r){Pi(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 Mw(this._maxSize,this._recordMinMax)},e}(Cn);var Bw=function(r){Pi(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case me.COUNTER:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return Hw;case me.GAUGE:case me.OBSERVABLE_GAUGE:return Gw;case me.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Uw(t.advice.explicitBucketBoundaries):jw}return V.warn("Unable to recognize instrument type: "+t.type),zw},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Cn);var zw=new Lw,Hw=new Nw,Gw=new Dw,jw=new kw,uH=new Fw,dH=new Bw;je();function hd(){return"unknown_service:"+process.argv0}var Po=function(){return Po=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},Po.apply(this,arguments)},pH=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())})},mH=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}}},gH=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},Jh=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[ld]=hd(),e[Rl]=cd[Rl],e[Al]=cd[Al],e[wl]=cd[wl],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 pH(this,void 0,void 0,function(){return mH(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=Po(Po({},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=gH(a,2),l=c[0],u=c[1];return Po(Po(Po(Po({},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 Mi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Mi||(Mi={}));je();var hH=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())})},fH=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}}},Qh=function(){return kr.CUMULATIVE},Vw=function(r){switch(r){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.GAUGE:case me.HISTOGRAM:case me.OBSERVABLE_GAUGE:return kr.DELTA;case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return kr.CUMULATIVE}},$w=function(r){switch(r){case me.COUNTER:case me.HISTOGRAM:return kr.DELTA;case me.GAUGE:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_GAUGE:return kr.CUMULATIVE}};function SH(){var r=Ut(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Qh:e==="delta"?Vw:e==="lowmemory"?$w:(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."),Qh)}function yH(r){return r!=null?r===Mi.DELTA?Vw:r===Mi.LOWMEMORY?$w:Qh:SH()}function EH(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Cn.Default()}}var Ww=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=EH(t),this._aggregationTemporalitySelector=yH(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return hH(this,void 0,void 0,function(){return fH(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}();je();je();var TH=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},qw=1e4,Kw=5,Yw=1e3,Xw=5e3,Jw=1.5;function Pl(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=TH(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 Zh(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function ef(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 tf(r){return typeof r=="number"?r<=0?rf(r,qw):r:bH()}function bH(){var r,e=Number((r=Ut().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Ut().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?rf(e,qw):e}function rf(r,e){return V.warn("Timeout must be greater than 0",r),e}function Qw(r){var e=[429,502,503,504];return e.includes(r)}function Zw(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 eC=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 Tw(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=tf(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:Ii.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:Ii.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:Ii.SUCCESS})}).catch(function(n){t({code:Ii.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}();je();import*as nf from"url";import*as Sd from"http";import*as yd from"https";import*as tC from"zlib";import{Readable as AH}from"stream";var Mo;(function(r){r.NONE="none",r.GZIP="gzip"})(Mo||(Mo={}));var vH=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)}}(),Fa=function(r){vH(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 fd=function(){return fd=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},fd.apply(this,arguments)};function of(r,e,t,n,o){var i=r.timeoutMillis,a=new nf.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 Fa("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:fd({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?Sd.request:yd.request,g=function(h,f){switch(h===void 0&&(h=Kw),f===void 0&&(f=Yw),l=m(p,function(S){var T="";S.on("data",function(b){return T+=b}),S.on("aborted",function(){if(u){var b=new Fa("Request Timeout");o(b)}}),S.on("end",function(){if(u===!1)if(S.statusCode&&S.statusCode<299)V.debug("statusCode: "+S.statusCode,T),n(),clearTimeout(d),clearTimeout(c);else if(S.statusCode&&Qw(S.statusCode)&&h>0){var b=void 0;f=Jw*f,S.headers["retry-after"]?b=Zw(S.headers["retry-after"]):b=Math.round(Math.random()*(Xw-f)+f),c=setTimeout(function(){g(h-1,f)},b)}else{var R=new Fa(S.statusMessage,S.statusCode,T);o(R),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(S){if(u){var T=new Fa("Request Timeout",S.code);o(T)}else o(S);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var S=new Fa("Request Timeout");o(S)}clearTimeout(d),clearTimeout(c)}),r.compression){case Mo.GZIP:{l.setHeader("Content-Encoding","gzip");var y=RH(e);y.on("error",o).pipe(tC.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function RH(r){var e=new AH;return e.push(r),e.push(null),e}function af(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 nf.URL(r.url),t=e.protocol==="http:"?Sd.Agent:yd.Agent;return new t(fd({keepAlive:!0},r.httpAgentOptions))}catch(n){V.error("collector exporter failed to create http agent. err: "+n.message);return}}function sf(r){if(r)return r;var e=Ut().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Ut().OTEL_EXPORTER_OTLP_COMPRESSION;return e===Mo.GZIP?Mo.GZIP:Mo.NONE}je();var wH=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)}}(),Ed=function(r){wH(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,Pl(t.headers),ka.parseKeyPairsIntoRecord(Ut().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=af(t),i.compression=sf(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;of(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}(eC);function nC(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function CH(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function oC(r){var e=nC(r);return CH(e)}function xH(r){var e=nC(r);return e.toString()}var _H=typeof BigInt<"u"?xH:yw;function rC(r){return r}function iC(r){if(r!==void 0)return sd(r)}var IH={encodeHrTime:oC,encodeSpanContext:sd,encodeOptionalSpanContext:iC};function aC(r){var e,t;if(r===void 0)return IH;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?oC:_H,encodeSpanContext:o?rC:sd,encodeOptionalSpanContext:o?rC:iC}}var PH=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 sC(r){return{name:r.name,version:r.version}}function Ba(r){return Object.keys(r).map(function(e){return lC(e,r[e])})}function lC(r,e){return{key:r,value:cC(e)}}function cC(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(cC)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=PH(t,2),o=n[0],i=n[1];return lC(o,i)})}}:{}}function uC(r){return{attributes:Ba(r.attributes),droppedAttributesCount:0}}je();function pC(r,e){var t=aC(e);return{resource:uC(r.resource),schemaUrl:void 0,scopeMetrics:MH(r.scopeMetrics,t)}}function MH(r,e){return Array.from(r.map(function(t){return{scope:sC(t.scope),metrics:t.metrics.map(function(n){return OH(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function OH(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=kH(r.aggregationTemporality);switch(r.dataPointType){case Kt.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:dC(r,e)};break;case Kt.GAUGE:t.gauge={dataPoints:dC(r,e)};break;case Kt.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:NH(r,e)};break;case Kt.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:DH(r,e)};break}return t}function LH(r,e,t){var n={attributes:Ba(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Er.INT:n.asInt=r.value;break;case Er.DOUBLE:n.asDouble=r.value;break}return n}function dC(r,e){return r.dataPoints.map(function(t){return LH(t,r.descriptor.valueType,e)})}function NH(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ba(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 DH(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ba(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 kH(r){switch(r){case kr.DELTA:return 1;case kr.CUMULATIVE:return 2}}function mC(r,e){return{resourceMetrics:r.map(function(t){return pC(t,e)})}}var lf={serializeRequest:function(r){var e=mC(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 gC="0.52.1";var hC=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)}}(),za=function(){return za=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},za.apply(this,arguments)},fC="v1/metrics",UH="http://localhost:4318/"+fC,FH={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+gC},BH=function(r){hC(e,r);function e(t){var n=r.call(this,t,lf,"application/json")||this;return n.headers=za(za(za(za({},n.headers),FH),ka.parseKeyPairsIntoRecord(Ut().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),Pl(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Ut().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?ef(Ut().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Ut().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?Zh(Ut().OTEL_EXPORTER_OTLP_ENDPOINT,fC):UH},e}(Ed),SC=function(r){hC(e,r);function e(t){return r.call(this,new BH(t),t)||this}return e}(Ww);var Ha;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Ha||(Ha={}));var xn;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(xn||(xn={}));je();var zH=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)}}(),yC=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())})},EC=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}}},HH=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},GH=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))},jH=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 TC(r){return r!=null}function Td(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function bC(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var cf=function(r){zH(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Oo(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new cf("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function vC(r){return yC(this,void 0,void 0,function(){var e=this;return EC(this,function(t){return[2,Promise.all(r.map(function(n){return yC(e,void 0,void 0,function(){var o,i;return EC(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 AC(r){return r.status==="rejected"}function uf(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,GH([],HH(e(n)),!1))}),t}function RC(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=jH(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 wC(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 CC(r,e){return r.toLowerCase()===e.toLowerCase()}je();var Fr;(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"})(Fr||(Fr={}));var df=function(){function r(){this.kind=Fr.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}();je();var Ae;(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"})(Ae||(Ae={}));function _n(r,e,t){var n,o,i,a;return $H(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:Er.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function xC(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 _C(r,e){return CC(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var VH=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function $H(r){return r.match(VH)!=null}var WH=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 qH(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 bd=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=qH(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=wC(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 vd=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=Fr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new bd(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 bd(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 bd(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:xn.HISTOGRAM,dataPoints:n.map(function(i){var a=WH(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ae.GAUGE||e.type===Ae.UP_DOWN_COUNTER||e.type===Ae.OBSERVABLE_GAUGE||e.type===Ae.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}();je();var pf=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mf=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))},gf=function(){function r(e,t,n,o){e===void 0&&(e=new KH),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 KH=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,mf([n,this._counts.length-t],pf(this._counts.slice(t)),!1)),o.splice.apply(o,mf([0,t],pf(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(mf([],pf(this._counts),!1))},r}();var IC=52,YH=2146435072,XH=1048575,hf=1023,Ad=-hf+1,Rd=hf,Ml=Math.pow(2,-1022);function wd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&YH)>>20;return n-hf}function Cd(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&XH)*Math.pow(2,32);return o+n}function Ol(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function MC(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var JH=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)}}(),Lo=function(r){JH(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var LC=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Ml)return this._minNormalLowerBoundaryIndex();var t=wd(e),n=this._rightShift(Cd(e)-1,IC);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Lo("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Lo("overflow: "+e+" is > maximum lower boundary: "+n);return Ol(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=Ad>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Rd>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var NC=function(){function r(e){this._scale=e,this._scaleFactor=Ol(Math.LOG2E,e),this._inverseFactor=Ol(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Ml)return this._minNormalLowerBoundaryIndex()-1;if(Cd(e)===0){var t=wd(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 Lo("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Ml;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Lo("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 Ad<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Rd+1<<this._scale)-1},r}();var DC=-10,kC=20,QH=Array.from({length:31},function(r,e){return e>10?new NC(e-10):new LC(e-10)});function ff(r){if(r>kC||r<DC)throw new Lo("expected scale >= "+DC+" && <= "+kC+", got: "+r);return QH[r+10]}var ZH=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},xd=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}(),e1=20,t1=160,Sf=2,UC=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=t1),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 gf),u===void 0&&(u=new gf),d===void 0&&(d=ff(e1)),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<Sf&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Sf),this._maxSize=Sf)}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=MC(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=ff(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=xd.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=xd.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 xd(0,-1);var o=t-n;return new xd(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 yf=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=Fr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new UC(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:xn.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=ZH(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ae.GAUGE||e.type===Ae.UP_DOWN_COUNTER||e.type===Ae.OBSERVABLE_GAUGE||e.type===Ae.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}();je();var r1=_h("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function FC(r){return r.setValue(r1,!0)}je();function BC(){return function(r){V.error(n1(r))}}function n1(r){return typeof r=="string"?r:JSON.stringify(o1(r))}function o1(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 i1=BC();function _d(r){try{i1(r)}catch{}}var zC="1.30.1";var a1="process.runtime.name";var s1="service.name";var l1="telemetry.sdk.name",c1="telemetry.sdk.language",u1="telemetry.sdk.version";var HC=a1;var GC=s1;var Ll=l1,Nl=c1,Dl=u1;var d1="nodejs";var jC=d1;var Ga,Oi=(Ga={},Ga[Ll]="opentelemetry",Ga[HC]="node",Ga[Nl]=jC,Ga[Dl]=zC,Ga);function kl(r){r.unref()}var y1=9,E1=6,T1=Math.pow(10,E1),BCe=Math.pow(10,y1);function Li(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*T1);return[t,n]}function ja(r){return r[0]*1e6+r[1]/1e3}var Ul;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Ul||(Ul={}));je();function VC(r,e){return new Promise(function(t){Da.with(FC(Da.active()),function(){r.export(e,function(n){t(n)})})})}var $C={_export:VC};var b1=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},Id=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=Li(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ef=function(){function r(){this.kind=Fr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Id(e)},r.prototype.merge=function(e,t){var n=ja(t.sampleTime)>=ja(e.sampleTime)?t:e;return new Id(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=ja(t.sampleTime)>=ja(e.sampleTime)?t:e;return new Id(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.GAUGE,dataPoints:n.map(function(i){var a=b1(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var v1=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},Va=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 Pd=function(){function r(e){this.monotonic=e,this.kind=Fr.SUM}return r.prototype.createAccumulation=function(e){return new Va(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Va(t.startTime,this.monotonic,o,t.reset):new Va(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 Va(t.startTime,this.monotonic,o,!0):new Va(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:xn.SUM,dataPoints:n.map(function(i){var a=v1(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Ni=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)}}(),Br=function(){function r(){}return r.Drop=function(){return QC},r.Sum=function(){return ZC},r.LastValue=function(){return ex},r.Histogram=function(){return tx},r.ExponentialHistogram=function(){return A1},r.Default=function(){return R1},r}();var WC=function(r){Ni(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 df,e}(Br);var qC=function(r){Ni(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Ae.COUNTER:case Ae.OBSERVABLE_COUNTER:case Ae.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Pd(!0),e.NON_MONOTONIC_INSTANCE=new Pd(!1),e}(Br);var KC=function(r){Ni(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 Ef,e}(Br);var YC=function(r){Ni(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 vd([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Br);var Fl=function(r){Ni(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 vd(this._boundaries,this._recordMinMax)},e}(Br);var XC=function(r){Ni(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 yf(this._maxSize,this._recordMinMax)},e}(Br);var JC=function(r){Ni(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Ae.COUNTER:case Ae.UP_DOWN_COUNTER:case Ae.OBSERVABLE_COUNTER:case Ae.OBSERVABLE_UP_DOWN_COUNTER:return ZC;case Ae.GAUGE:case Ae.OBSERVABLE_GAUGE:return ex;case Ae.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Fl(t.advice.explicitBucketBoundaries):tx}return V.warn("Unable to recognize instrument type: "+t.type),QC},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Br);var QC=new WC,ZC=new qC,ex=new KC,tx=new YC,A1=new XC,R1=new JC;var rx=function(r){return Br.Default()},nx=function(r){return Ha.CUMULATIVE};var Tf=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())})},bf=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}}},ox=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},w1=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))},ix=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:rx,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:nx,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 Tf(this,void 0,void 0,function(){var t,n,o,i,a,s;return bf(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(w1([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],ox(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=ox.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(uf(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(uf(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Tf(this,void 0,void 0,function(){return bf(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,Oo(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Tf(this,void 0,void 0,function(){return bf(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,Oo(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();je();var C1=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)}}(),Md=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())})},Od=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}}},x1=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},_1=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))},vf=function(r){C1(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 Md(this,void 0,void 0,function(){var t;return Od(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,Oo(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof cf?(V.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(_d(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Md(this,void 0,void 0,function(){var o,i,a,s,c,l;return Od(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,_1(["PeriodicExportingMetricReader: metrics collection errors"],x1(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),_d(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,$C._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==Ul.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),kl(this._interval)},e.prototype.onForceFlush=function(){return Md(this,void 0,void 0,function(){return Od(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 Md(this,void 0,void 0,function(){return Od(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}(ix);je();je();function Ld(){return"unknown_service:"+process.argv0}var No=function(){return No=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},No.apply(this,arguments)},I1=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())})},P1=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}}},M1=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},Nd=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[GC]=Ld(),e[Nl]=Oi[Nl],e[Ll]=Oi[Ll],e[Dl]=Oi[Dl],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 I1(this,void 0,void 0,function(){return P1(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=No(No({},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=M1(a,2),l=c[0],u=c[1];return No(No(No(No({},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 ax=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}();je();var Di=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)}}(),Dd=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=Da.active()),typeof e!="number"){V.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Er.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,Li(Date.now()))},r}();var sx=function(r){Di(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}(Dd);var lx=function(r){Di(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}(Dd);var cx=function(r){Di(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}(Dd);var ux=function(r){Di(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}(Dd);var kd=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 dx=function(r){Di(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(kd);var px=function(r){Di(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(kd);var mx=function(r){Di(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(kd);function Bl(r){return r instanceof kd}var gx=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=_n(e,Ae.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new cx(o,n)},r.prototype.createHistogram=function(e,t){var n=_n(e,Ae.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new ux(o,n)},r.prototype.createCounter=function(e,t){var n=_n(e,Ae.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new lx(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=_n(e,Ae.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new sx(o,n)},r.prototype.createObservableGauge=function(e,t){var n=_n(e,Ae.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new px(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=_n(e,Ae.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new dx(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=_n(e,Ae.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new mx(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 Ud=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=_n(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var O1=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)}}(),hx=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}}},L1=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 hx(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 hx(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 on=function(r){O1(e,r);function e(){return r.call(this,Td)||this}return e}(L1);var N1=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},Fd=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new on,this._cumulativeMemoStorage=new on,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Td(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=N1(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 on,e},r}();var Af=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.")},fx=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(){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===Ha.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=D1(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=Af(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 on,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Af(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=fx(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=Af(e.keys()),s=a.next();!s.done;s=a.next()){var c=fx(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 D1(r){return Array.from(r.entries())}var k1=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)}}(),U1=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},Sx=function(r){k1(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 Fd(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Bd(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new on;Array.from(t.entries()).forEach(function(a){var s=U1(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}(Ud);je();function Rf(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
49
49
  `),r.type!==e.type&&(t+=" - Type '"+r.type+"' does not match '"+e.type+`'
50
50
  `),r.valueType!==e.valueType&&(t+=" - Value Type '"+r.valueType+"' does not match '"+e.valueType+`'
51
51
  `),r.description!==e.description&&(t+=" - Description '"+r.description+"' does not match '"+e.description+`'
52
- `),t}function FH(r,e){return" - use valueType '"+r.valueType+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function BH(r,e){return" - use unit '"+r.unit+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function zH(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 HH(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+`'
52
+ `),t}function F1(r,e){return" - use valueType '"+r.valueType+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function B1(r,e){return" - use unit '"+r.unit+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function z1(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 H1(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+`'
53
53
  - OR - create a new view with the name `+r.name+" and description '"+r.description+"' and InstrumentSelector "+n+`
54
- - OR - create a new view with the name `+e.name+" and description '"+r.description+"' and InstrumentSelector "+n}function wf(r,e){return r.valueType!==e.valueType?FH(r,e):r.unit!==e.unit?BH(r,e):r.type!==e.type?zH(r,e):r.description!==e.description?HH(r,e):""}var Cf=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.")},yx=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=Cf(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=Cf(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=Cf(t),s=a.next();!s.done;s=a.next()){var c=s.value,l=c.getInstrumentDescriptor();_C(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.
54
+ - OR - create a new view with the name `+e.name+" and description '"+r.description+"' and InstrumentSelector "+n}function wf(r,e){return r.valueType!==e.valueType?F1(r,e):r.unit!==e.unit?B1(r,e):r.type!==e.type?z1(r,e):r.description!==e.description?H1(r,e):""}var Cf=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.")},yx=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=Cf(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=Cf(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=Cf(t),s=a.next();!s.done;s=a.next()){var c=s.value,l=c.getInstrumentDescriptor();_C(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.
55
55
  `,`Details:
56
56
  `,Rf(l,e),`The longer description will be used.
57
57
  To resolve the conflict:`,wf(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.
58
58
  `,`Details:
59
59
  `,Rf(l,e),`To resolve the conflict:
60
- `,wf(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 Ex=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}();je();je();var Tx=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new on}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===Er.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 bx=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!Bl(e)){var o=this._buffer.get(e);if(o==null&&(o=new on,this._buffer.set(e,o)),typeof t!="number"){V.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Er.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 xf=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())})},_f=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}}},vx=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},Ax=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))},Rx=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(Bl));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(Bl)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return xf(this,void 0,void 0,function(){var n,o,i,a;return _f(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,vC(Ax(Ax([],vx(n),!1),vx(o),!1))];case 1:return i=s.sent(),a=i.filter(AC).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 xf(n,void 0,void 0,function(){var s,c;return _f(this,function(l){switch(l.label){case 0:return s=new Tx(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=Oo(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 xf(n,void 0,void 0,function(){var s,c;return _f(this,function(l){switch(l.label){case 0:return s=new bx,c=Promise.resolve(i(s)),t!=null&&(c=Oo(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&&RC(n.instruments,t)})},r}();var GH=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)}}(),wx=function(r){GH(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 Fd(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Bd(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}(Ud);var Cx=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)}}(),$a=function(){function r(){}return r.Noop=function(){return VH},r}();var jH=function(r){Cx(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}($a);var xx=function(r){Cx(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}($a);var VH=new jH;var $H=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())})},WH=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}}},qH=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},_x=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new yx,this.observableRegistry=new Rx,this.meter=new gx(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,wx);return t.length===1?t[0]:new Ex(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,Sx);return t},r.prototype.collect=function(e,t,n){return $H(this,void 0,void 0,function(){var o,i,a;return WH(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(TC),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=xC(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=qH(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,$a.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var KH=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.")},Ix=function(){function r(e){this.resource=e,this.viewRegistry=new ax,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=bC(e),n=this.meterSharedStates.get(t);return n==null&&(n=new _x(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=KH(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 zd=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())})},Hd=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}}},YH=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},XH=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))},Px=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return zd(this,void 0,void 0,function(){var t,n,o,i,a=this;return Hd(this,function(s){switch(s.label){case 0:return t=Li(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return zd(a,void 0,void 0,function(){var l;return Hd(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,XH([],YH(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 zd(this,void 0,void 0,function(){return Hd(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 zd(this,void 0,void 0,function(){return Hd(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 Mx=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())})},Ox=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}}},Lx=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 JH(r,e){var t=e??Nd.empty();return r?Nd.default().merge(t):t}var If=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new Ix(JH((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=Lx(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=Lx(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"),Lh()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new Px(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return Mx(this,void 0,void 0,function(){return Ox(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 Mx(this,void 0,void 0,function(){return Ox(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 QH=/[\^$\\.+?()[\]{}|]/g,Gd=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(QH,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Wa=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 Nx=function(){function r(e){var t;this._nameFilter=new Gd((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Wa(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 Dx=function(){function r(e){this._nameFilter=new Wa(e?.name),this._versionFilter=new Wa(e?.version),this._schemaUrlFilter=new Wa(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 ZH(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var jd=function(){function r(e){var t;if(ZH(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Gd.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 xx(e.attributeKeys):this.attributesProcessor=$a.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:Br.Default(),this.instrumentSelector=new Nx({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new Dx({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var TIe=process.env.APP||"unknown";je();import{v4 as eG}from"uuid";function tG(){return new SC({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Mi.DELTA})}var rG=[new jd({instrumentName:"test_event_duration",instrumentType:Ae.HISTOGRAM,aggregation:new Fl([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new jd({instrumentName:"test_step_duration",instrumentType:Ae.HISTOGRAM,aggregation:new Fl([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],Vd=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 Jh({[ld]:e.serviceName,[mw]:t,[hw]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:eG()}),o=tG(),i=new vf({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new If({resource:n,readers:[i],views:rG}),od.setGlobalMeterProvider(this.provider),this.meter=od.getMeter("momentic-serverless")}increment(e,t,n){try{let o=td(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=td(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 Yt=new ed;function kx(r){r.disabled||(Yt=new Vd(r))}var iG=3;async function Ux(r){let{logger:e}=r.fixtures,{results:t}=r.failureRecoveryParams,n=t[t.length-1],o=sG(r.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),r.work.state.failureRecoveryAttempts=(r.work.state.failureRecoveryAttempts??0)+1;try{return await aG(r)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function aG(r){let{fixtures:e,work:t,failureRecoveryParams:n}=r,{controller:o,logger:i}=e,{testMetadata:a}=r.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:g}=await ba(i,u,s,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),h=l.map(I=>Ao(I)),f=a?.description?.trim(),y=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:S,thoughts:T,instructions:b}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:g,currentPageState:m,nextStepsSerialized:h,testDescription:f||void 0,customInstructions:y||void 0});if(S!=="RECOVERABLE")return i.info({scenario:S,thoughts:T,instructions:b},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${T}`};if(!b)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let R={id:oG(),type:"AI_ACTION_DYNAMIC",text:b},C=await Ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures},listParams:{steps:[R,c],containerName:"AI-recovered step list",tracer:u}})),x=C.results[0];if(x&&x.type==="AI_ACTION_DYNAMIC")if(fu({results:C.results,onPresetAction:I=>{I.aiSuggested=!0},onSimpleStepContainer:I=>{I.aiSuggested=!0}}),C.status==="SUCCESS"){let I=`The following steps were automatically executed by the failure recovery agent. Analysis: ${T}`;return x.message=I,Yt.increment("test_event",1,["name:failure_recovery_success",`orgId:${r.inputs.orgId}`]),i.info({thoughts:T},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:C,message:I}}else{Yt.increment("test_event",1,["name:failure_recovery_failure",`orgId:${r.inputs.orgId}`]);let I=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${T}`;return x.message=I,i.info({thoughts:T,aiActionResult:x},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:C,message:I}}return null}function sG(r,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let t=e.message;return t?t.includes("AbortError:")?"The user aborted the test":sE.some(n=>t.includes(n))?"The failed step is an irrecoverable configuration error":(r.state.failureRecoveryAttempts??0)>iG?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as $d}from"crypto";import lG from"fast-json-patch";import{cloneDeep as cG}from"lodash-es";async function Fx(r){let e=r.failedResults,t=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=r,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},g=p?.attempts??1;for(let h=0;h<g;h++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=cG(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:y}=await ba(d,c,e.results,{numStepsWithScreenshots:4}),S=await u.runSectionAutohealing({results:y,errorMessage:e.terminalResult?.message,goal:l.description});f=lG.applyPatch(f,S.patches).newDocument;let T=tr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await uG({logger:d,controller:u,tracer:c,context:T,restartConfig:m,startingUrl:a});let b=await Ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures,context:T},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(t.push(b.results),b.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:b,context:T},healingAttempts:t};e=b}return{healingAttempts:t}}async function uG({logger:r,controller:e,tracer:t,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:$d(),type:"PRESET_ACTION",command:{id:$d(),type:"NAVIGATE",url:n.url}},s=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:$d(),type:"PRESET_ACTION",command:{id:$d(),type:"NAVIGATE",url:i}},s=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function Bx(r,e){switch(r||(r="ON_FAILURE"),r){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Cy(e.command.type))}}async function zx(r){let{step:e,tracer:t}=r.sectionParams,{logger:n,controller:o,context:i}=r.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await t.startSubSteps(),u=async()=>r.executeStepList({...r,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await Ma(r.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!r.work.state.autoHealingDisabled&&Bx(e.autohealingConfig.trigger,d.terminalResult)){let h=await t.startSubSteps(),f=await Fx({...r,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:h});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,r.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let g={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return nn({asyncTasks:r.work.asyncTasks,nestedResults:d.results,result:g,logger:n}),g}var pG=60*60*1e3;async function an(r){let{results:e=[],containerName:t,steps:n,tracer:o}=r.listParams,{logger:i}=r.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=r.inputs,l=r.work,u="SUCCESS",d,p=0;for(p;p<n.length;p++){let m=n[p];if(m.skipped)continue;if(l.fastForwardingToStep&&s){let T=JSON.stringify(a);if(m.id===s.fromStepId&&T===JSON.stringify(s.parentStepIdChain))l.fastForwardingToStep=!1;else if(!Pv(m,a,s.fromStepId,s.parentStepIdChain))continue}let g=Ao(m),h=0,f=1,y=Date.now();"retries"in m&&m.retries&&m.retries>0&&(f+=m.retries);let S;for(;h<f&&Date.now()-y<pG;){h++,i.info({step:m,currentAttempt:h},`Executing step ${p+1}/${n.length} in ${t}: ${g}`);let T=Date.now(),{stepResult:b,status:R,failureRecoveryResults:C,shouldStopExecuting:x}=await mG({attempt:h,params:r,step:m,i:p,steps:n,results:e,currentParentIdChain:a,work:l,fromStep:s,toStep:c,lastRetry:h===f});if(R==="FAILED"&&h<f){S=[...S??[],b],Date.now()-T<1e3&&await ie(1e3-(Date.now()-T));continue}else e.push(b),S&&(b.previousAttempts=S);if(C&&e.push(...C),x)return u=R,d=b,{status:u,results:e,terminalResult:d};break}}return{status:u,results:e,terminalResult:d}}async function mG({attempt:r,params:e,step:t,i:n,steps:o,results:i,currentParentIdChain:a,work:s,fromStep:c,toStep:l,lastRetry:u}){let{tracer:d}=e.listParams,{logger:p,context:m,controller:g,codeEvalTools:h,usageTracker:f}=e.fixtures,{orgId:y}=e.inputs,S=new Date,T=await d.startStep({logger:p,step:t,attempt:r}),b=dG(t),R=m.toRedactedDisplayCopy(),C=g.browser.url(),x=g.executeAbortController.signal;f.trackStepExecution(t);let I,P;switch(t.type){case"PRESET_ACTION":{I="Preset action",P=await xi(t,async()=>await Xu({...e,presetParams:{tracer:T,step:t}}),x);break}case"AI_ACTION":{I="AI action",P=await xi(t,()=>xR({...e,aiStepParams:{step:t,tracer:T},executeStepList:an}),x);break}case"AI_ACTION_DYNAMIC":{I="AI action",P=await xi(t,()=>IR({...e,aiStepParams:{step:t,tracer:T},executeStepList:an}),x);break}case"RESOLVED_MODULE":{I=`Module (${t.name})`,P=await xi(t,async()=>{let U=await vR({orgId:y,step:t,context:m,logger:p,codeEvalTools:h,signal:x});return Rh({...e,executeStepList:an,moduleParams:{step:t,resolvedInputs:U,tracer:T}})},x);break}case"CONDITIONAL":{I="Conditional step",P=await xi(t,()=>wR({...e,conditionalParams:{step:t,tracer:T},executeStepList:an}),x);break}case"SECTION":{I="Section",P=await xi(t,()=>zx({...e,sectionParams:{step:t,tracer:T},executeStepList:an}),x);break}default:return(j=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}P.beforeUrl=P.beforeUrl??C,P.beforeTestContext=R,t.envKey&&m.setVariable(t.envKey,P.data);let $=g.browser.url();m.setCurrentUrl($),P.afterUrl=P.afterUrl??$,P.afterTestContext=m.toRedactedDisplayCopy(),await gG({step:t,startedAt:S,stepTypeName:I,result:P,callbacks:e.callbacks,globalWorkRef:e.work,tracer:T,attempt:r});let G,F;if(u&&P.status==="FAILED"&&!s.state.failureRecoveryDisabled&&c?.fromStepId===void 0&&l?.toStepId===void 0){let U=await Ux({...e,executeStepList:an,failureRecoveryParams:{failedStep:b,nextSteps:o.slice(n+1),results:i.concat(P),tracer:d}});U&&(U.type==="ATTEMPTED"?(G=U.result.results,F=U.status):U.type==="NOT_ELIGIBLE"&&(P.message=P.message?`${P.message} ${U.message}`:U.message),P.type==="PRESET_ACTION"&&(P.failureRecoveryStatus={type:U.type,message:U.message}))}return s.fastForwardingToStep&&c&&(c.fromStepId===t.id&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)&&(s.fastForwardingToStep=!1),t.type==="RESOLVED_MODULE"&&Vg(a,c.parentStepIdChain)&&(s.fastForwardingToStep=!1)),P.status!=="SUCCESS"&&F!=="SUCCESS"||g.closed?{shouldStopExecuting:!0,status:P.status,stepResult:P,failureRecoveryResults:G}:l&&t.id===l.toStepId&&JSON.stringify(a)===JSON.stringify(l.parentStepIdChain)?(g.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:P,failureRecoveryResults:G}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:P,failureRecoveryResults:G}}async function gG({stepTypeName:r,step:e,result:t,tracer:n,attempt:o,startedAt:i}){let a=r.toLowerCase(),s=r.charAt(0).toUpperCase()+r.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(t.status){case"SUCCESS":c=t.message??`${s} executed successfully.`;break;case"FAILED":c=t.message??`${s} failed.`;break;case"CANCELLED":c=t.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${t.status}`)}await n.finish({step:t,message:c,output:Lc.parse(t),attempt:o})}async function Hx({codePath:r,screenshotBuff:e,storage:t,logger:n}){if(e)try{let o=await t.uploadScreenshot(e);return n.info({screenshotUrl:o,codePath:r},"Saved screenshot for debugging"),o}catch(o){n.error({err:o,codePath:r},"Failed to save screenshot for debugging")}}async function zr({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 hG=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Gx({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(hG.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 ie(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(bi(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 In(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}var jx="MOMENTIC_RUN_ID",Vx="FINAL_SCREENSHOT_URL";import{randomUUID as $x}from"crypto";async function Wx({browser:r,signal:e}){let t=new Date;try{return await r.navigate({url:r.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:$x(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:t,finishedAt:new Date,results:[],command:{id:$x(),type:"NAVIGATE",url:r.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Wd=async r=>{let{orgId:e,runId:t,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs;r.fixtures.logger=r.fixtures.logger.child({orgId:e,runId:t,testId:n?.id});let{logger:s,controller:c}=r.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=r.callbacks.test,p=NR(s);if(r.options.reinitializeBrowser){let g=await Wx({browser:c.browser,signal:c.executeAbortController.signal});if(g.status!=="PASSED")return await l?.(),clearInterval(p?.interval),g}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:db.parse(r.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await SG(r),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function fG({beforeStatus:r,mainStatus:e,afterStatus:t}){return r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var SG=async r=>{let{tracer:e}=r.testParams,{fromStep:t,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs,{logger:s,controller:c,context:l,storage:u}=r.fixtures,{collectDebugData:d,disableHealing:p}=r.options;l.setCurrentUrl(c.browser.url());let m="test",g=o,h=[],f=p||t!==void 0||n!==void 0||void 0,y={results:h,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},S=!1;t?.fromStepId&&t.fromStepId===n?.toStepId?(m="filtered step",y.fastForwardingToStep=!0):t?.fromStepId?(m="partial steps list from step",y.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",S=!0);let T,b,R;if(S&&i&&i.length>0){let F=await qx(i,"beforeSteps",r);T=F.status,b=F.results,R=F.terminalResult?{...F.terminalResult,failureReason:"SetupFailureError"}:void 0}let C,x;if(T===void 0||T==="PASSED"){s.info({fromStep:t,toStep:n},`Starting execution of ${m}`);let F=await e.startMainStepList(),ne=await an({...r,work:y,listParams:{steps:g,containerName:m,results:h,tracer:F}});C=ne.status,x=ne.terminalResult}let I,P,$;if(S&&a&&a.length>0){let F=await qx(a,"afterSteps",r);I=F.status,P=F.results,$=F.terminalResult?{...F.terminalResult,failureReason:"TeardownFailureError"}:void 0}let G=fG({beforeStatus:T,mainStatus:C,afterStatus:I});if(d&&yG({tracer:e,work:y,controller:c,storage:u,context:l,logger:s,status:G}),await Promise.allSettled(y.asyncTasks),y.asyncTasks.push(Promise.resolve(r.callbacks.test.onSaveFinalRunResults?.({results:h,beforeResults:b,afterResults:P}))),G==="FAILED"){let F=T==="FAILED"?R:void 0,ne=I==="FAILED"?$:void 0;return{status:"FAILED",results:h,beforeResults:b,afterResults:P,failedStepResult:F??x??ne}}else if(G==="CANCELLED")return{status:"CANCELLED",results:h,beforeResults:b,afterResults:P};return{status:"PASSED",failureRecoveryDetails:y.state.failureRecoveryAttempts?{attempts:y.state.failureRecoveryAttempts}:void 0,results:h,beforeResults:b,afterResults:P}};async function qx(r,e,t){let n=t.fixtures.logger,o=e==="beforeSteps"?await t.testParams.tracer.startBeforeStepList():await t.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await an({...t,work:i,callbacks:a,listParams:{steps:r,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l}}function yG({tracer:r,work:e,controller:t,storage:n,logger:o,context:i,status:a}){let s=t.browser,c=s.retrieveAndClearDebugData(),l=kv(c.logsPerPage),u=pg(c.harPages||{},c.harEntries||{});r.attachConsoleLogs({logger:o,logs:l}),r.attachNetworkLogs({logger:o,logs:u}),a!=="PASSED"&&a!=="SUCCESS"&&(r.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let d=await s.screenshot({quality:75}),p=await Hx({codePath:"test-complete-final",storage:n,screenshotBuff:d,logger:o}),m=await H(s.html(),{milliseconds:2e3});i.setVariable(Vx,p),o.debug({finalPageHtml:m.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:p},"Uploaded final screenshot URL")}catch{}})()))}async function qd({settings:r,customHeaders:e,envVariables:t,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=kc.parse(r);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new tr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:t,currentUrl:i});await Wu({obj:l,context:u,bannedKeys:[],allowList:zE,localTools:s,logger:a,orgId:c});try{return kc.parse(l)}catch(d){throw new _("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function Kd({orgId:r,testName:e,envName:t,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await or({orgId:r,s:c.defaultValue,context:tr.dummyContext(e,t,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as BV}from"lodash-es";var Pf={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
60
+ `,wf(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 Ex=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}();je();je();var Tx=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new on}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===Er.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 bx=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!Bl(e)){var o=this._buffer.get(e);if(o==null&&(o=new on,this._buffer.set(e,o)),typeof t!="number"){V.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Er.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 xf=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())})},_f=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}}},vx=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},Ax=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))},Rx=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(Bl));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(Bl)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return xf(this,void 0,void 0,function(){var n,o,i,a;return _f(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,vC(Ax(Ax([],vx(n),!1),vx(o),!1))];case 1:return i=s.sent(),a=i.filter(AC).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 xf(n,void 0,void 0,function(){var s,c;return _f(this,function(l){switch(l.label){case 0:return s=new Tx(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=Oo(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 xf(n,void 0,void 0,function(){var s,c;return _f(this,function(l){switch(l.label){case 0:return s=new bx,c=Promise.resolve(i(s)),t!=null&&(c=Oo(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&&RC(n.instruments,t)})},r}();var G1=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)}}(),wx=function(r){G1(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 Fd(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Bd(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}(Ud);var Cx=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)}}(),$a=function(){function r(){}return r.Noop=function(){return V1},r}();var j1=function(r){Cx(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}($a);var xx=function(r){Cx(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}($a);var V1=new j1;var $1=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())})},W1=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}}},q1=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},_x=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new yx,this.observableRegistry=new Rx,this.meter=new gx(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,wx);return t.length===1?t[0]:new Ex(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,Sx);return t},r.prototype.collect=function(e,t,n){return $1(this,void 0,void 0,function(){var o,i,a;return W1(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(TC),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=xC(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=q1(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,$a.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var K1=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.")},Ix=function(){function r(e){this.resource=e,this.viewRegistry=new ax,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=bC(e),n=this.meterSharedStates.get(t);return n==null&&(n=new _x(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=K1(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 zd=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())})},Hd=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}}},Y1=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},X1=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))},Px=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return zd(this,void 0,void 0,function(){var t,n,o,i,a=this;return Hd(this,function(s){switch(s.label){case 0:return t=Li(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return zd(a,void 0,void 0,function(){var l;return Hd(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,X1([],Y1(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 zd(this,void 0,void 0,function(){return Hd(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 zd(this,void 0,void 0,function(){return Hd(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 Mx=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())})},Ox=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}}},Lx=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 J1(r,e){var t=e??Nd.empty();return r?Nd.default().merge(t):t}var If=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new Ix(J1((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=Lx(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=Lx(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"),Lh()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new Px(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return Mx(this,void 0,void 0,function(){return Ox(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 Mx(this,void 0,void 0,function(){return Ox(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 Q1=/[\^$\\.+?()[\]{}|]/g,Gd=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(Q1,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Wa=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 Nx=function(){function r(e){var t;this._nameFilter=new Gd((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Wa(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 Dx=function(){function r(e){this._nameFilter=new Wa(e?.name),this._versionFilter=new Wa(e?.version),this._schemaUrlFilter=new Wa(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 Z1(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var jd=function(){function r(e){var t;if(Z1(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Gd.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 xx(e.attributeKeys):this.attributesProcessor=$a.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:Br.Default(),this.instrumentSelector=new Nx({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new Dx({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var TIe=process.env.APP||"unknown";je();import{v4 as eG}from"uuid";function tG(){return new SC({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Mi.DELTA})}var rG=[new jd({instrumentName:"test_event_duration",instrumentType:Ae.HISTOGRAM,aggregation:new Fl([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new jd({instrumentName:"test_step_duration",instrumentType:Ae.HISTOGRAM,aggregation:new Fl([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],Vd=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 Jh({[ld]:e.serviceName,[mw]:t,[hw]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:eG()}),o=tG(),i=new vf({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new If({resource:n,readers:[i],views:rG}),od.setGlobalMeterProvider(this.provider),this.meter=od.getMeter("momentic-serverless")}increment(e,t,n){try{let o=td(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=td(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 Yt=new ed;function kx(r){r.disabled||(Yt=new Vd(r))}var iG=3;async function Ux(r){let{logger:e}=r.fixtures,{results:t}=r.failureRecoveryParams,n=t[t.length-1],o=sG(r.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),r.work.state.failureRecoveryAttempts=(r.work.state.failureRecoveryAttempts??0)+1;try{return await aG(r)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function aG(r){let{fixtures:e,work:t,failureRecoveryParams:n}=r,{controller:o,logger:i}=e,{testMetadata:a}=r.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:g}=await ba(i,u,s,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),h=l.map(I=>Ao(I)),f=a?.description?.trim(),y=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:S,thoughts:T,instructions:b}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:g,currentPageState:m,nextStepsSerialized:h,testDescription:f||void 0,customInstructions:y||void 0});if(S!=="RECOVERABLE")return i.info({scenario:S,thoughts:T,instructions:b},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${T}`};if(!b)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let R={id:oG(),type:"AI_ACTION_DYNAMIC",text:b},C=await Ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures},listParams:{steps:[R,c],containerName:"AI-recovered step list",tracer:u}})),x=C.results[0];if(x&&x.type==="AI_ACTION_DYNAMIC")if(fu({results:C.results,onPresetAction:I=>{I.aiSuggested=!0},onSimpleStepContainer:I=>{I.aiSuggested=!0}}),C.status==="SUCCESS"){let I=`The following steps were automatically executed by the failure recovery agent. Analysis: ${T}`;return x.message=I,Yt.increment("test_event",1,["name:failure_recovery_success",`orgId:${r.inputs.orgId}`]),i.info({thoughts:T},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:C,message:I}}else{Yt.increment("test_event",1,["name:failure_recovery_failure",`orgId:${r.inputs.orgId}`]);let I=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${T}`;return x.message=I,i.info({thoughts:T,aiActionResult:x},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:C,message:I}}return null}function sG(r,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let t=e.message;return t?t.includes("AbortError:")?"The user aborted the test":sE.some(n=>t.includes(n))?"The failed step is an irrecoverable configuration error":(r.state.failureRecoveryAttempts??0)>iG?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as $d}from"crypto";import lG from"fast-json-patch";import{cloneDeep as cG}from"lodash-es";async function Fx(r){let e=r.failedResults,t=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=r,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},g=p?.attempts??1;for(let h=0;h<g;h++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=cG(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:y}=await ba(d,c,e.results,{numStepsWithScreenshots:4}),S=await u.runSectionAutohealing({results:y,errorMessage:e.terminalResult?.message,goal:l.description});f=lG.applyPatch(f,S.patches).newDocument;let T=tr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await uG({logger:d,controller:u,tracer:c,context:T,restartConfig:m,startingUrl:a});let b=await Ma(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures,context:T},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(t.push(b.results),b.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:b,context:T},healingAttempts:t};e=b}return{healingAttempts:t}}async function uG({logger:r,controller:e,tracer:t,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:$d(),type:"PRESET_ACTION",command:{id:$d(),type:"NAVIGATE",url:n.url}},s=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:$d(),type:"PRESET_ACTION",command:{id:$d(),type:"NAVIGATE",url:i}},s=await t.startStep({logger:r,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function Bx(r,e){switch(r||(r="ON_FAILURE"),r){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Cy(e.command.type))}}async function zx(r){let{step:e,tracer:t}=r.sectionParams,{logger:n,controller:o,context:i}=r.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await t.startSubSteps(),u=async()=>r.executeStepList({...r,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await Ma(r.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!r.work.state.autoHealingDisabled&&Bx(e.autohealingConfig.trigger,d.terminalResult)){let h=await t.startSubSteps(),f=await Fx({...r,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:h});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,r.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let g={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return nn({asyncTasks:r.work.asyncTasks,nestedResults:d.results,result:g,logger:n}),g}var pG=60*60*1e3;async function an(r){let{results:e=[],containerName:t,steps:n,tracer:o}=r.listParams,{logger:i}=r.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=r.inputs,l=r.work,u="SUCCESS",d,p=0;for(p;p<n.length;p++){let m=n[p];if(m.skipped)continue;if(l.fastForwardingToStep&&s){let T=JSON.stringify(a);if(m.id===s.fromStepId&&T===JSON.stringify(s.parentStepIdChain))l.fastForwardingToStep=!1;else if(!Pv(m,a,s.fromStepId,s.parentStepIdChain))continue}let g=Ao(m),h=0,f=1,y=Date.now();"retries"in m&&m.retries&&m.retries>0&&(f+=m.retries);let S;for(;h<f&&Date.now()-y<pG;){h++,i.info({step:m,currentAttempt:h},`Executing step ${p+1}/${n.length} in ${t}: ${g}`);let T=Date.now(),{stepResult:b,status:R,failureRecoveryResults:C,shouldStopExecuting:x}=await mG({attempt:h,params:r,step:m,i:p,steps:n,results:e,currentParentIdChain:a,work:l,fromStep:s,toStep:c,lastRetry:h===f});if(R==="FAILED"&&h<f){S=[...S??[],b],Date.now()-T<1e3&&await ie(1e3-(Date.now()-T));continue}else e.push(b),S&&(b.previousAttempts=S);if(C&&e.push(...C),x)return u=R,d=b,{status:u,results:e,terminalResult:d};break}}return{status:u,results:e,terminalResult:d}}async function mG({attempt:r,params:e,step:t,i:n,steps:o,results:i,currentParentIdChain:a,work:s,fromStep:c,toStep:l,lastRetry:u}){let{tracer:d}=e.listParams,{logger:p,context:m,controller:g,codeEvalTools:h,usageTracker:f}=e.fixtures,{orgId:y}=e.inputs,S=new Date,T=await d.startStep({logger:p,step:t,attempt:r}),b=dG(t),R=m.toRedactedDisplayCopy(),C=g.browser.url(),x=g.executeAbortController.signal;f.trackStepExecution(t);let I,P;switch(t.type){case"PRESET_ACTION":{I="Preset action",P=await xi(t,async()=>await Xu({...e,presetParams:{tracer:T,step:t}}),x);break}case"AI_ACTION":{I="AI action",P=await xi(t,()=>xR({...e,aiStepParams:{step:t,tracer:T},executeStepList:an}),x);break}case"AI_ACTION_DYNAMIC":{I="AI action",P=await xi(t,()=>IR({...e,aiStepParams:{step:t,tracer:T},executeStepList:an}),x);break}case"RESOLVED_MODULE":{I=`Module (${t.name})`,P=await xi(t,async()=>{let U=await vR({orgId:y,step:t,context:m,logger:p,codeEvalTools:h,signal:x});return Rh({...e,executeStepList:an,moduleParams:{step:t,resolvedInputs:U,tracer:T}})},x);break}case"CONDITIONAL":{I="Conditional step",P=await xi(t,()=>wR({...e,conditionalParams:{step:t,tracer:T},executeStepList:an}),x);break}case"SECTION":{I="Section",P=await xi(t,()=>zx({...e,sectionParams:{step:t,tracer:T},executeStepList:an}),x);break}default:return(j=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}P.beforeUrl=P.beforeUrl??C,P.beforeTestContext=R,t.envKey&&m.setVariable(t.envKey,P.data);let $=g.browser.url();m.setCurrentUrl($),P.afterUrl=P.afterUrl??$,P.afterTestContext=m.toRedactedDisplayCopy(),await gG({step:t,startedAt:S,stepTypeName:I,result:P,callbacks:e.callbacks,globalWorkRef:e.work,tracer:T,attempt:r});let G,F;if(u&&P.status==="FAILED"&&!s.state.failureRecoveryDisabled&&c?.fromStepId===void 0&&l?.toStepId===void 0){let U=await Ux({...e,executeStepList:an,failureRecoveryParams:{failedStep:b,nextSteps:o.slice(n+1),results:i.concat(P),tracer:d}});U&&(U.type==="ATTEMPTED"?(G=U.result.results,F=U.status):U.type==="NOT_ELIGIBLE"&&(P.message=P.message?`${P.message} ${U.message}`:U.message),P.type==="PRESET_ACTION"&&(P.failureRecoveryStatus={type:U.type,message:U.message}))}return s.fastForwardingToStep&&c&&(c.fromStepId===t.id&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)&&(s.fastForwardingToStep=!1),t.type==="RESOLVED_MODULE"&&Vg(a,c.parentStepIdChain)&&(s.fastForwardingToStep=!1)),P.status!=="SUCCESS"&&F!=="SUCCESS"||g.closed?{shouldStopExecuting:!0,status:P.status,stepResult:P,failureRecoveryResults:G}:l&&t.id===l.toStepId&&JSON.stringify(a)===JSON.stringify(l.parentStepIdChain)?(g.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:P,failureRecoveryResults:G}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:P,failureRecoveryResults:G}}async function gG({stepTypeName:r,step:e,result:t,tracer:n,attempt:o,startedAt:i}){let a=r.toLowerCase(),s=r.charAt(0).toUpperCase()+r.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(t.status){case"SUCCESS":c=t.message??`${s} executed successfully.`;break;case"FAILED":c=t.message??`${s} failed.`;break;case"CANCELLED":c=t.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${t.status}`)}await n.finish({step:t,message:c,output:Lc.parse(t),attempt:o})}async function Hx({codePath:r,screenshotBuff:e,storage:t,logger:n}){if(e)try{let o=await t.uploadScreenshot(e);return n.info({screenshotUrl:o,codePath:r},"Saved screenshot for debugging"),o}catch(o){n.error({err:o,codePath:r},"Failed to save screenshot for debugging")}}async function zr({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 hG=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Gx({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(hG.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 ie(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(bi(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 In(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}var jx="MOMENTIC_RUN_ID",Vx="FINAL_SCREENSHOT_URL";import{randomUUID as $x}from"crypto";async function Wx({browser:r,signal:e}){let t=new Date;try{return await r.navigate({url:r.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:$x(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:t,finishedAt:new Date,results:[],command:{id:$x(),type:"NAVIGATE",url:r.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Wd=async r=>{let{orgId:e,runId:t,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs;r.fixtures.logger=r.fixtures.logger.child({orgId:e,runId:t,testId:n?.id});let{logger:s,controller:c}=r.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=r.callbacks.test,p=NR(s);if(r.options.reinitializeBrowser){let g=await Wx({browser:c.browser,signal:c.executeAbortController.signal});if(g.status!=="PASSED")return await l?.(),clearInterval(p?.interval),g}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:db.parse(r.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await SG(r),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function fG({beforeStatus:r,mainStatus:e,afterStatus:t}){return r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var SG=async r=>{let{tracer:e}=r.testParams,{fromStep:t,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=r.inputs,{logger:s,controller:c,context:l,storage:u}=r.fixtures,{collectDebugData:d,disableHealing:p}=r.options;l.setCurrentUrl(c.browser.url());let m="test",g=o,h=[],f=p||t!==void 0||n!==void 0||void 0,y={results:h,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},S=!1;t?.fromStepId&&t.fromStepId===n?.toStepId?(m="filtered step",y.fastForwardingToStep=!0):t?.fromStepId?(m="partial steps list from step",y.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",S=!0);let T,b,R;if(S&&i&&i.length>0){let F=await qx(i,"beforeSteps",r);T=F.status,b=F.results,R=F.terminalResult?{...F.terminalResult,failureReason:"SetupFailureError"}:void 0}let C,x;if(T===void 0||T==="PASSED"){s.info({fromStep:t,toStep:n},`Starting execution of ${m}`);let F=await e.startMainStepList(),ne=await an({...r,work:y,listParams:{steps:g,containerName:m,results:h,tracer:F}});C=ne.status,x=ne.terminalResult}let I,P,$;if(S&&a&&a.length>0){let F=await qx(a,"afterSteps",r);I=F.status,P=F.results,$=F.terminalResult?{...F.terminalResult,failureReason:"TeardownFailureError"}:void 0}let G=fG({beforeStatus:T,mainStatus:C,afterStatus:I});if(d&&yG({tracer:e,work:y,controller:c,storage:u,context:l,logger:s,status:G}),await Promise.allSettled(y.asyncTasks),y.asyncTasks.push(Promise.resolve(r.callbacks.test.onSaveFinalRunResults?.({results:h,beforeResults:b,afterResults:P}))),G==="FAILED"){let F=T==="FAILED"?R:void 0,ne=I==="FAILED"?$:void 0;return{status:"FAILED",results:h,beforeResults:b,afterResults:P,failedStepResult:F??x??ne}}else if(G==="CANCELLED")return{status:"CANCELLED",results:h,beforeResults:b,afterResults:P};return{status:"PASSED",failureRecoveryDetails:y.state.failureRecoveryAttempts?{attempts:y.state.failureRecoveryAttempts}:void 0,results:h,beforeResults:b,afterResults:P}};async function qx(r,e,t){let n=t.fixtures.logger,o=e==="beforeSteps"?await t.testParams.tracer.startBeforeStepList():await t.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await an({...t,work:i,callbacks:a,listParams:{steps:r,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l}}function yG({tracer:r,work:e,controller:t,storage:n,logger:o,context:i,status:a}){let s=t.browser,c=s.retrieveAndClearDebugData(),l=kv(c.logsPerPage),u=pg(c.harPages||{},c.harEntries||{});r.attachConsoleLogs({logger:o,logs:l}),r.attachNetworkLogs({logger:o,logs:u}),a!=="PASSED"&&a!=="SUCCESS"&&(r.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let d=await s.screenshot({quality:75}),p=await Hx({codePath:"test-complete-final",storage:n,screenshotBuff:d,logger:o}),m=await H(s.html(),{milliseconds:2e3});i.setVariable(Vx,p),o.debug({finalPageHtml:m.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:p},"Uploaded final screenshot URL")}catch{}})()))}async function qd({settings:r,customHeaders:e,envVariables:t,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=kc.parse(r);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new tr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:t,currentUrl:i});await Wu({obj:l,context:u,bannedKeys:[],allowList:zE,localTools:s,logger:a,orgId:c});try{return kc.parse(l)}catch(d){throw new _("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function Kd({orgId:r,testName:e,envName:t,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await or({orgId:r,s:c.defaultValue,context:tr.dummyContext(e,t,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as BV}from"lodash-es";var Pf={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
61
61
  var momenticConstants = {
62
62
  bannedClassSubstrings: [
63
63
  "relative",
@@ -4112,14 +4112,14 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
4112
4112
  ${R}${u}</${p}>
4113
4113
  `}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let R=this.parent.children.findIndex(I=>I.id===this.id),C=R>0?this.parent.children[R-1]?.serialize({...e,neighbors:0}):"",x=R<this.parent.children.length-1?this.parent.children[R+1]?.serialize({...e,neighbors:0}):"";return`${C||""}
4114
4114
  ${y}
4115
- ${x||""}`}return y}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:oS(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=oS(this.properties),e}},aS=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(sS.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,y=i(h,f).length;if(g<y)break;let{clone:S,used:T}=a(h,f,g);if(T>g)break;d.children.push(S),S.parent=d,m+=T,g-=T}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 Vj(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 $j(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?(nu({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?(nu({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 Y_({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 y=(j,Se={})=>{},S=r.backendDOMNodeId,T=Bj.includes(r.role?.value?.toLowerCase()??"");if(!T&&S===void 0)return y("Filtering out node since it doesn't exist in the DOM"),[];let b=S?i.backendIdToNode[S]:void 0;if(!T&&!b)try{let j=await H(g.send({method:"DOM.describeNode",params:{backendNodeId:S}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if(j&&j.node.nodeName.toLowerCase()==="slot"&&j.node.distributedNodes?.length)h.debug({redirectedDomNode:b,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:j},"Redirecting node to assigned slot");else return y("Filtering out node since it doesn't exist in the DOM",{cdpResult:j}),[]}catch(j){return y("Filtering out node since it doesn't exist in the DOM",{err:j}),[]}if(b&&e&&l&&u&&r.backendDOMNodeId&&!$j(b,u,h,f))return b.momenticIgnored=!0,[];if(b&&b.computedStyles.display==="none")return b.momenticIgnored=!0,[];if(b&&b.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&b.tagName.toLowerCase()!=="input")return b.momenticIgnored=!0,[];if(c===!1)return b.momenticIgnored=!0,[]}let R=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",C=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",x=new iS({domNode:b,id:parseInt(r.nodeId),role:r.role?.value||"",name:R,nameSources:r.name?.sources,content:C,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(j=>(m??W_).includes(j.name)||q_.includes(j.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+Vj(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,P=a[t],$=t;if(b?.tagName.toLowerCase()==="iframe"&&b.ownedFrameId){let j=n.childFrames.find(Qe=>Qe.frameId===b.ownedFrameId),Se=o[j?.frameId??""]?.root,W=a[j?.frameId??""];if(j&&Se&&W){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Qe=Se;r.childIds=Qe.childIds,I=j,P=W,$=j.frameId}}let G=b?.childrenBackendIds?.length??0,F=(r.childIds??[]).filter(j=>!!P.get(parseInt(j))).length;if(G>F){let j=r.childIds?.map(W=>P.get(parseInt(W))).filter(Boolean).map(W=>W?.backendDOMNodeId).filter(W=>W!==void 0)??[],Se=0;for(let W of b?.childrenBackendIds??[]){if(j.includes(W)){Se=(r.childIds?.findIndex(we=>P.get(parseInt(we))?.backendDOMNodeId===W)??0)+1;continue}let Qe=i.backendIdToNode[W];if(!Qe||Qe?.tagName.toLowerCase()!=="svg")continue;let ke=Math.floor(-1*Math.random()*1e7),ct={nodeId:ke.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:W,frameId:$,role:{type:"string",value:"graphics-symbol"}};P.set(ke,ct),r.childIds||(r.childIds=[]),r.childIds.splice(Se,0,ke.toString()),Se++}}if(r.childIds?.length===1&&b){let j=P.get(parseInt(r.childIds[0])),Se=j?.role?.value,W=b.childrenBackendIds;if(j&&Se==="StaticText"&&W.length===1){let Qe=i.backendIdToNode[W[0]];if(Qe?.tagName?.toLowerCase()==="span"){let ke=Math.floor(-1*Math.random()*1e7).toString(),ct={nodeId:ke,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Qe.backendNodeId,frameId:$,childIds:[j.nodeId]};j.parentId=ke,P.set(parseInt(ke),ct),r.childIds=[ke]}}}for(let j of r.childIds??[]){if(!j)continue;let Se=P.get(parseInt(j));if(!Se)continue;let W=await Y_({node:Se,parent:x,domGraph:i,axGraph:o,frameId:$,frameContext:I,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});W.length&&(x.children=x.children.concat(W))}if(x.role==="StaticText"&&(x.children=[]),x.children.length===1&&x.children[0].role==="StaticText"){let j=x.name,Se=x.children[0]?.name;(j===Se||!Se)&&(x.children=[])}let ne=[];for(let j=x.children.length-1;j>=0;j--){let Se=x.children[j];if(Se.role!=="StaticText"){ne.push(Se);continue}if(j===0||x.children[j-1].role!=="StaticText"){ne.push(Se);continue}x.children[j-1].name+=Se.name}if(x.children=ne.reverse(),!x.isInteresting(p)&&r.parentId)return b&&(b.momenticIgnored=!0),x.children;for(let j of x.children)j.parent=x;return Kj(x),b&&d&&nS(b,i),[x]}function X_({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:sS.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=rS(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=X_({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function J_({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=Oj(),y=x=>{let I=x.allNodes.filter($=>!$.ignoredReasons?.find(F=>(m??W_).includes(F.name))),P=new Map;return I.forEach($=>{P.set(parseInt($.nodeId),$)}),P},S={};Object.entries(r).forEach(([x,I])=>{S[x]=y(I)});let T=await Y_({node:h,domGraph:e,parent:null,inputNodeMap:S,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(T.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(T)}`);if(T.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let b={},R={},C={};return X_({node:T[0],a11yIdNodeMap:b,dataMomenticIdMap:R,selectorToNodeMap:C,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new aS(T[0],b,R,C)}function Wj(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<K_&&!Hr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(Q_(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=parseInt(e);if(!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 qj(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||Dj.includes(a);if((Hr.relevantElementAttributes.includes(a)||Z_(a,t))&&!c){let u=Wj(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&j_.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of j_)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 Kj(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(st(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=>st(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 Yj(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function Q_(r,e){if(e&&eI(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 Z_(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 eI(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 tp=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 H(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new _("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await ie(xt),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await H(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new _("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 H(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new _("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 H(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 H(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new _("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 H(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 H(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 Xa="<empty>";function Xj(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 rI(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||Xj(r.url)}async function Jj(r,e){let t=await r.send({timeout:se,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:se,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Ja({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:qa,method:"Page.getFrameTree",params:{}}),r.send({timeout:qa,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(rI(d.frame))return null;try{return await nI({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 nI({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await Jj(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Fo(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(rI(g.frame))return null;try{return await nI({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 Qj(r){try{return await r.owner().count()===1}catch{return!1}}async function Zj(r){try{return await r.count()===1}catch{return!1}}async function Mn(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,Xa]){let p=o.frameLocator(d===Xa?"iframe":`iframe[${d}]`);if(await Qj(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new _("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,Xa]){let u=o.locator(l===Xa?"iframe":`iframe[${l}]`);if(await Zj(u)){a=u,i.push(l);break}}if(!a)throw new _("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:le}),c=await s.asElement().contentFrame();if(!c)throw new _("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function tI(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 oI({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===Xa?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===Xa?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 Mn(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=tI(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 Mn(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=tI(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 Mn(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 Mn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new gn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function rp(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function lS(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function iI(r){let e=lS(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 aI(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 sI({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await eV({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 eV({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await sl({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:xe,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}async function lI({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 H(g?.boundingBox(),{milliseconds:se})??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 On}from"crypto";import tV from"js-beautify";var rV=["Dead"],np=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:On(),type:"PRESET_ACTION",command:Fn(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=Fn(i);a={id:On(),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=Fn(i);a={id:On(),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=Fn(i);a={id:On(),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:ze(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=tV.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=Xx(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,...ze(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(rV.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=Fn("TYPE");i={id:On(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=Fn("PRESS");i={id:On(),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:On(),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:On(),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=Fn(l);u.deltaY=Math.abs(i);let d={id:On(),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=Fn(l);u.deltaX=Math.abs(i);let d={id:On(),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 cS}from"zod";var JDe=cS.object({type:cS.literal("url"),url:cS.string()});var op=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position"];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=lS(e),{frame:o,mPathSelectorTokens:i}=await Mn(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 Ja({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await oI({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(rp(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:rp(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await sI({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Ja({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[H(n.evaluate(e,t),{milliseconds:xe})],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(Mn(c,n).then(({frame:u})=>H(u.evaluate(e,t),{milliseconds:xe})).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 Ja({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 jr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new _("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await jr({fn:()=>Ja({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 jr({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 jr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await jr({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 jr({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:yn,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=z_({node:o,domGraph:this.domGraph});return H_(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:xe});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await G_(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(sn(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 Ja({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 _&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await ie(xt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:rp(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=Fo(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 Mn(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Mn(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 _("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 J_({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 Mn(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 Rt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:xe,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(Fo(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Fo(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:se,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:se,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 jr({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 jr({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 jr({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 jr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:xe}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await jr({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:se}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ie(xt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new _("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 B_({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=iI(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function uS(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var Vr=class r{static USER_AGENT=Xd;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};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}){sv(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){this.abortSignal=e}async initialize({grantPermissions:e,runInitScripts:t,timingRecorder:n}){if(this.contextInitialized)return;let o={[Yd]:this.userBrowserSettings.visualActions},i=[];if(this.userControlledBrowserSettings.extraHeaders&&i.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e){let u=["clipboard-read","clipboard-write","microphone","camera","geolocation"];Or||u.push("local-network-access"),i.push(this.context.grantPermissions(u))}i.push(this.context.addInitScript({content:Pf.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(o)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`}),this.exposeRecordingBindings());let a=u=>this.handleNewPageEvent(u);this.context.on("page",a),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",a)});let s=!1;if(t){let u=async()=>{let d=Date.now();try{await Promise.all([this.page.addScriptTag({content:Pf.htmlUtilsLibJs}),this.page.addScriptTag({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(o)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`})])}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"),s=!0;else throw p}(n??{})["add-init-scripts"]=Date.now()-d};i.push(u())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&cV()==="darwin"&&nV("system_profiler SPDisplaysDataType").toString().includes("Retina"))E.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let u=async()=>{let d=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(n??{})["fetch-dpr"]=Date.now()-d};i.push(u())}let c=Date.now();await H(Promise.all(i),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let l=Date.now();(n??{})["ops-attach"]=l-c,s&&await this.page.reload(),this.cdpClient=await tp.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(n??{})["cdp-init"]=Date.now()-l,await this.initializeScreencast(),this.stateManager=new op({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 x_(e),n=new r(t);return await n.initialize({grantPermissions:!0,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let 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 tS(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=dS(),o=`${e}-${n}`,i=Date.now(),a=!1,s=async()=>{try{await H(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(c){c.name!=="AbortError"&&!this.closed&&this.logger.error({err:c,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],a=!0}};this.pageLoadPromises[o]=s().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()||!bi(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=dS(),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||e.on("console",a=>{c_(e,o,this.debugData,a,this.logger)});let i=async()=>{this.userBrowserSettings.disableBrowserMonitoring||(await m_(t,this.debugData,e),await e.route("**/*",async(a,s)=>{await $f({pageId:t,route:a,request:s,debugData:this.debugData,logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks})}),await e.route("**/*",E_(this.customHeaders,this.logger))),Or&&await e.route("**/*",jl),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"||!bi(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.debugData.harPages={},this.debugData.harEntries={},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 H(Qf(this.getBrowserCallbacks()),{milliseconds:le})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{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<qa;){a++,n?.throwIfAborted();try{if(await Rt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:le,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 ie(xt),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),Rt({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:se,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 ie(Ka),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??xe}),c=Buffer.from(s.data,"base64"),l=await uI.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&&aV(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:se});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 y=await uI.fromBuffer(c),S=y.bitmap.width,T=y.bitmap.height;m=Math.max(0,Math.min(m,S-1)),g=Math.max(0,Math.min(g,T-1)),h=Math.max(1,Math.min(h,S-m)),f=Math.max(1,Math.min(f,T-g)),c=await y.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(y){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${y}`)}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}){wA(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 ie(xt),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:le})}if(!i)throw new _("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(r_.has(s))throw new _("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 getActiveElement(e){try{return await Rt({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;return n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n}:void 0},arg:void 0,timeout:le,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 M_({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let a=Date.now();for(;Date.now()-a<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ie(Ka),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}t.clearContent&&(t.forceClearContent||i?.tag==="input"||i?.tag==="textarea"?(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)):this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??Ty}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:xe})}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:xe})}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 Zd({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:le}),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 l_(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:le});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:le,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 s_(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 a_(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 _("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return tS(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 hn)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(!Nf.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:se})),!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:se});if(!s||!s.width||!s.height)throw new _("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:se});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:se});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 _("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new _("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 S=c.parentFrame,{cache:T,config:b}=await this.stateManager.getAutoFrameDetailsFromHandle(S);d=T,p=b,u=b.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:ze(i),frameCache:d},f,y=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:aI(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),y=!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{y&&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 ie(xt,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 Ps)break;if(g instanceof hn){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 ie(xt,a)}a?.throwIfAborted(),m&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await ie(xt,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=ze(i),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=Qa(t),l=[],u=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),d;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(m){d=m,m instanceof gn&&l.push(...m.decisions)}if(p)return{...p,pageState:void 0,decisions:[...l,...p.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:d?.message,selectors:Qa(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw d;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:u,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(p)return p}throw new gn(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Ps("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:yn,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:Lf,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 Rt({fn:b=>window.evaluatePrimaryCaches(b),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:se,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,p,m=[];if(s==="prefer"&&u?.result){d=u.result;let b={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};m.push(b),p="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let b=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,R=d.workingSelectors.slice(0,5);m.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:b,selectors:R}),n.debug({reason:b,workingSelectors:R},"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 gn("Cache evaluation failed",m);let g,h,f;if(this.userBrowserSettings.visualActions){let b=d.mPath;if(!b)throw new Error("Found element did not have an mPath despite using visual actions");let R=b.join(" > ");g=e.locator(R),h=this.stateManager.getNodeUsingMPathSelector(R)}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(sn(f));else throw new _("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 y=await Gr(g,n);if(y&&y!==d.serializedElement)throw n.warn({currentNodeOnlySerializedHtml:y,cachedSerializedHtml:d.serializedElement},"Retrying cache resolution because element's HTML has changed since resolution"),new Error("Element's HTML has changed since cache was generated");let S=Qa(t);await this.updateCacheWithNewNodeDetails({node:h,target:t,locator:g,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let T=pS(S,t);return T&&Object.keys(T).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ze(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:le}),m=await Gr(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 _("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 ie(xt,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:se});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<e_){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 Rt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:xe,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(Lf*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(sn(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 Gr(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=Qa(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=pS(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ze(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&&Nf.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=pV(),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],y=Qa(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let S=pS(y,t);return S&&Object.keys(S).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ze(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:S,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:le})??"",i=P_.some(a=>a===o.toLowerCase());return await Zf({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()}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return Zf({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks()})}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(),Nu(s,t,n)){a=!0;break}await ie(xt,this.abortSignal)}if(!a)throw new _("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Au(t)} in ${o}ms.
4115
+ ${x||""}`}return y}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:oS(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=oS(this.properties),e}},aS=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(sS.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,y=i(h,f).length;if(g<y)break;let{clone:S,used:T}=a(h,f,g);if(T>g)break;d.children.push(S),S.parent=d,m+=T,g-=T}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 Vj(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 $j(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?(nu({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?(nu({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 Y_({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 y=(j,Se={})=>{},S=r.backendDOMNodeId,T=Bj.includes(r.role?.value?.toLowerCase()??"");if(!T&&S===void 0)return y("Filtering out node since it doesn't exist in the DOM"),[];let b=S?i.backendIdToNode[S]:void 0;if(!T&&!b)try{let j=await H(g.send({method:"DOM.describeNode",params:{backendNodeId:S}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if(j&&j.node.nodeName.toLowerCase()==="slot"&&j.node.distributedNodes?.length)h.debug({redirectedDomNode:b,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:j},"Redirecting node to assigned slot");else return y("Filtering out node since it doesn't exist in the DOM",{cdpResult:j}),[]}catch(j){return y("Filtering out node since it doesn't exist in the DOM",{err:j}),[]}if(b&&e&&l&&u&&r.backendDOMNodeId&&!$j(b,u,h,f))return b.momenticIgnored=!0,[];if(b&&b.computedStyles.display==="none")return b.momenticIgnored=!0,[];if(b&&b.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&b.tagName.toLowerCase()!=="input")return b.momenticIgnored=!0,[];if(c===!1)return b.momenticIgnored=!0,[]}let R=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",C=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",x=new iS({domNode:b,id:parseInt(r.nodeId),role:r.role?.value||"",name:R,nameSources:r.name?.sources,content:C,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(j=>(m??W_).includes(j.name)||q_.includes(j.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+Vj(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,P=a[t],$=t;if(b?.tagName.toLowerCase()==="iframe"&&b.ownedFrameId){let j=n.childFrames.find(Qe=>Qe.frameId===b.ownedFrameId),Se=o[j?.frameId??""]?.root,W=a[j?.frameId??""];if(j&&Se&&W){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Qe=Se;r.childIds=Qe.childIds,I=j,P=W,$=j.frameId}}let G=b?.childrenBackendIds?.length??0,F=(r.childIds??[]).filter(j=>!!P.get(parseInt(j))).length;if(G>F){let j=r.childIds?.map(W=>P.get(parseInt(W))).filter(Boolean).map(W=>W?.backendDOMNodeId).filter(W=>W!==void 0)??[],Se=0;for(let W of b?.childrenBackendIds??[]){if(j.includes(W)){Se=(r.childIds?.findIndex(we=>P.get(parseInt(we))?.backendDOMNodeId===W)??0)+1;continue}let Qe=i.backendIdToNode[W];if(!Qe||Qe?.tagName.toLowerCase()!=="svg")continue;let ke=Math.floor(-1*Math.random()*1e7),ct={nodeId:ke.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:W,frameId:$,role:{type:"string",value:"graphics-symbol"}};P.set(ke,ct),r.childIds||(r.childIds=[]),r.childIds.splice(Se,0,ke.toString()),Se++}}if(r.childIds?.length===1&&b){let j=P.get(parseInt(r.childIds[0])),Se=j?.role?.value,W=b.childrenBackendIds;if(j&&Se==="StaticText"&&W.length===1){let Qe=i.backendIdToNode[W[0]];if(Qe?.tagName?.toLowerCase()==="span"){let ke=Math.floor(-1*Math.random()*1e7).toString(),ct={nodeId:ke,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Qe.backendNodeId,frameId:$,childIds:[j.nodeId]};j.parentId=ke,P.set(parseInt(ke),ct),r.childIds=[ke]}}}for(let j of r.childIds??[]){if(!j)continue;let Se=P.get(parseInt(j));if(!Se)continue;let W=await Y_({node:Se,parent:x,domGraph:i,axGraph:o,frameId:$,frameContext:I,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});W.length&&(x.children=x.children.concat(W))}if(x.role==="StaticText"&&(x.children=[]),x.children.length===1&&x.children[0].role==="StaticText"){let j=x.name,Se=x.children[0]?.name;(j===Se||!Se)&&(x.children=[])}let ne=[];for(let j=x.children.length-1;j>=0;j--){let Se=x.children[j];if(Se.role!=="StaticText"){ne.push(Se);continue}if(j===0||x.children[j-1].role!=="StaticText"){ne.push(Se);continue}x.children[j-1].name+=Se.name}if(x.children=ne.reverse(),!x.isInteresting(p)&&r.parentId)return b&&(b.momenticIgnored=!0),x.children;for(let j of x.children)j.parent=x;return Kj(x),b&&d&&nS(b,i),[x]}function X_({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:sS.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=rS(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=X_({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function J_({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=Oj(),y=x=>{let I=x.allNodes.filter($=>!$.ignoredReasons?.find(F=>(m??W_).includes(F.name))),P=new Map;return I.forEach($=>{P.set(parseInt($.nodeId),$)}),P},S={};Object.entries(r).forEach(([x,I])=>{S[x]=y(I)});let T=await Y_({node:h,domGraph:e,parent:null,inputNodeMap:S,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(T.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(T)}`);if(T.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let b={},R={},C={};return X_({node:T[0],a11yIdNodeMap:b,dataMomenticIdMap:R,selectorToNodeMap:C,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new aS(T[0],b,R,C)}function Wj(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<K_&&!Hr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(Q_(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=parseInt(e);if(!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 qj(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||Dj.includes(a);if((Hr.relevantElementAttributes.includes(a)||Z_(a,t))&&!c){let u=Wj(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&j_.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of j_)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 Kj(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(st(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=>st(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 Yj(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function Q_(r,e){if(e&&eI(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 Z_(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 eI(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 tp=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 H(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new _("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await ie(xt),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await H(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new _("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 H(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new _("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 H(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 H(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new _("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 H(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 H(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 Xa="<empty>";function Xj(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 rI(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||Xj(r.url)}async function Jj(r,e){let t=await r.send({timeout:se,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:se,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Ja({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:qa,method:"Page.getFrameTree",params:{}}),r.send({timeout:qa,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(rI(d.frame))return null;try{return await nI({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 nI({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await Jj(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Fo(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(rI(g.frame))return null;try{return await nI({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 Qj(r){try{return await r.owner().count()===1}catch{return!1}}async function Zj(r){try{return await r.count()===1}catch{return!1}}async function Mn(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,Xa]){let p=o.frameLocator(d===Xa?"iframe":`iframe[${d}]`);if(await Qj(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new _("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,Xa]){let u=o.locator(l===Xa?"iframe":`iframe[${l}]`);if(await Zj(u)){a=u,i.push(l);break}}if(!a)throw new _("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:le}),c=await s.asElement().contentFrame();if(!c)throw new _("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function tI(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 oI({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===Xa?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===Xa?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 Mn(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=tI(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 Mn(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=tI(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 Mn(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 Mn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new gn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function rp(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function lS(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function iI(r){let e=lS(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 aI(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 sI({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await eV({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 eV({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await sl({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:xe,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}async function lI({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 H(g?.boundingBox(),{milliseconds:se})??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 On}from"crypto";import tV from"js-beautify";var rV=["Dead"],np=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:On(),type:"PRESET_ACTION",command:Fn(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=Fn(i);a={id:On(),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=Fn(i);a={id:On(),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=Fn(i);a={id:On(),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:ze(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=tV.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=Xx(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,...ze(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(rV.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=Fn("TYPE");i={id:On(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=Fn("PRESS");i={id:On(),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:On(),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:On(),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=Fn(l);u.deltaY=Math.abs(i);let d={id:On(),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=Fn(l);u.deltaX=Math.abs(i);let d={id:On(),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 cS}from"zod";var JDe=cS.object({type:cS.literal("url"),url:cS.string()});var op=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position"];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=lS(e),{frame:o,mPathSelectorTokens:i}=await Mn(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 Ja({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await oI({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(rp(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:rp(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await sI({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Ja({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[H(n.evaluate(e,t),{milliseconds:xe})],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(Mn(c,n).then(({frame:u})=>H(u.evaluate(e,t),{milliseconds:xe})).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 Ja({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 jr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new _("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await jr({fn:()=>Ja({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 jr({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 jr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await jr({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 jr({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:yn,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=z_({node:o,domGraph:this.domGraph});return H_(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:xe});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await G_(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(sn(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 Ja({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 _&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await ie(xt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:rp(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=Fo(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 Mn(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Mn(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 _("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 J_({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 Mn(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 Rt({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:xe,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(Fo(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Fo(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:se,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:se,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:se,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 jr({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 jr({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 jr({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 jr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:xe}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await jr({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:se}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ie(xt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new _("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 B_({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=iI(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function uS(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var Vr=class r{static USER_AGENT=Xd;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};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}){sv(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){this.abortSignal=e}async initialize({grantPermissions:e,runInitScripts:t,timingRecorder:n}){if(this.contextInitialized)return;let o={[Yd]:this.userBrowserSettings.visualActions},i=[];if(this.userControlledBrowserSettings.extraHeaders&&i.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e){let u=["clipboard-read","clipboard-write","microphone","camera","geolocation"];Or||u.push("local-network-access"),i.push(this.context.grantPermissions(u))}i.push(this.context.addInitScript({content:Pf.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(o)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`}),this.exposeRecordingBindings());let a=u=>this.handleNewPageEvent(u);this.context.on("page",a),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",a)});let s=!1;if(t){let u=async()=>{let d=Date.now();try{await Promise.all([this.page.addScriptTag({content:Pf.htmlUtilsLibJs}),this.page.addScriptTag({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(o)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`})])}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"),s=!0;else throw p}(n??{})["add-init-scripts"]=Date.now()-d};i.push(u())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&cV()==="darwin"&&nV("system_profiler SPDisplaysDataType").toString().includes("Retina"))E.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let u=async()=>{let d=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(n??{})["fetch-dpr"]=Date.now()-d};i.push(u())}let c=Date.now();await H(Promise.all(i),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let l=Date.now();(n??{})["ops-attach"]=l-c,s&&await this.page.reload(),this.cdpClient=await tp.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(n??{})["cdp-init"]=Date.now()-l,await this.initializeScreencast(),this.stateManager=new op({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 x_(e),n=new r(t);return await n.initialize({grantPermissions:!0,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let 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 tS(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=dS(),o=`${e}-${n}`,i=Date.now(),a=!1,s=async()=>{try{await H(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(c){c.name!=="AbortError"&&!this.closed&&this.logger.error({err:c,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],a=!0}};this.pageLoadPromises[o]=s().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()||!bi(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=dS(),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||e.on("console",a=>{c_(e,o,this.debugData,a,this.logger)});let i=async()=>{this.userBrowserSettings.disableBrowserMonitoring||(await m_(t,this.debugData,e),await e.route("**/*",async(a,s)=>{await $f({pageId:t,route:a,request:s,debugData:this.debugData,logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks})}),await e.route("**/*",E_(this.customHeaders,this.logger))),Or&&await e.route("**/*",jl),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"||!bi(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.debugData.harPages={},this.debugData.harEntries={},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 H(Qf(this.getBrowserCallbacks()),{milliseconds:le})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{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<qa;){a++,n?.throwIfAborted();try{if(await Rt({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:le,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 ie(xt),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),Rt({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:se,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 ie(Ka),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??xe}),c=Buffer.from(s.data,"base64"),l=await uI.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&&aV(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:se});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 y=await uI.fromBuffer(c),S=y.bitmap.width,T=y.bitmap.height;m=Math.max(0,Math.min(m,S-1)),g=Math.max(0,Math.min(g,T-1)),h=Math.max(1,Math.min(h,S-m)),f=Math.max(1,Math.min(f,T-g)),c=await y.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(y){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${y}`)}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}){wA(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 ie(xt),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:le})}if(!i)throw new _("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(r_.has(s))throw new _("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 Rt({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:le,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 M_({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 ie(Ka),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??Ty}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:xe})}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:xe})}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 Zd({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:le}),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 l_(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:le});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:le,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 s_(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 a_(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 _("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return tS(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 hn)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(!Nf.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:se})),!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:se});if(!s||!s.width||!s.height)throw new _("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:se});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:se});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 _("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new _("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 S=c.parentFrame,{cache:T,config:b}=await this.stateManager.getAutoFrameDetailsFromHandle(S);d=T,p=b,u=b.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:ze(i),frameCache:d},f,y=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:aI(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),y=!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{y&&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 ie(xt,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 Ps)break;if(g instanceof hn){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 ie(xt,a)}a?.throwIfAborted(),m&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await ie(xt,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=Qa(t),l=[],u=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),d;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(m){d=m,m instanceof gn&&l.push(...m.decisions)}if(p)return{...p,pageState:void 0,decisions:[...l,...p.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:d?.message,selectors:Qa(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw d;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:u,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(p)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=ze(o),p}throw new gn(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Ps("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:yn,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:Lf,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 Rt({fn:b=>window.evaluatePrimaryCaches(b),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:se,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,p,m=[];if(s==="prefer"&&u?.result){d=u.result;let b={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};m.push(b),p="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let b=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,R=d.workingSelectors.slice(0,5);m.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:b,selectors:R}),n.debug({reason:b,workingSelectors:R},"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 gn("Cache evaluation failed",m);let g,h,f;if(this.userBrowserSettings.visualActions){let b=d.mPath;if(!b)throw new Error("Found element did not have an mPath despite using visual actions");let R=b.join(" > ");g=e.locator(R),h=this.stateManager.getNodeUsingMPathSelector(R)}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(sn(f));else throw new _("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 y=await Gr(g,n);if(y&&y!==d.serializedElement)throw n.warn({currentNodeOnlySerializedHtml:y,cachedSerializedHtml:d.serializedElement},"Retrying cache resolution because element's HTML has changed since resolution"),new Error("Element's HTML has changed since cache was generated");let S=Qa(t);await this.updateCacheWithNewNodeDetails({node:h,target:t,locator:g,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let T=pS(S,t);return T&&Object.keys(T).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ze(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:le}),m=await Gr(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 _("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 ie(xt,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:se});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<e_){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 Rt({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:xe,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(Lf*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(sn(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 Gr(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=Qa(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=pS(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ze(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&&Nf.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=pV(),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],y=Qa(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:p,allowNotActionableNodesOverride:o});let S=pS(y,t);return S&&Object.keys(S).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ze(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:S,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:le})??"",i=P_.some(a=>a===o.toLowerCase());return await Zf({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()}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return Zf({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks()})}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(),Nu(s,t,n)){a=!0;break}await ie(xt,this.abortSignal)}if(!a)throw new _("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${Au(t)} in ${o}ms.
4116
4116
  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.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:se});if(!o)throw new _("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 ie(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,xe):500),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:se});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 ie(Ka),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Ui({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:se});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 Ui({func:t=>t.locator.focus({timeout:xe}),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 Rt({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:le,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Ui({func:t=>t.locator.blur({timeout:xe}),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 Ui({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 _("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:se})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=ep(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=ep(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of uS(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=ep(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of uS(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:yn;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:s});let d=0,p;for(;d<t;){d++;try{return await H(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 _("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${p}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await Rt({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:se,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 ie(Ka,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<Zx)){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 this.page.mouse.move(e.x,e.y,{steps:3}),await this.page.mouse.down(),await this.page.mouse.move(t.x,t.y,{steps:3}),await ie(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,Of):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,n,o){await this.hoverUsingVisualCoordinates(o),await this.page.mouse.down(),await this.page.mouse.move(e+o.x,t+o.y,{steps:n}),await ie(Ka),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:se}),n=await H(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:xe});process.platform==="darwin"&&n===1&&(n=Jx);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 S=0;S<s.length;S++)if(c[S]===e){d=l.indexOf(S);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,y=m+h/2;return{centerX:f,centerY:y}}async scrollVertical(e){return eS({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 eS({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=dI(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 ie(xt)}}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 _("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)}.
4117
4117
  Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!bi(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=$c(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,t],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}async solveCaptcha(){await this.getBrowserState({allowNotActionableNodesOverride:!0});let e;for(let s of Object.values(this.stateManager.a11yIdToNodeMap))if(s.role==="image"&&s.name.toLowerCase().includes("captcha")){if(!s.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,s.backendNodeId);break}if(!e){let s=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!s.captchas||!s.captchas.length)throw new Error("No captchas found on the page");return}let t=await e.screenshot({type:"jpeg",animations:"allow",caret:"hide",quality:100,timeout:se}),n=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:Ya,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!n.ok){let s=`Captcha solver API returned error response: ${n.statusText}`;throw this.logger.error({text:await n.text()},s),new Error(s)}let{taskId:o}=await n.json(),i=Date.now(),a="";for(;Date.now()-i<t_;){await ie(2500);let s=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Ya,taskId:o})});if(!s.ok){let l=`Captcha solution API returned error response: ${s.statusText}`;throw this.logger.error({text:await s.text()},l),new Error(l)}let c=await s.json();if(c.errorId){let l=`Captcha solution API returned error ID ${c.errorId}`;throw this.logger.error(l),new Error(l)}if(c.status==="ready"){a=c.solution.text;break}}if(!a)throw new Error("Captcha solution timed out");return a}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await H(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&&lI({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];bi(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}}},xt);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:le})}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 sl({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 _("UserInfrastructureError",`The page with URL ${st(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await sl({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 sV.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 Rt({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:xe,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new _("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=xe){let i=await this.getActivePageOrFrame();return Rt({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=fo}){let i=y_(),a={code:e,fragment:t,context:n},{result:s}=await H(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new _("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:xe});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:le})}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 _("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:le,params:{highlightConfig:F_,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:le,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:le})}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[Yn],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(sn(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 H(this.performTargetRedirectionHelper(e,t,n),{milliseconds:se})??{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:se})??void 0),!n){let T=await Gr(e,t,500);t.error(`Attempted to click on element with no bounding box: ${T}`);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:y}=await e.evaluate(T=>{let b=window;if(!b.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return b.performTargetRedirection(T)},void 0,{timeout:le}),S=Date.now()-o;if(m){t.warn({error:m,serializedElement:g,duration:S,force:f,logs:y},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:g,duration:S,force:f,logs:y},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(sn(d)),hints:{relativeXYToLocator:h,force:f}};if(p)return t.info({newMPathSelector:p,serializedElement:g,duration:S,force:f,logs:y},"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:S,force:f,logs:y},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:g,duration:S,force:f,logs:y},"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:xe});if("error"in s&&s.error)throw s.error.startsWith(Kx)?new Rc(s.error):s.error.startsWith(Yx)?new wc(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:le})}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!!Ya}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,jf(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!ip(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()||dI(e),o=oV(e),i=uV(e),a=hg[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!ip(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:lV.getType(e)||"application/octet-stream"},{timeout:Of})}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:[],harPages:{},harEntries:{}},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,n){this.requestRecorders[e]={onRequestStart:(o,i)=>{t.matches({url:i.request.url,method:i.request.method})&&n.onRequestStart(o,i)},onRequestComplete:(o,i)=>{t.matches({url:i.request.url,method:i.request.method})&&n.onRequestComplete(o,i)}}}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??dS();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??Qx}get userBrowserSettings(){return Qa(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??qa}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=Qd();for(let t of e)if(!(!ip(t)||!cI(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=dV(t,o);return ip(i)&&cI(i).isDirectory()&&iV(i).length>0})))return t}};import LV from"fetch-cookie";import{cloneDeep as CI}from"lodash-es";import{CookieJar as NV}from"tough-cookie";import{randomUUID as yV}from"crypto";var gI={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},hI={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},mI=/<(\S+) id="(\d+)".*?>/g,mV=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,fI=["h1","h2","section","footer","nav","aside","form","label","dialog"],gV=[...fI,"span","div","h3"],hV=["table","select","form","ul","ol","menu","pre","code","dialog"],fV=["table","form","dialog","nav","section","ul","select"];function ap(r){return SV(r)}function SV({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4118
4118
  `),l=0,u=[],d=0,p=[],m=[],g=!1;for(;l<c.length;){g&&(s.push({ids:p,content:u.join(`
4119
4119
  `),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],g=!1);let h=c[l],f=St(h);d+=f,h.length>a&&(h=h.slice(0,a));let T=Array.from(h.matchAll(mI)).map(U=>U&&U.length>=3?{tagName:U[1],id:U[2]}:void 0).filter(U=>!!U),R=Array.from(h.matchAll(mV)).map(U=>U&&(U[2]||U[4])).filter(U=>!!U);R.reverse();let C=h.replace(/ id="[0-9]+"/g,"");u.push(C);for(let U of T)p.push(U.id),m.push(U);for(let U of R){let j=m[m.length-1];j&&j.tagName===U&&m.pop()}let x=m.some(U=>hV.includes(U.tagName)),I=c[l+1]??"",P=St(I),G=Array.from(I.matchAll(mI)).map(U=>U&&U.length>2?U[1]:void 0).filter(U=>!!U),F=G.some(U=>fI.includes(U)),ne=G.some(U=>gV.includes(U));d+P>=i&&(g=!0),d>=n&&(F&&!x||R.some(U=>fV.includes(U)))&&(g=!0),d>=o&&ne&&!x&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
4120
4120
  `),tokenLength:d}),s.forEach((h,f)=>{let y=h.ids[0],S=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:y,maxId:S},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var EV=75e4,sp=3e5;async function Bi(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=St(u);if(d>EV)try{let p=ap({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await bV({...r,tokenLimit:sp-1e4,chunks:p.chunks}),u=l.serialize();let m=St(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(sp*Eo),u=l.serialize();let m=St(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>sp)try{if(o){let p=ap({serializedTree:u,options:hI,logger:i}),m=yV();l=await H(TV({...r,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=St(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=ap({serializedTree:u,options:gI,logger:i});l=await H(vV({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=St(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(sp*Eo),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function TV({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:ze(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function bV(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:ze(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 vV(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:ze(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 gS(r,e){if(!r.description)throw new _("UserConfigurationError","Cannot locate element with empty description");return zr({action:async()=>AV(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function AV(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,y=r.description,S=r.useMemory&&!t;n&&(y=await or({orgId:p,s:y,context:n,localTools:g,signal:f,logger:l})),a&&(y=wV(y,a));let{serializedTree:T,tree:b}=await In(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),R,C=Date.now(),x;for(;!R&&Date.now()-C<3e3;){f.throwIfAborted();try{R=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(W){x=W}}if(!R)throw new _("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${x?.message}`);let I=T,P=!1,G=`data:image/jpeg;base64,${R.toString("base64")}`;I=await Bi({type:"locator",description:y,screenshot:G,serializedTree:T,options:{aiPageFiltering:c},tree:b,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),I!==T&&(P=!0);let F=await h.getElementLocation({browserState:I,goal:y,screenshot:G,source:a,memory:S?s:void 0},{disableCache:t,abortSignal:f,loggerTags:ze(l),useMemory:S});l.debug({usedRag:P,result:F},"Got locator result");let ne=F.id>0;if(d?.details?.push({type:"AI_LOCATION",matched:ne,pageState:I,ragUsed:P,thoughts:F.thoughts}),!ne)throw new ta(`Could not find any relevant element: ${F.thoughts}`,F.updatedMemory?{type:"GCS_TRACES",traces:F.updatedMemory}:void 0);let{resolution:U,target:j,frameConfig:Se}=await m.createTargetFromA11yId({id:F.id,requirements:F.requirements,additionalElements:F.additionalElements,description:y,targetSource:"AI",logger:l});if(U.a11yNode?.properties?.hidden&&U.a11yNode?.properties?.hidden!=="false")throw new _("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: ${U.displayString}`);return S&&(F.updatedMemory?j.memory={type:"GCS_TRACES",traces:F.updatedMemory}:s&&(j.memory=s)),{thoughts:F.thoughts,target:j,resolution:U,frameConfig:Se,screenshot:G}}var RV=["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:"],SI="<select> element:",yI="text input or contenteditable element:",EI="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:",TI="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:",mS=[SI,yI,EI,TI,...RV];function bI(r,e){if(r===e)return!0;for(let t of mS){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(mS.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!mS.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function wV(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${SI} ${r}`;case"TYPE":return`${yI} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${EI}
4121
4121
  ${r}`;case"ELEMENT_CHECK":return`${TI}
4122
- ${r}`;default:return r}}var CV=15;async function lp({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=CV}){if(!r.assertion.trim())throw new _("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=RA(c),u=0,d=Date.now(),p,m,g;try{await zr({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 ie(l,n.abortSignal),h=Date.now();let f=!1;try{if(p=await zr({action:async()=>{let S=await vI(s,t,n.abortSignal);return m&&m.serializedTree===S.serializedTree&&m.screenshotBuff.equals(S.screenshotBuff)?(f=!0,p):(m=S,AI({command:r,state:S,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?.updatedMemory&&Tu(r,p.updatedMemory,t),p?.success)break;throw p?.thoughts?new _("AssertionFailureError",p.thoughts):new _("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(y){n.abortSignal.throwIfAborted(),g=y instanceof Error?y:new Error(`${y}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:y},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await zr({action:async()=>AI({command:r,state:await vI(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?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new _("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function vI(r,e,t){let[n,o]=await Promise.all([In(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function AI({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,y=f.toString("base64"),S=u.url(),T=r.contextChoice??"MULTIMODAL",b=g;T!=="VISION_ONLY"&&(b=await Bi({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:y,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),b!==g&&(m.ragUsed=!0),m.pageState=b);let R={goal:r.assertion,url:S,memory:o?r.cache?.memory:void 0,browserState:b,screenshot:y,contextChoice:T,source:c},x=await(T==="VISION_ONLY"?(I,P)=>d.getVisualAssertionResult(I,P):(I,P)=>d.getAssertionResult(I,P))(R,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:ze(l)});return(x.result||i)&&x.relevantElements&&(m.relevantElementsSerialized=x.relevantElements.map(I=>u.getSerializedFormFromA11yId(I)).filter(I=>!!I),await xV(x.relevantElements,u,l)),{success:x.result,thoughts:x.thoughts,afterScreenshotOverride:f,updatedMemory:o?x.updatedMemory:void 0}}async function xV(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 H(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 _V=75e4,cp=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function RI(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await IV(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof cp?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 ie(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function IV(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await ie(o.smartWaitingTimeout,n);return}if(!e.description)throw new _("UserConfigurationError","Cannot locate element with empty description");await H(PV(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function PV(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await zr({action:async()=>MV(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function MV(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 or({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await In(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(St(p)>_V)throw new cp;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(S){throw new _("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: ${S instanceof Error?S.message:S}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let y=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:ze(n)});return n.debug({result:y},"Got smart waiting result"),y.isPageReady}var OV=3e4;async function wI({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??OV/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Aa(r.url)&&(s=r.url),t&&Ra(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new _("ActionFailureError",`Invalid URL: ${r.url}`);let l=await H((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 _("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 _("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new _("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new _("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 Bo=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([In(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 Bi({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:{...ze(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([In(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 Bi({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:{...ze(a)},langfuseSessionId:s})}catch(g){throw new _("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return In(this.browser,e)}async locateElement(e){return await gS({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return zr({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 _("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 zr({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&&Sm(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Tm(i)||ym(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(bm(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof hn&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof _?n:new _("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 _("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 ie(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,y=!1,S=CI(e.cache);if((!S||l)&&!em(o))throw new _("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"),y=!0,S=void 0),S&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&S.targetSource==="HEURISTIC_HEALED"&&(y=!0,S=void 0),S?.inputDescription&&!bI(o.elementDescriptor,S.inputDescription)&&(g.warn({old:S.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),y=!0,S=void 0);let T=R=>!!R&&ac(R),b=!0;if(!T(S)){b=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:y,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(y||!i)&&await RI({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let R;try{R=await gS({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 ta&&I.updatedLocatorMemory){let P={id:-1,...i,memory:I.updatedLocatorMemory};Eu({cmd:c,key:d,newTarget:P,logger:g,updatedWithAI:!0})}throw new _("ActionFailureError",I.message)}R.frameConfig&&this.browser.setActiveFrameConfig(R.frameConfig);let C=s.disableGlobalLocatorRedirect?{locator:R.resolution.locator}:await this.attemptLocatorRedirect(R.resolution.locator,g),x=await a(C);return Eu({cmd:c,key:d,newTarget:R.target,logger:g,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),R.target.targetSource="AI_HEALED",R.target.targetUpdateTime=new Date().toUTCString(),R.target.targetUpdateLoggerTags=ze(g)),{result:x,elementInteractedDisplayString:R.resolution.displayString,thoughts:R.thoughts}}try{let R=await this.browser.resolveTarget(t,S,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(R.locator);let C=s.disableGlobalLocatorRedirect?{locator:R.locator}:await this.attemptLocatorRedirect(R.locator,g),x=await a(C);if(Yt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.23.0"]),Eu({cmd:c,key:d,newTarget:S,logger:g,updatedWithAI:!1}),b){let I=R.decisions.filter(P=>P.matched);if(I.length!==1)g.warn({decisions:R.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let P=I[0].type;n.recordTargetAutoHeal({healType:P})}}return{result:x,elementInteractedDisplayString:R.displayString}}catch(R){this.throwIfClosed(),Yt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.23.0"]);let C=!1;if((R instanceof hn||Sm(R)||Tm(R)||bm(R)||cE(R)||ym(R)||uE(R))&&(C=!0),R instanceof _&&!C)throw g.error({err:R},"Failed to execute action with cached target (fatal)"),R;if(f>0&&o){g.info({err:R},"Failed to execute action with cached target, retrying with AI");let x;return S.memory&&sc(S.memory)&&(x=S.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:x,retriesWithAI:f,targetHealingInProgress:!0}})}throw new _("ActionFailureError",R.message,{errOptions:{cause:R}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return fl(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await ie(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 _("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&&wy(n)?await this.browser.waitForDOMStability({timeout:xe}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:le}),this.options?.autoFollowNewTabs&&await Gx({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{pR(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Hf(e)}}async resolveCommandTemplateStrings(e,t){return Wu({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()?lp({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 _("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new _("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return lp({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new _("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=av(n.schema);if(f)throw new _("UserConfigurationError",f)}let g=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let f=await this.generator.getTextExtraction({goal:n.goal,browserState:g,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:ze(a)});if(f.result==="NOT_FOUND")throw new _("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new _("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let y=f.message;throw y.includes("MaxGenerationLengthExceededError")?new _("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."):y.includes("AIProviderError")&&y.includes("time")?new _("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:f}}):f}}case"NAVIGATE":if(!Aa(n.url)&&!Ra(n.url,this.browser.baseUrl))throw new _("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let c=await this.browser.solveCaptcha();c&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:g=>this.browser.click(g,this.createCallbacksForBrowser(this.orgId),{}),options:{...n,targetName:"target",disableCache:i}}),await this.browser.type(c,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let g,h;if(n.target&&dn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:b=>this.browser.hover(b),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});g=S,h=T}let f=this.browser.getViewport()?.height??jt.height,y=this.browser.getViewport()?.width??jt.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??f));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??f);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??y));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??y);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new _("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let g=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:g},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new _("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=n.delay*1e3;await ie(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(dn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let g=this.browser.url(),{elementInteractedDisplayString:h,result:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:T=>this.browser.click(T,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:y,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return Du(g,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}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(dn(n.fromTarget)&&dn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(dn(n.fromTarget)||dn(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:g,thoughts:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(f,y)=>this.browser.dragAndDrop(f.locator,y.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g[0],thoughts:h}}case"MOUSE_DRAG":{let g=parseInt(n.deltaX),h=parseInt(n.deltaY),f=n.steps??5;if(isNaN(g)||isNaN(h))throw new _("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&dn(n.target)){await this.browser.mouseDragUsingVisualCoordinates(g,h,f,n.target.pixels,{force:n.force});break}let y,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:T,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async R=>this.browser.mouseDrag(g,h,f,R.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});y=T,S=b}else await this.browser.mouseDrag(g,h,f,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:y,thoughts:S}}case"SELECT_OPTION":{if(!io(n.target))throw new Error("Select with x/y is not supported yet");let g=n.target.elementDescriptor,h=n.choice,{elementInteractedDisplayString:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:g},cache:n.cache?.target,action:S=>this.browser.selectOption(S,h,n.force),options:{...n,targetName:"target",disableCache:i,source:ri(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:y}}case"TAB":{let g={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,g);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let u=await this.browser.setCookie(n.value);a.debug({results:u},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let g;try{n.environment==="BROWSER"?(g=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:g},"Executed JavaScript in browser")):g=await _o({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){a.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:h,logger:a})}}})}catch(h){throw this.throwIfClosed(),new _("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(g)}catch(h){throw new _("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:g}}case"TYPE":{if(n.target&&dn(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 g=this.browser.url(),h,f,y=CI(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(y){let{elementInteractedDisplayString:b,thoughts:R}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:y,cache:n.cache?.target,action:C=>this.browser.typeIntoTarget(n.value,C,{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:!S,source:ri(n)}});h=b,f=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 T={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:f};return Du(g,T.urlAfterCommand)&&(T.succeedImmediately=!0,T.succeedImmediatelyReason="URL changed"),T}case"HOVER":{if(dn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:g,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.hover(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"FOCUS":{if(!io(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:g,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.focus(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"BLUR":{if(n.target&&!io(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:g,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:f=>this.browser.blur(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"PRESS":let d=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Du(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;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 g=new NV,h=LV(fetch,g),f;try{f=new URL(n.url).hostname}catch{}return{data:{...await ER({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:h}),cookies:yT(g,f)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await wI({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return yR({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:g=>this.wrapElementTargetingCommand(g)});case"FILE_UPLOAD":{let g,h;if(n.fileSource.type==="URL"?(h=n.fileSource.url,g=await o_({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(h=n.fileSource.name,g=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!g)throw new _("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...g,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let g;if(!n.storageState.trim())g=void 0;else if(g=await _o({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof g!="object")throw new _("ActionFailureError",`Credentials must evaluate to an object (received ${typeof g} instead)`);let h;try{h=Wc.optional().parse(g)}catch(f){throw new _("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let g=(n.timeout??pn)*1e3,h=this.generator.getAgentConfig()?.assertion;if(fR(n.assertion)&&!n.useSelector&&n.target.type==="description"&&h&&h!=="v1"){let y={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 S=await lp({command:y,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: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{y.cache?.memory&&Tu(n,y.cache?.memory.traces,a)}}let f=await hR({command:n,tracer:t,timeoutMs:g,targetingWrapper:y=>this.wrapElementTargetingCommand(y),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!f.success,data:f.data,elementInteracted:f.elementInteractedDisplayString,thoughts:f.err?.message??f.thoughts??`Element assertion ${f.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let g=await zr({action:async()=>Ku({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:!g.success,data:g.data,thoughts:g.success?"Page assertion passed.":g.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let g=new ko(n.requestMatcher),h=this.browser.registerRequestListener(g);return this.registeredListeners[n.key]=h.then(async f=>await Wf(f)).catch(f=>{a.error({err:f},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let g=this.registeredListeners[n.key];if(!g)throw new _("ActionFailureError",`No listener registered with key: ${n.key}`);let h=n.timeout??10;return{data:await H(g,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let g=new ko(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,g,{onRequestStart:(h,f)=>{this.recordedRequests[n.key][h]=Jd(f)},onRequestComplete:(h,f)=>{this.recordedRequests[n.key][h]=Jd(f)}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let g=this.recordedRequests[n.key];if(!g)throw new _("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(g),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let g;return n.requestMatcher&&(g=new ko(n.requestMatcher)),this.browser.setHeader(n.name,n.value,g),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new ko(n.requestMatcher),async(h,f)=>{let y=await _o({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:h,response:f},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=LT.parse(y);return new Response(S.body,{status:S.status,headers:S.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(g=>{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:ze(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 np({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:ze(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ze(this.logger)})}};import{cloneDeep as DV}from"lodash-es";var kV={showOverlay:!1},up=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:n,clientIp:o,browserBehavior:DV(kV),socket:a}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){t.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){t.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function xI(r,e,t,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(h,f)=>{if(!h.closed&&!h.isInPageLoad)try{let y=c;c=void 0;let S=h.url(),T=f.toEditorDisplayCopy();JSON.stringify(T)===JSON.stringify(a)&&S===l&&o>i||(r.emit("browserState",{logsPerPage:y?.logsPerPage,harPages:y?.harPages,harEntries:y?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:s??[],context:T,isInPageLoad:h.isInPageLoad}),o=Date.now()),l=S,a=T}catch(y){if(!r.connected)return;let S=y instanceof Error?y.message:`${y}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:y,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=n.getSession(e),f=h?.controller?.browser;if(!f||f.closed){t.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,h.context)},1e3),m=(h,f)=>!!(JSON.stringify(h)!==JSON.stringify(s)||f.logsPerPage.some(y=>y.length>0)||f.harPages&&Object.keys(f.harPages).length>0||f.harEntries&&Object.keys(f.harEntries).length>0),g=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(g);return}else if(u)return;u=!0;try{let y=await f.getAllFrameUrls(),S=f.retrieveAndClearDebugData();m(y,S)&&(s=y,c=S,i=Date.now())}catch(y){t.warn({err:y},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,g]}}var UV=3;async function _I({socket:r,logger:e,storageFactory:t,uploadedFileStorage:n,visualDiffScreenshotStorage:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=r.id,g=r.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let h=await u({type:"e2e",testId:g}),f=await d?.();e=e.child({testId:g,orgId:h,sessionId:m,branch:f});let y=await a(h,e),S=await s(h,e),T=await l(h,e),b=await t(h),{testMetadata:R,baseUrl:C,envName:x,browserConfig:I,aiSettings:P,environmentVariables:$,localCodeEvalTools:G}=await zi({testId:g,orgId:h,logger:e,storage:b,authorization:c,settings:T}),F=p.getSession(m);if(F)return e.info("Associating connection with existing session (likely reconnect)"),await F.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:h,testId:g};let ne=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:ne,event:"connect",args:r.handshake.query},"Websocket event (connect)"),ne&&p.getCurrentConnectionsByIp(ne)>=UV)throw e.error({clientIp:ne,sessions:p.getCurrentSessionsByIp(),...r.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(ne);try{await FV({socket:r,baseUrl:C,envName:x,testMetadata:R,orgId:h,sessionId:m,logger:e,environmentVariables:$,clientIp:ne,devicePixelRatio:i,storage:b,uploadedFileStorage:n,visualDiffScreenshotStorage:o,localCodeEvalTools:G,generator:y,enricher:S,browserConfig:I,aiSettings:P,globalE2eStateManager:p})}catch(U){throw e.warn({err:U},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(ne),U}return{type:"e2e",sessionId:m,testId:g,orgId:h}}async function FV({socket:r,baseUrl:e,envName:t,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:g,aiSettings:h,clientIp:f,enricher:y,globalE2eStateManager:S}){let T={viewport:o.advanced?.viewport??jt,locale:o.advanced?.locale??uo,timezoneId:o.advanced?.timezone??po,geolocation:o.advanced?.geolocation??mo,colorScheme:o.advanced?.colorScheme};n&&(T.deviceScaleFactor=n);let b=o.id,R=await qd({settings:g,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:b});let C=await Vr.init({baseUrl:e,userBrowserSettings:R,enricher:y,storage:c,logger:s,contextArgs:T,iconKnowledgeBase:null,callbacks:{onTabsChange:(G,F)=>{r.emit("tabs",{tabs:G,activeTab:F})},onScreencastFrame:(G,F)=>{let ne=r;Or&&(ne=r.compress(!0)),ne.emit("screenshot",{buffer:G},()=>{F()})},onSvgsCollected:G=>{r.emit("newIconDetected",{numIcons:G.newSvgs.length}),c.saveNewIcons(G,s)}}});await C.navigate({url:e,initialNavigation:!0});let x=new Bo({browser:C,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:R.slowMoMs,autoFollowNewTabs:R.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),I=xI(r,a,s,S),P=async()=>{I.timers.forEach(G=>clearInterval(G))},$=new tr({baseUrl:e,testName:o.name,currentUrl:x.browser.url(),variablesFromEnvironment:m,envName:t});if(!r.connected)throw await C.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:Vr.USER_AGENT,viewport:x.browser.getViewport(),sessionId:a}),S.registerSession({controller:x,context:$,sessionId:a,cleanup:P,clientIp:f,socket:r})}async function zi({testId:r,orgId:e,logger:t,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(r,t);if(!a)throw new Error(`Test metadata could not found for test ${r}`);let s;o?.type==="API_KEY"&&(s=new Tn({httpClient:new Dt({...o,logger:t,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(h=>h.default),l;c&&(l=await n.fetchEnvironment(c.name,t));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced},p=a.baseUrl||l?.variables?.[yt];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await Kd({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:t,localTools:s});let g={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:g}}var hS=class{parentTracer=null;socket;step;orgId;constructor({step:e,socket:t,parentTracer:n,orgId:o}){this.socket=t,this.parentTracer=n,this.step=e,this.orgId=o}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Yt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new Xn({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},Xn=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,t]of Object.entries(this.stepFrequenciesByType))Yt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:t,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=t,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new hS({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},dp=class{constructor(e,t,n,o){this.socket=e;this.storage=t;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}attachConsoleLogs(){}attachNetworkLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new Xn({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new Xn({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new Xn({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var fS={currentlyExecutingRequests:{}},zV=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.settingsFactory(o,r.logger),a=await r.storageFactory(o),s,c=await zi({testId:n,orgId:o,logger:r.logger,storage:a,authorization:r.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=fS.currentlyExecutingRequests[l]??0;fS.currentlyExecutingRequests[l]=u+1,s=await HV({...r,...e,...c,done:t})}finally{r.logger.info({result:s,sessionId:r.metadata.sessionId},"Test execution complete"),fS.currentlyExecutingRequests[l]--}},HV=async({socket:r,steps:e,baseUrl:t,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:g,localCodeEvalTools:h,done:f,cacheStorageFactory:y,globalE2eStateManager:S})=>{let{testId:T,sessionId:b,orgId:R}=u,C=b,x=S.getSession(b);if(!x)throw new Error("No active session found");let{controller:I,context:P}=x;I.setOpen(),d=d.child({testId:T,orgId:R,sessionId:b,runId:C}),d.info({steps:e.map(te=>`${te.type}${"command"in te?` - ${te.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:t,context:P,browserConfig:l,aiSettings:c},"Socket execution parameters");let $=g??{},G=async()=>{o&&(await I.browser.reset({newUrl:t}),P.reset({baseUrl:t,currentUrl:I.browser.url(),variablesFromEnvironment:$,envName:p,testName:m}))},F=await s(R),ne=await y(R),U=async()=>{try{await ne.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:T,stepLists:{steps:e},logger:d})}catch(te){d.error({err:te},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await al({promiseGenerator:async()=>Promise.all([G(),U()]),signal:I.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),I.setOpen()}catch(te){if(r.emit("finished"),te.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${te}`)}let j=BV(e),Se={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},W={orgId:R,runId:C,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},Qe={controller:I,context:P,storage:F,codeEvalTools:h,usageTracker:new ua,logger:d},ke={test:{},step:{onDynamicAIActionStatusUpdateEvent:te=>{r.emit("dynamicCommandStatusUpdate",te)},onDynamicAIActionEvaluatingEvent:te=>{r.emit("dynamicCommandEvaluating",te)},onDynamicCommandGenerated:te=>{r.emit("dynamicCommandGenerated",te)},onDynamicCommandExecuted:te=>{r.emit("dynamicCommandExecuted",te)}}},ct=new dp(r,F,R,T),Mt=await Wd({fixtures:Qe,options:Se,callbacks:ke,inputs:W,testParams:{tracer:ct}}),we={logger:d,cacheStorage:ne,orgId:R,testId:T,originalStepsWithCaches:{steps:j},updatedStepsWithCaches:{steps:e}};return Mt?.status==="PASSED"?await Pu(we):Mt?.status==="FAILED"&&await Mu(we),await ct.finish(),f?.(Mt),Mt.status};var II={event:"execute",createHandler:zV};import{cloneDeep as GV}from"lodash-es";var jV=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=GV(e),s=Vv(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){t?.({result:s});return}"cache"in a&&(a.cache=void 0);try{let l=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});t?.({result:l})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),t?.({result:void 0})}}},PI={event:"lintStep",createHandler:jV};var VV=({metadata:r,logger:e,storageFactory:t,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=r;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:g}=p;m.setOpen();let h=await t(i),f=si.parse(u.advanced??{}),y={},S;if(c){if("useSelector"in l&&l.useSelector)try{let T=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);S=T.resolution.locator,y={target:T.target,thoughts:T.thoughts}}catch(T){e.warn({err:T},"Failed resolving target with selector"),s({err:`Failed locating element: ${T.message}`,decisions:T instanceof gn?T.decisions:void 0});return}else try{let T=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:g,source:ri(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&sc(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});y={target:T.target,thoughts:T.thoughts},S=T.resolution.locator}catch(T){(async()=>{try{let b=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:T,html:b.slice(0,1e5)},"Failed locating element with AI")}catch(b){e.warn({err:b},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${T.message}`});return}if(l.type==="SELECT_OPTION"&&S)try{y.options=await m.browser.getSelectOptions(S)}catch(T){e.warn({err:T},"Failed getting select options"),s({err:`Failed getting select options: ${T.message}`});return}e.info({result:y},"Locate handler result")}if(d)try{let{buffer:T,width:b,height:R}=await m.screenshotWithDimensions({clearHighlights:!0,locator:S}),C=await h.uploadScreenshot(T);y.screenshot={data:C,width:b,height:R},e.info({width:b,height:R},"Captured screenshot during locate")}catch(T){e.error({err:T},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${T.message}`});return}if(s({result:y}),S)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(S),m.browser.highlight(S)])}catch(T){e.warn({err:T},"Error highlighting element, continuing...")}}},MI={event:"locate",createHandler:VV};var $V=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({event:o,percentX:i,percentY:a})=>{let s=t.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},OI={event:"mouseClickEvent",createHandler:$V};var WV=({metadata:r,generatorFactory:e,logger:t,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,t);p.setOpen(),d.browserBehavior.showOverlay=!0;let g=new AbortController;g.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(y){t.warn({err:y},"Failed to stop record mode in target click socket handler")}},{once:!0});let h=!1,f=(y,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:y,stepId:c,parentStepIdChain:l,command:S.command,attribute:u}),g.abort(),h=!0)};setTimeout(()=>{h||(g.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:t,testId:s,orgId:a,callbacks:{onActionReceived:y=>f("clickReceived",y),onStepRecorded:y=>f("descriptionGenerated",y)}},abortController:g,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},LI={event:"recordTargetClick",createHandler:WV};var qV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},NI={event:"keyDownEvent",createHandler:qV};var KV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},DI={event:"keyUpEvent",createHandler:KV};var YV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=t.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let g=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),h=u.browserBehavior.recordingState?.transformer;h&&g&&h.recordScroll(g);return}p.showOverlay&&a(m,l);try{let g=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=g}catch(g){c++,c%5===0&&e.warn({err:g,mouseErrors:c},"Error in socket mouse move handler")}}},kI={event:"mouseMoveEvent",createHandler:YV};var XV=({metadata:r,generatorFactory:e,socket:t,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,g=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(h,f)=>{t.emit("stepRecorded",{stepId:c,step:h,offset:f})},onStepRecorded:(h,f)=>{t.emit("stepRecorded",{stepId:c,step:h,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:g}}},UI={event:"recordingStart",createHandler:XV};var JV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{let o=t.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},FI={event:"recordingStop",createHandler:JV};var QV=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;t.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,t),m=await n(d),{baseUrl:g}=await zi({testId:l,orgId:d,logger:t,storage:m,authorization:o,settings:p}),h=a.getSession(u);if(!h){r.emit("error",{message:"No session to refresh"});return}let{controller:f}=h;f.setOpen(),await f.browser.refresh();let y=f.browser.getViewport();t.info({baseUrl:g,viewport:y},`Session refreshed for test ${l} at ${g}`),c()},BI={event:"refresh",createHandler:QV};var ZV=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;t.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,t),d=await n(l),{baseUrl:p,envName:m,testName:g,environmentVariables:h}=await zi({testId:s,orgId:l,logger:t,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){r.emit("error",{message:"No session to reset"});return}let{controller:y,context:S}=f;await y.browser.reset({newUrl:p});let T=y.browser.baseUrl;S.reset({baseUrl:T,currentUrl:y.browser.url(),variablesFromEnvironment:h,envName:m,testName:g});let b=y.browser.getViewport(),R=Vr.USER_AGENT;t.info({baseUrl:p,viewport:b},`Session reset for test ${s} at ${T}`),r.emit("session",{url:T,userAgent:R,viewport:b,sessionId:c})},zI={event:"reset",createHandler:ZV};var e$=({metadata:r,globalE2eStateManager:e})=>{let{sessionId:t}=r;return async({url:n})=>{let o=e.getSession(t);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},HI={event:"switchTab",createHandler:e$};async function GI(r){return _I(r)}var jI=[oR,II,MI,zI,BI,tR,HI,PI,LI,UI,FI,kI,OI,NI,DI,nR,rR];var VI=r=>{let{logger:e}=r,t=new t$(r.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await GI({...r,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}jI.forEach(i=>r$(i,{...r,socket:n,metadata:o,logger:e}))}),t},r$=(r,e)=>{let t=r.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(r.event)||e.logger.debug({...e.metadata,event:r.event},`Websocket event (${r.event})`);let i=a=>{e.logger.error({event:r.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=t.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(r.event,n)};import{Router as s$}from"express";import{Router as o$}from"express";import ql from"fs";import Wl from"path";import{v4 as i$}from"uuid";import a$ from"yaml";import{hostname as n$}from"os";var $l="2.23.0",Xe=fa({app:"desktop-server",hostname:n$(),disableConsoleLogs:!0}).child({cliVersion:$l});(async()=>{try{let r=await Wn(Xe);r.gitBranchName&&Xe.addBinding("branch",r.gitBranchName)}catch{}})();var Za=o$();async function SS(r){return(await Hu(r,Xe)).map(n=>{let o=r.modules[n.moduleId];if(!o){E.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Za.get("/",Re(async(r,e)=>{let t=ae(),n=await J(t),o=await SS(n);e.status(200).json(o)}));Za.post("/",Re(async(r,e)=>{let t;try{t=JT.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{lo(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=ae(),o=(await J(n)).modules;if(Object.values(o).find(s=>s.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=Wl.join(n.rootDir,t.folderPath??"");if(!ql.existsSync(i)||!ql.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await zu({...t,folder:i,project:n});e.status(201).json(a)}));Za.get("/:moduleId",Re(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await J(ae()),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await tn(n,t,E);e.json(o)}catch(o){e.status(400).json({err:o})}}));Za.post("/:moduleId/duplicate",Re(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=XT.parse(r.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{lo(t.name)}catch(h){e.status(400).json({error:h.message});return}let n=ae(),o=await J(n),i=o.modules[r.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(h=>h.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let a=await tn(i,o,E),s=Wl.join(n.rootDir,Wl.dirname(i.relativePath));if(!ql.existsSync(s)||!ql.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=Le(t.name),l=Wl.join(s,`${c}.module.yaml`),u=i$(),{stepsToSave:d}=await pt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:vt()}}),p={fileType:pe.MODULE,schemaVersion:ve,moduleId:u,name:t.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=a$.stringify(p);ql.writeFileSync(l,m,"utf-8");let g={relativeFilePath:Wl.relative(n.rootDir,l)};e.status(201).json(g)}));Za.patch("/:moduleId/metadata",Re(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=QT.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=ae(),o=await J(n);NA({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:E,project:n}),e.status(201).json({message:"ok"})}));var $I=Za;var WI=s$();WI.get("/",Re(async(r,e)=>{let t=ae(),n=await J(t),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await SS(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var qI=WI;import{Router as l$}from"express";var yS=l$();yS.get("/",Re((r,e)=>{let t=Gu(ae(),Xe);e.status(200).json(t)}));yS.get("/names",Re((r,e)=>{let n=ae().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var KI=yS;import{Router as c$}from"express";var YI=c$();YI.get("/",Re((r,e)=>{let t={userId:wo(),orgId:vt(),cliVersion:$l??"0.0.0"};e.status(200).json(t)}));var XI=YI;import{StreamableHTTPServerTransport as hW}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as fW}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as SW}from"crypto";import{Router as yW}from"express";import{McpServer as mW}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as gW}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as g$}from"ai";import fp from"dedent";import{z as zo}from"zod";import{tool as u$}from"ai";import{z as d$}from"zod";var pp=(r,e)=>({builder:n=>u$({description:r.schema.description,inputSchema:d$.object(r.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${r.schema.name}`);try{await r.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.error({toolName:r.schema.name,input:o,err:a.content.map(s=>s.text).join(`
4122
+ ${r}`;default:return r}}var CV=15;async function lp({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=CV}){if(!r.assertion.trim())throw new _("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=RA(c),u=0,d=Date.now(),p,m,g;try{await zr({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 ie(l,n.abortSignal),h=Date.now();let f=!1;try{if(p=await zr({action:async()=>{let S=await vI(s,t,n.abortSignal);return m&&m.serializedTree===S.serializedTree&&m.screenshotBuff.equals(S.screenshotBuff)?(f=!0,p):(m=S,AI({command:r,state:S,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?.updatedMemory&&Tu(r,p.updatedMemory,t),p?.success)break;throw p?.thoughts?new _("AssertionFailureError",p.thoughts):new _("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(y){n.abortSignal.throwIfAborted(),g=y instanceof Error?y:new Error(`${y}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:y},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await zr({action:async()=>AI({command:r,state:await vI(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?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new _("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function vI(r,e,t){let[n,o]=await Promise.all([In(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function AI({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,y=f.toString("base64"),S=u.url(),T=r.contextChoice??"MULTIMODAL",b=g;T!=="VISION_ONLY"&&(b=await Bi({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:y,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),b!==g&&(m.ragUsed=!0),m.pageState=b);let R={goal:r.assertion,url:S,memory:o?r.cache?.memory:void 0,browserState:b,screenshot:y,contextChoice:T,source:c},x=await(T==="VISION_ONLY"?(I,P)=>d.getVisualAssertionResult(I,P):(I,P)=>d.getAssertionResult(I,P))(R,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:ze(l)});return(x.result||i)&&x.relevantElements&&(m.relevantElementsSerialized=x.relevantElements.map(I=>u.getSerializedFormFromA11yId(I)).filter(I=>!!I),await xV(x.relevantElements,u,l)),{success:x.result,thoughts:x.thoughts,afterScreenshotOverride:f,updatedMemory:o?x.updatedMemory:void 0}}async function xV(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 H(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 _V=75e4,cp=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function RI(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await IV(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof cp?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 ie(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function IV(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await ie(o.smartWaitingTimeout,n);return}if(!e.description)throw new _("UserConfigurationError","Cannot locate element with empty description");await H(PV(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function PV(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await zr({action:async()=>MV(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function MV(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 or({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await In(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(St(p)>_V)throw new cp;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(S){throw new _("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: ${S instanceof Error?S.message:S}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let y=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:ze(n)});return n.debug({result:y},"Got smart waiting result"),y.isPageReady}var OV=3e4;async function wI({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??OV/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Aa(r.url)&&(s=r.url),t&&Ra(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new _("ActionFailureError",`Invalid URL: ${r.url}`);let l=await H((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 _("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 _("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new _("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new _("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 Bo=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([In(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 Bi({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:{...ze(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([In(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 Bi({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:{...ze(a)},langfuseSessionId:s})}catch(g){throw new _("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return In(this.browser,e)}async locateElement(e){return await gS({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return zr({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 _("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 zr({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&&Sm(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Tm(i)||ym(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(bm(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof hn&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof _?n:new _("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 _("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 ie(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,y=!1,S=CI(e.cache);if((!S||l)&&!em(o))throw new _("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"),y=!0,S=void 0),S&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&S.targetSource==="HEURISTIC_HEALED"&&(y=!0,S=void 0),S?.inputDescription&&!bI(o.elementDescriptor,S.inputDescription)&&(g.warn({old:S.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),y=!0,S=void 0);let T=R=>!!R&&ac(R),b=!0;if(!T(S)){b=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:y,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(y||!i)&&await RI({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let R;try{R=await gS({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 ta&&I.updatedLocatorMemory){let P={id:-1,...i,memory:I.updatedLocatorMemory};Eu({cmd:c,key:d,newTarget:P,logger:g,updatedWithAI:!0})}throw new _("ActionFailureError",I.message)}R.frameConfig&&this.browser.setActiveFrameConfig(R.frameConfig);let C=s.disableGlobalLocatorRedirect?{locator:R.resolution.locator}:await this.attemptLocatorRedirect(R.resolution.locator,g),x=await a(C);return Eu({cmd:c,key:d,newTarget:R.target,logger:g,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),R.target.targetSource="AI_HEALED",R.target.targetUpdateTime=new Date().toUTCString(),R.target.targetUpdateLoggerTags=ze(g)),{result:x,elementInteractedDisplayString:R.resolution.displayString,thoughts:R.thoughts}}try{let R=await this.browser.resolveTarget(t,S,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(R.locator);let C=s.disableGlobalLocatorRedirect?{locator:R.locator}:await this.attemptLocatorRedirect(R.locator,g),x=await a(C);if(Yt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.23.1"]),Eu({cmd:c,key:d,newTarget:S,logger:g,updatedWithAI:!1}),b){let I=R.decisions.filter(P=>P.matched);if(I.length!==1)g.warn({decisions:R.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let P=I[0].type;n.recordTargetAutoHeal({healType:P})}}return{result:x,elementInteractedDisplayString:R.displayString}}catch(R){this.throwIfClosed(),Yt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!S.requirements}`,`hasAdditionalElements:${!!S.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.23.1"]);let C=!1;if((R instanceof hn||Sm(R)||Tm(R)||bm(R)||cE(R)||ym(R)||uE(R))&&(C=!0),R instanceof _&&!C)throw g.error({err:R},"Failed to execute action with cached target (fatal)"),R;if(f>0&&o){g.info({err:R},"Failed to execute action with cached target, retrying with AI");let x;return S.memory&&sc(S.memory)&&(x=S.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:x,retriesWithAI:f,targetHealingInProgress:!0}})}throw new _("ActionFailureError",R.message,{errOptions:{cause:R}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return fl(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await ie(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 _("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&&wy(n)?await this.browser.waitForDOMStability({timeout:xe}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:le}),this.options?.autoFollowNewTabs&&await Gx({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{pR(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Hf(e)}}async resolveCommandTemplateStrings(e,t){return Wu({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()?lp({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 _("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new _("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return lp({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new _("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=av(n.schema);if(f)throw new _("UserConfigurationError",f)}let g=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let f=await this.generator.getTextExtraction({goal:n.goal,browserState:g,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:ze(a)});if(f.result==="NOT_FOUND")throw new _("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new _("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let y=f.message;throw y.includes("MaxGenerationLengthExceededError")?new _("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."):y.includes("AIProviderError")&&y.includes("time")?new _("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:f}}):f}}case"NAVIGATE":if(!Aa(n.url)&&!Ra(n.url,this.browser.baseUrl))throw new _("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let c=await this.browser.solveCaptcha();c&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:g=>this.browser.click(g,this.createCallbacksForBrowser(this.orgId),{}),options:{...n,targetName:"target",disableCache:i}}),await this.browser.type(c,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let g,h;if(n.target&&dn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:b=>this.browser.hover(b),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});g=S,h=T}let f=this.browser.getViewport()?.height??jt.height,y=this.browser.getViewport()?.width??jt.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??f));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??f);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??y));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??y);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new _("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let g=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:g},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new _("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=n.delay*1e3;await ie(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(dn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let g=this.browser.url(),{elementInteractedDisplayString:h,result:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:T=>this.browser.click(T,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:y,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return Du(g,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}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(dn(n.fromTarget)&&dn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(dn(n.fromTarget)||dn(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:g,thoughts:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(f,y)=>this.browser.dragAndDrop(f.locator,y.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g[0],thoughts:h}}case"MOUSE_DRAG":{let g=parseInt(n.deltaX),h=parseInt(n.deltaY),f=n.steps??5;if(isNaN(g)||isNaN(h))throw new _("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&dn(n.target)){await this.browser.mouseDragUsingVisualCoordinates(g,h,f,n.target.pixels,{force:n.force});break}let y,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:T,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async R=>this.browser.mouseDrag(g,h,f,R.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});y=T,S=b}else await this.browser.mouseDrag(g,h,f,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:y,thoughts:S}}case"SELECT_OPTION":{if(!io(n.target))throw new Error("Select with x/y is not supported yet");let g=n.target.elementDescriptor,h=n.choice,{elementInteractedDisplayString:f,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:g},cache:n.cache?.target,action:S=>this.browser.selectOption(S,h,n.force),options:{...n,targetName:"target",disableCache:i,source:ri(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:y}}case"TAB":{let g={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,g);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let u=await this.browser.setCookie(n.value);a.debug({results:u},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let g;try{n.environment==="BROWSER"?(g=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:g},"Executed JavaScript in browser")):g=await _o({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){a.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:h,logger:a})}}})}catch(h){throw this.throwIfClosed(),new _("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(g)}catch(h){throw new _("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:g}}case"TYPE":{if(n.target&&dn(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 g=this.browser.url(),h,f,y=CI(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(y){let{elementInteractedDisplayString:b,thoughts:R}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:y,cache:n.cache?.target,action:C=>this.browser.typeIntoTarget(n.value,C,{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:!S,source:ri(n)}});h=b,f=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 T={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:f};return Du(g,T.urlAfterCommand)&&(T.succeedImmediately=!0,T.succeedImmediatelyReason="URL changed"),T}case"HOVER":{if(dn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:g,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.hover(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"FOCUS":{if(!io(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:g,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.focus(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"BLUR":{if(n.target&&!io(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:g,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:f=>this.browser.blur(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:h}}case"PRESS":let d=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Du(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;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 g=new NV,h=LV(fetch,g),f;try{f=new URL(n.url).hostname}catch{}return{data:{...await ER({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:h}),cookies:yT(g,f)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await wI({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return yR({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:g=>this.wrapElementTargetingCommand(g)});case"FILE_UPLOAD":{let g,h;if(n.fileSource.type==="URL"?(h=n.fileSource.url,g=await o_({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(h=n.fileSource.name,g=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!g)throw new _("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...g,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let g;if(!n.storageState.trim())g=void 0;else if(g=await _o({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof g!="object")throw new _("ActionFailureError",`Credentials must evaluate to an object (received ${typeof g} instead)`);let h;try{h=Wc.optional().parse(g)}catch(f){throw new _("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let g=(n.timeout??pn)*1e3,h=this.generator.getAgentConfig()?.assertion;if(fR(n.assertion)&&!n.useSelector&&n.target.type==="description"&&h&&h!=="v1"){let y={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 S=await lp({command:y,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: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{y.cache?.memory&&Tu(n,y.cache?.memory.traces,a)}}let f=await hR({command:n,tracer:t,timeoutMs:g,targetingWrapper:y=>this.wrapElementTargetingCommand(y),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!f.success,data:f.data,elementInteracted:f.elementInteractedDisplayString,thoughts:f.err?.message??f.thoughts??`Element assertion ${f.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let g=await zr({action:async()=>Ku({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:!g.success,data:g.data,thoughts:g.success?"Page assertion passed.":g.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let g=new ko(n.requestMatcher),h=this.browser.registerRequestListener(g);return this.registeredListeners[n.key]=h.then(async f=>await Wf(f)).catch(f=>{a.error({err:f},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let g=this.registeredListeners[n.key];if(!g)throw new _("ActionFailureError",`No listener registered with key: ${n.key}`);let h=n.timeout??10;return{data:await H(g,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let g=new ko(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,g,{onRequestStart:(h,f)=>{this.recordedRequests[n.key][h]=Jd(f)},onRequestComplete:(h,f)=>{this.recordedRequests[n.key][h]=Jd(f)}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let g=this.recordedRequests[n.key];if(!g)throw new _("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(g),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let g;return n.requestMatcher&&(g=new ko(n.requestMatcher)),this.browser.setHeader(n.name,n.value,g),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new ko(n.requestMatcher),async(h,f)=>{let y=await _o({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:h,response:f},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=LT.parse(y);return new Response(S.body,{status:S.status,headers:S.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(g=>{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:ze(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 np({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:ze(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ze(this.logger)})}};import{cloneDeep as DV}from"lodash-es";var kV={showOverlay:!1},up=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:n,clientIp:o,browserBehavior:DV(kV),socket:a}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(a){t.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){t.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function xI(r,e,t,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(h,f)=>{if(!h.closed&&!h.isInPageLoad)try{let y=c;c=void 0;let S=h.url(),T=f.toEditorDisplayCopy();JSON.stringify(T)===JSON.stringify(a)&&S===l&&o>i||(r.emit("browserState",{logsPerPage:y?.logsPerPage,harPages:y?.harPages,harEntries:y?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:s??[],context:T,isInPageLoad:h.isInPageLoad}),o=Date.now()),l=S,a=T}catch(y){if(!r.connected)return;let S=y instanceof Error?y.message:`${y}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:y,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=n.getSession(e),f=h?.controller?.browser;if(!f||f.closed){t.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,h.context)},1e3),m=(h,f)=>!!(JSON.stringify(h)!==JSON.stringify(s)||f.logsPerPage.some(y=>y.length>0)||f.harPages&&Object.keys(f.harPages).length>0||f.harEntries&&Object.keys(f.harEntries).length>0),g=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(g);return}else if(u)return;u=!0;try{let y=await f.getAllFrameUrls(),S=f.retrieveAndClearDebugData();m(y,S)&&(s=y,c=S,i=Date.now())}catch(y){t.warn({err:y},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,g]}}var UV=3;async function _I({socket:r,logger:e,storageFactory:t,uploadedFileStorage:n,visualDiffScreenshotStorage:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=r.id,g=r.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let h=await u({type:"e2e",testId:g}),f=await d?.();e=e.child({testId:g,orgId:h,sessionId:m,branch:f});let y=await a(h,e),S=await s(h,e),T=await l(h,e),b=await t(h),{testMetadata:R,baseUrl:C,envName:x,browserConfig:I,aiSettings:P,environmentVariables:$,localCodeEvalTools:G}=await zi({testId:g,orgId:h,logger:e,storage:b,authorization:c,settings:T}),F=p.getSession(m);if(F)return e.info("Associating connection with existing session (likely reconnect)"),await F.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:h,testId:g};let ne=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:ne,event:"connect",args:r.handshake.query},"Websocket event (connect)"),ne&&p.getCurrentConnectionsByIp(ne)>=UV)throw e.error({clientIp:ne,sessions:p.getCurrentSessionsByIp(),...r.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(ne);try{await FV({socket:r,baseUrl:C,envName:x,testMetadata:R,orgId:h,sessionId:m,logger:e,environmentVariables:$,clientIp:ne,devicePixelRatio:i,storage:b,uploadedFileStorage:n,visualDiffScreenshotStorage:o,localCodeEvalTools:G,generator:y,enricher:S,browserConfig:I,aiSettings:P,globalE2eStateManager:p})}catch(U){throw e.warn({err:U},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(ne),U}return{type:"e2e",sessionId:m,testId:g,orgId:h}}async function FV({socket:r,baseUrl:e,envName:t,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:g,aiSettings:h,clientIp:f,enricher:y,globalE2eStateManager:S}){let T={viewport:o.advanced?.viewport??jt,locale:o.advanced?.locale??uo,timezoneId:o.advanced?.timezone??po,geolocation:o.advanced?.geolocation??mo,colorScheme:o.advanced?.colorScheme};n&&(T.deviceScaleFactor=n);let b=o.id,R=await qd({settings:g,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:b});let C=await Vr.init({baseUrl:e,userBrowserSettings:R,enricher:y,storage:c,logger:s,contextArgs:T,iconKnowledgeBase:null,callbacks:{onTabsChange:(G,F)=>{r.emit("tabs",{tabs:G,activeTab:F})},onScreencastFrame:(G,F)=>{let ne=r;Or&&(ne=r.compress(!0)),ne.emit("screenshot",{buffer:G},()=>{F()})},onSvgsCollected:G=>{r.emit("newIconDetected",{numIcons:G.newSvgs.length}),c.saveNewIcons(G,s)}}});await C.navigate({url:e,initialNavigation:!0});let x=new Bo({browser:C,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:R.slowMoMs,autoFollowNewTabs:R.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),I=xI(r,a,s,S),P=async()=>{I.timers.forEach(G=>clearInterval(G))},$=new tr({baseUrl:e,testName:o.name,currentUrl:x.browser.url(),variablesFromEnvironment:m,envName:t});if(!r.connected)throw await C.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:Vr.USER_AGENT,viewport:x.browser.getViewport(),sessionId:a}),S.registerSession({controller:x,context:$,sessionId:a,cleanup:P,clientIp:f,socket:r})}async function zi({testId:r,orgId:e,logger:t,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(r,t);if(!a)throw new Error(`Test metadata could not found for test ${r}`);let s;o?.type==="API_KEY"&&(s=new Tn({httpClient:new Dt({...o,logger:t,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(h=>h.default),l;c&&(l=await n.fetchEnvironment(c.name,t));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced},p=a.baseUrl||l?.variables?.[yt];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await Kd({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:t,localTools:s});let g={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:g}}var hS=class{parentTracer=null;socket;step;orgId;constructor({step:e,socket:t,parentTracer:n,orgId:o}){this.socket=t,this.parentTracer=n,this.step=e,this.orgId=o}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Yt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new Xn({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},Xn=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,t]of Object.entries(this.stepFrequenciesByType))Yt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:t,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=t,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new hS({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},dp=class{constructor(e,t,n,o){this.socket=e;this.storage=t;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}attachConsoleLogs(){}attachNetworkLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new Xn({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new Xn({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new Xn({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var fS={currentlyExecutingRequests:{}},zV=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.settingsFactory(o,r.logger),a=await r.storageFactory(o),s,c=await zi({testId:n,orgId:o,logger:r.logger,storage:a,authorization:r.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=fS.currentlyExecutingRequests[l]??0;fS.currentlyExecutingRequests[l]=u+1,s=await HV({...r,...e,...c,done:t})}finally{r.logger.info({result:s,sessionId:r.metadata.sessionId},"Test execution complete"),fS.currentlyExecutingRequests[l]--}},HV=async({socket:r,steps:e,baseUrl:t,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:g,localCodeEvalTools:h,done:f,cacheStorageFactory:y,globalE2eStateManager:S})=>{let{testId:T,sessionId:b,orgId:R}=u,C=b,x=S.getSession(b);if(!x)throw new Error("No active session found");let{controller:I,context:P}=x;I.setOpen(),d=d.child({testId:T,orgId:R,sessionId:b,runId:C}),d.info({steps:e.map(te=>`${te.type}${"command"in te?` - ${te.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:t,context:P,browserConfig:l,aiSettings:c},"Socket execution parameters");let $=g??{},G=async()=>{o&&(await I.browser.reset({newUrl:t}),P.reset({baseUrl:t,currentUrl:I.browser.url(),variablesFromEnvironment:$,envName:p,testName:m}))},F=await s(R),ne=await y(R),U=async()=>{try{await ne.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:T,stepLists:{steps:e},logger:d})}catch(te){d.error({err:te},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await al({promiseGenerator:async()=>Promise.all([G(),U()]),signal:I.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),I.setOpen()}catch(te){if(r.emit("finished"),te.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${te}`)}let j=BV(e),Se={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},W={orgId:R,runId:C,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},Qe={controller:I,context:P,storage:F,codeEvalTools:h,usageTracker:new ua,logger:d},ke={test:{},step:{onDynamicAIActionStatusUpdateEvent:te=>{r.emit("dynamicCommandStatusUpdate",te)},onDynamicAIActionEvaluatingEvent:te=>{r.emit("dynamicCommandEvaluating",te)},onDynamicCommandGenerated:te=>{r.emit("dynamicCommandGenerated",te)},onDynamicCommandExecuted:te=>{r.emit("dynamicCommandExecuted",te)}}},ct=new dp(r,F,R,T),Mt=await Wd({fixtures:Qe,options:Se,callbacks:ke,inputs:W,testParams:{tracer:ct}}),we={logger:d,cacheStorage:ne,orgId:R,testId:T,originalStepsWithCaches:{steps:j},updatedStepsWithCaches:{steps:e}};return Mt?.status==="PASSED"?await Pu(we):Mt?.status==="FAILED"&&await Mu(we),await ct.finish(),f?.(Mt),Mt.status};var II={event:"execute",createHandler:zV};import{cloneDeep as GV}from"lodash-es";var jV=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=GV(e),s=Vv(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){t?.({result:s});return}"cache"in a&&(a.cache=void 0);try{let l=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});t?.({result:l})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),t?.({result:void 0})}}},PI={event:"lintStep",createHandler:jV};var VV=({metadata:r,logger:e,storageFactory:t,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=r;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:g}=p;m.setOpen();let h=await t(i),f=si.parse(u.advanced??{}),y={},S;if(c){if("useSelector"in l&&l.useSelector)try{let T=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);S=T.resolution.locator,y={target:T.target,thoughts:T.thoughts}}catch(T){e.warn({err:T},"Failed resolving target with selector"),s({err:`Failed locating element: ${T.message}`,decisions:T instanceof gn?T.decisions:void 0});return}else try{let T=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:g,source:ri(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&sc(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});y={target:T.target,thoughts:T.thoughts},S=T.resolution.locator}catch(T){(async()=>{try{let b=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:T,html:b.slice(0,1e5)},"Failed locating element with AI")}catch(b){e.warn({err:b},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${T.message}`});return}if(l.type==="SELECT_OPTION"&&S)try{y.options=await m.browser.getSelectOptions(S)}catch(T){e.warn({err:T},"Failed getting select options"),s({err:`Failed getting select options: ${T.message}`});return}e.info({result:y},"Locate handler result")}if(d)try{let{buffer:T,width:b,height:R}=await m.screenshotWithDimensions({clearHighlights:!0,locator:S}),C=await h.uploadScreenshot(T);y.screenshot={data:C,width:b,height:R},e.info({width:b,height:R},"Captured screenshot during locate")}catch(T){e.error({err:T},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${T.message}`});return}if(s({result:y}),S)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(S),m.browser.highlight(S)])}catch(T){e.warn({err:T},"Error highlighting element, continuing...")}}},MI={event:"locate",createHandler:VV};var $V=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({event:o,percentX:i,percentY:a})=>{let s=t.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},OI={event:"mouseClickEvent",createHandler:$V};var WV=({metadata:r,generatorFactory:e,logger:t,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,t);p.setOpen(),d.browserBehavior.showOverlay=!0;let g=new AbortController;g.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(y){t.warn({err:y},"Failed to stop record mode in target click socket handler")}},{once:!0});let h=!1,f=(y,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:y,stepId:c,parentStepIdChain:l,command:S.command,attribute:u}),g.abort(),h=!0)};setTimeout(()=>{h||(g.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:t,testId:s,orgId:a,callbacks:{onActionReceived:y=>f("clickReceived",y),onStepRecorded:y=>f("descriptionGenerated",y)}},abortController:g,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},LI={event:"recordTargetClick",createHandler:WV};var qV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},NI={event:"keyDownEvent",createHandler:qV};var KV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async({key:o})=>{let i=t.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},DI={event:"keyUpEvent",createHandler:KV};var YV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=t.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let g=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),h=u.browserBehavior.recordingState?.transformer;h&&g&&h.recordScroll(g);return}p.showOverlay&&a(m,l);try{let g=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=g}catch(g){c++,c%5===0&&e.warn({err:g,mouseErrors:c},"Error in socket mouse move handler")}}},kI={event:"mouseMoveEvent",createHandler:YV};var XV=({metadata:r,generatorFactory:e,socket:t,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=r;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,g=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(h,f)=>{t.emit("stepRecorded",{stepId:c,step:h,offset:f})},onStepRecorded:(h,f)=>{t.emit("stepRecorded",{stepId:c,step:h,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:g}}},UI={event:"recordingStart",createHandler:XV};var JV=({metadata:r,logger:e,globalE2eStateManager:t})=>{let{sessionId:n}=r;return async()=>{let o=t.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},FI={event:"recordingStop",createHandler:JV};var QV=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;t.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,t),m=await n(d),{baseUrl:g}=await zi({testId:l,orgId:d,logger:t,storage:m,authorization:o,settings:p}),h=a.getSession(u);if(!h){r.emit("error",{message:"No session to refresh"});return}let{controller:f}=h;f.setOpen(),await f.browser.refresh();let y=f.browser.getViewport();t.info({baseUrl:g,viewport:y},`Session refreshed for test ${l} at ${g}`),c()},BI={event:"refresh",createHandler:QV};var ZV=({socket:r,metadata:e,logger:t,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;t.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,t),d=await n(l),{baseUrl:p,envName:m,testName:g,environmentVariables:h}=await zi({testId:s,orgId:l,logger:t,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){r.emit("error",{message:"No session to reset"});return}let{controller:y,context:S}=f;await y.browser.reset({newUrl:p});let T=y.browser.baseUrl;S.reset({baseUrl:T,currentUrl:y.browser.url(),variablesFromEnvironment:h,envName:m,testName:g});let b=y.browser.getViewport(),R=Vr.USER_AGENT;t.info({baseUrl:p,viewport:b},`Session reset for test ${s} at ${T}`),r.emit("session",{url:T,userAgent:R,viewport:b,sessionId:c})},zI={event:"reset",createHandler:ZV};var e$=({metadata:r,globalE2eStateManager:e})=>{let{sessionId:t}=r;return async({url:n})=>{let o=e.getSession(t);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},HI={event:"switchTab",createHandler:e$};async function GI(r){return _I(r)}var jI=[oR,II,MI,zI,BI,tR,HI,PI,LI,UI,FI,kI,OI,NI,DI,nR,rR];var VI=r=>{let{logger:e}=r,t=new t$(r.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await GI({...r,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}jI.forEach(i=>r$(i,{...r,socket:n,metadata:o,logger:e}))}),t},r$=(r,e)=>{let t=r.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(r.event)||e.logger.debug({...e.metadata,event:r.event},`Websocket event (${r.event})`);let i=a=>{e.logger.error({event:r.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=t.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(r.event,n)};import{Router as s$}from"express";import{Router as o$}from"express";import ql from"fs";import Wl from"path";import{v4 as i$}from"uuid";import a$ from"yaml";import{hostname as n$}from"os";var $l="2.23.1",Xe=fa({app:"desktop-server",hostname:n$(),disableConsoleLogs:!0}).child({cliVersion:$l});(async()=>{try{let r=await Wn(Xe);r.gitBranchName&&Xe.addBinding("branch",r.gitBranchName)}catch{}})();var Za=o$();async function SS(r){return(await Hu(r,Xe)).map(n=>{let o=r.modules[n.moduleId];if(!o){E.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Za.get("/",Re(async(r,e)=>{let t=ae(),n=await J(t),o=await SS(n);e.status(200).json(o)}));Za.post("/",Re(async(r,e)=>{let t;try{t=JT.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{lo(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=ae(),o=(await J(n)).modules;if(Object.values(o).find(s=>s.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=Wl.join(n.rootDir,t.folderPath??"");if(!ql.existsSync(i)||!ql.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await zu({...t,folder:i,project:n});e.status(201).json(a)}));Za.get("/:moduleId",Re(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await J(ae()),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await tn(n,t,E);e.json(o)}catch(o){e.status(400).json({err:o})}}));Za.post("/:moduleId/duplicate",Re(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=XT.parse(r.body)}catch(h){e.status(400).json({error:`Invalid request body: ${h}`});return}try{lo(t.name)}catch(h){e.status(400).json({error:h.message});return}let n=ae(),o=await J(n),i=o.modules[r.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(h=>h.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let a=await tn(i,o,E),s=Wl.join(n.rootDir,Wl.dirname(i.relativePath));if(!ql.existsSync(s)||!ql.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=Le(t.name),l=Wl.join(s,`${c}.module.yaml`),u=i$(),{stepsToSave:d}=await pt({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:vt()}}),p={fileType:pe.MODULE,schemaVersion:ve,moduleId:u,name:t.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=a$.stringify(p);ql.writeFileSync(l,m,"utf-8");let g={relativeFilePath:Wl.relative(n.rootDir,l)};e.status(201).json(g)}));Za.patch("/:moduleId/metadata",Re(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=QT.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=ae(),o=await J(n);NA({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:E,project:n}),e.status(201).json({message:"ok"})}));var $I=Za;var WI=s$();WI.get("/",Re(async(r,e)=>{let t=ae(),n=await J(t),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await SS(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var qI=WI;import{Router as l$}from"express";var yS=l$();yS.get("/",Re((r,e)=>{let t=Gu(ae(),Xe);e.status(200).json(t)}));yS.get("/names",Re((r,e)=>{let n=ae().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var KI=yS;import{Router as c$}from"express";var YI=c$();YI.get("/",Re((r,e)=>{let t={userId:wo(),orgId:vt(),cliVersion:$l??"0.0.0"};e.status(200).json(t)}));var XI=YI;import{StreamableHTTPServerTransport as hW}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as fW}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as SW}from"crypto";import{Router as yW}from"express";import{McpServer as mW}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as gW}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as g$}from"ai";import fp from"dedent";import{z as zo}from"zod";import{tool as u$}from"ai";import{z as d$}from"zod";var pp=(r,e)=>({builder:n=>u$({description:r.schema.description,inputSchema:d$.object(r.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${r.schema.name}`);try{await r.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.error({toolName:r.schema.name,input:o,err:a.content.map(s=>s.text).join(`
4123
4123
  `)},"Tool execution resulted in error"):n.logger.info({toolName:r.schema.name,input:o},"Tool execution completed"),a}}),tool:r});var Kl=class{results=[];isError;addResult(e){this.results.push(e)}addError(e){this.results.push(`Error: ${e}`),this.isError=!0}getResult(){return this.results.join(`
4124
4124
  `)}async serialize(){let e=[];return this.results.length&&(e.push("### Result"),e.push(this.results.join(`
4125
4125
  `)),e.push("")),{content:[{type:"text",text:e.join(`
@@ -4450,7 +4450,7 @@ ${n}`}import w$ from"path";var bp=class{_result=[];_includeSnapshot=!1;_includeT
4450
4450
  ${o}`}async test(){if(!this._includeTest)return"";let e=await J(this._project),t=await lt(w$.join(this._project.rootDir,this._testPath),this._logger,e);try{let o=new Ke({baseUrl:hr(),apiKey:fr(),logger:this._logger}),i=await Dr(this._logger,o,this._project),a=Ro({orgId:vt(),client:o,gitMetadata:i,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1}),{steps:s,beforeSteps:c,afterSteps:l}=await bu({cacheStorage:a,logger:this._logger,schemaVersion:t.schemaVersion,stepLists:{steps:t.steps,beforeSteps:t.beforeSteps,afterSteps:t.afterSteps},testId:t.id});t.beforeSteps=c,t.steps=s,t.afterSteps=l}catch(o){this._logger.error({err:o},"Failed to resolve step cache entries for copilot test view")}let n=[];return n.push("### Test"),n.push(`Name: ${t.name}`),t.description&&n.push(`Description: ${t.description}`),n.push(""),t.beforeSteps&&t.beforeSteps.length>0&&(n.push(this.formatStepList(t.beforeSteps,"Setup Steps")),n.push("")),n.push(this.formatStepList(t.steps,"Main Steps")),t.afterSteps&&t.afterSteps.length>0&&(n.push(""),n.push(this.formatStepList(t.afterSteps,"Teardown Steps"))),n.join(`
4451
4451
  `)}addError(e){this._result.push(e),this._isError=!0}async serialize(){let e=[];this._result.length&&(e.push("### Result"),e.push(this._result.join(`
4452
4452
  `)),e.push(""));let t=await this.snapshot();t&&e.push(t,"");let n=this.testContext();n&&e.push(n,"");let o=await this.test();return o&&e.push(o,""),{content:[{type:"text",text:e.join(`
4453
- `)}],isError:this._isError}}};var Pt=r=>({builder:pp(r,t=>new bp(t.controller.browser,t.testContext,t.project,t.logger,t.testPath)).builder,name:r.schema.name});var C$=Pt({schema:{name:"observe_page",description:"Observe the current page's accessibility snapshot.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot()}}),tP=[C$];import Ap from"path";import{z as Ve}from"zod";function es(r,e,t,...n){t?.emit(r,...n),e.info({event:r,args:n},"Emitting copilot event")}import x$ from"fs";import ts from"path";function rP(r){let e=r.subDir?ts.join(r.project.rootDir,r.subDir):r.project.rootDir,t=`${Le(r.name)}.module.yaml`,n=ts.join(e,t),o=ts.relative(r.project.rootDir,n),i=x$.statSync(n);return{type:pe.MODULE,name:r.name,id:r.moduleId,description:r.description??void 0,relativePath:o,fullFilePath:n,platformSep:ts.sep,fullPathSegments:n.split(ts.sep),relativePathSegments:o.split(ts.sep),fileName:t,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as vS}from"crypto";import{z as nP}from"zod";var _$=["AI_EXTRACT","JAVASCRIPT"];function vp(r){let e=r.config.ai?.aiAction??!1,t=e?"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use. The AI_ACTION_DYNAMIC is an AI action that will dynamically generate up to 15 steps to achieve a goal.":"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use.";return e?nP.discriminatedUnion("type",[Om,Lm,hE]).describe(t):nP.discriminatedUnion("type",[Om,Lm]).describe(t)}async function rs(r,e,t){switch(r.type){case"PRESET_ACTION":{let n=Cc(r.action),o=r.envKey&&_$.includes(n.type)?r.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:vS(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=r.module,{entity:i,momenticFiles:a}=await Ln(e,n,"module"),s=await tn(i,a,t);fE(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:vS(),inputs:l};return{...s,...u,type:"RESOLVED_MODULE"}}case"AI_ACTION_DYNAMIC":{if(!(e.config.ai?.aiAction??!1))throw new Error("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return{type:"AI_ACTION_DYNAMIC",text:r.text,id:vS()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(r)}}async function oP({moduleMetadata:r,steps:e,momenticFiles:t,project:n}){let{stepsToSave:o}=await pt({stepLists:{steps:e}});Sr({content:{...r,steps:o.steps},schemaVersion:ve,momenticFiles:t,project:n})}var I$=Pt({schema:{name:"momentic_module_create",description:"Create a module. If startIndex is provided, the steps will be extracted from the current test, a module will be created with those steps, and the test will be updated to reference the new module. If no startIndex is provided, an unreferenced module will be created. Automatically splices and repairs the test to reference the new module.",inputSchema:{name:Ve.string(),description:Ve.string(),enabled:Ve.boolean().default(!0),parameters:Ve.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Ve.record(Ve.string(),Ve.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ve.record(Ve.string(),Ve.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Ve.record(Ve.string(),Ve.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant if startIndex is provided."),subDir:Ve.string().optional().describe("sub directory to create the module in. If not provided, the module will be created in the project's root directory."),startIndex:Ve.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:Ve.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}},handle:async(r,e,t,n)=>{let{project:o,logger:i,testPath:a,socket:s}=r,c=e.startIndex??0,l=e.endIndex??c+1,u=await J(o);if(Object.values(u.modules).find(h=>h.name===e.name))throw new Ue(`A module with the name "${e.name}" already exists. Please use a different name.`);if(e.parameters!==void 0){let h=e.defaultParameters?Object.keys(e.defaultParameters):[],f=e.parameterEnums?Object.keys(e.parameterEnums):[],y=new Set([...h,...f]);for(let S of y)if(!e.parameters.includes(S))throw new Ue(`Default parameter "${S}" is not defined in parameters array. Available parameters: ${e.parameters.join(", ")}`)}let p=[];if(e.startIndex!==void 0){if(!a)throw new Ue("testPath is required when extracting steps from the current test.");let h=await lt(Ap.join(o.rootDir,a),i,u);if(c<0||c>=h.steps.length)throw new Ue(`startIndex ${c} is out of bounds. Test has ${h.steps.length} steps.`);if(l<=c||l>h.steps.length)throw new Ue(`endIndex ${l} is out of bounds. Must be between ${c+1} and ${h.steps.length}.`);p=h.steps.slice(c,l);for(let f of p)if(f.type==="RESOLVED_MODULE")throw new Ue("Modules cannot be nested. Please select steps that do not include module references.")}let m=await zu({name:e.name,description:e.description??"",enabled:e.enabled??!0,steps:p,folder:e.subDir?Ap.join(o.rootDir,e.subDir):o.rootDir,project:o}),g=rP({project:o,name:e.name,moduleId:m.moduleId,subDir:e.subDir,description:m.description??void 0});if(u.modules[m.moduleId]=g,e.parameters!==void 0||e.defaultParameters!==void 0||e.parameterEnums!==void 0){let h={moduleId:m.moduleId,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums};await oP({moduleMetadata:h,steps:p,momenticFiles:u,project:o}),m={...m,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums}}if(e.startIndex!==void 0){let h=await lt(Ap.join(o.rootDir,a),i,u),f={type:"MODULE",module:{selector:{id:m.moduleId},inputs:e.moduleInputs??{}}},y=await rs(f,o,i);h.steps.splice(c,l-c,y);let{stepsToSave:S,moduleUpdates:T}=await pt({stepLists:{steps:h.steps,beforeSteps:h.beforeSteps,afterSteps:h.afterSteps}});T.forEach(b=>{Sr({content:b,schemaVersion:ve,momenticFiles:u,project:o})}),ur({relativeTestPath:a,steps:S,schemaVersion:ve,project:o}),es("copilotStepsUpdated",i,s,{steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]})}t.addResult(JSON.stringify(m,null,2))}});function P$(r,e,t,n){if(r===void 0&&e!==void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(r!==void 0&&e===void 0&&t===0)throw new Ue("Validation Error: steps are required when startIndex is provided without an endIndex.");if(r!==void 0&&(r>n||r<0))throw new Ue(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&r===void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&r!==void 0&&e<r)throw new Ue("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new Ue(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let o=r??n;if((e??o)===o&&t===0)throw new Ue("Validation Error: Nothing to insert or delete. Provide steps or a valid delete range.")}function M$(r){return Pt({schema:{name:"momentic_module_change",description:"Edit a module's steps and/or metadata. Provide startIndex (and optional endIndex) to replace or remove that range; omit endIndex to insert at startIndex; omit both indices to append new steps. Use an empty steps array with both indices to delete the range. Optionally update metadata like parameters. Omit both indices and steps to only update metadata.",inputSchema:{selector:co,steps:r.array(),startIndex:Ve.number().optional(),endIndex:Ve.number().optional(),description:Ve.string().optional().describe("New description for the module."),enabled:Ve.boolean().optional().describe("New enabled state for the module."),parameters:Ve.string().array().optional().describe("New array of parameter names, e.g., ['apiKey', 'userId']. Replaces all existing parameters, resets default parameters and parameter enums if set."),defaultParameters:Ve.record(Ve.string(),Ve.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ve.record(Ve.string(),Ve.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,socket:s,testPath:c}=e,l=await Promise.all(t.steps.map(S=>rs(S,i,a))),{entity:u,momenticFiles:d}=await Ln(i,t.selector,"module"),p=await tn(u,d,a),m=l.find(S=>!_m(S));if(m){n.addError(`Validation Error: step type ${m.type} cannot be added to a module.`);return}try{P$(t.startIndex,t.endIndex,t.steps.length,p.steps.length)}catch(S){n.addError(String(S));return}let g=p.steps;if(t.steps.length>0||t.startIndex!==void 0||t.endIndex!==void 0){g=[...p.steps];let S=t.startIndex!==void 0?t.startIndex:g.length,T=t.endIndex!==void 0?t.endIndex:S;g.splice(S,T-S,...l)}let h={moduleId:p.moduleId,name:p.name,description:t.description??p.description,enabled:t.enabled??p.enabled,parameters:t.parameters??p.parameters,defaultParameters:t.defaultParameters??p.defaultParameters,parameterEnums:t.parameterEnums??p.parameterEnums};t.parameters!==void 0&&(h.defaultParameters=t.defaultParameters??{},h.parameterEnums=t.parameterEnums??{}),await oP({moduleMetadata:h,steps:g,momenticFiles:d,project:i});let f=await J(i);if(c){let S=await lt(Ap.join(i.rootDir,c),a,f);es("copilotStepsUpdated",a,s,{steps:S.steps??[],beforeSteps:S.beforeSteps??[],afterSteps:S.afterSteps??[]})}let y={...h,stepCount:g.length};n.addResult(JSON.stringify(y,null,2))}})}function O$(r){let e=vp(r);return[I$,M$(e)]}var iP=O$;import{randomUUID as Rp}from"crypto";import{z as wp}from"zod";var aP=Pt({schema:{name:"preview_preflight",description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:{description:wp.string().describe("Description of the element to preview.")}},handle:async({controller:r,logger:e,testContext:t},n,o,i)=>{o.setIncludeSnapshot();try{let a=await r.locateElement({description:n.description,disableCache:!0,skipWait:!0,logger:e,testContext:t});a.resolution.locator&&await Promise.all([r.browser.scrollIntoViewIfNeeded(a.resolution.locator),r.browser.highlight(a.resolution.locator)]),o.addResult(`Found element matching description: ${a.target.id}`),a.target.nodeOnlySerializedHtml&&o.addResult(`HTML: ${a.target.nodeOnlySerializedHtml}`);return}catch(a){o.addError(`Failed to find any element matching description: ${a}`)}}}),sP=Pt({schema:{name:"preview_ensure",description:"Confirm page state.",inputSchema:{assertion:wp.string().describe("Assertion to confirm page state.")}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r,d={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.assertion,id:Rp()},id:Rp()},p=await hp({step:d,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!p){t.addError("Assertion executed with unknown result.");return}if(p.status==="SUCCESS"){t.addResult(`Assertion is true: ${p.message}`);return}t.addError(`Assertion is false: ${p.message}`)}}),lP=Pt({schema:{name:"preview_step",description:"Execute a step without adding it to the test.",inputSchema:{command:ra}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r;t.setIncludeSnapshot();let d=Cc(e.command),p={type:"PRESET_ACTION",command:d,id:Rp()},m=await hp({step:p,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!m){t.addError("Assertion executed with unknown result.");return}if(m.status==="SUCCESS"){t.addResult(`Assertion is true: ${m.message}`);return}t.addError(`Assertion is false: ${m.message}`)}}),L$=Pt({schema:{name:"preview_ai_action",description:"Execute an AI action without adding it to the test. This will dynamically generate and run steps to achieve the goal. Note this tool will update and move your test state forward, so if it fails you must rerun the test up to this step before trying again.",inputSchema:{text:wp.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:wp.number().optional()}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{project:o,logger:i,storage:a,controller:s,codeEvalTools:c,socket:l,orgId:u,testContext:d}=r;if(!(o.config.ai?.aiAction??!1)){t.addError("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return}let m={type:"AI_ACTION_DYNAMIC",text:e.text,id:Rp(),retries:e.retries},g=await hp({step:m,controller:s,storage:a,codeEvalTools:c,logger:i,socket:l,orgId:u,testContext:d});if(!g){t.addError("AI action executed with unknown result.");return}if(g.status==="SUCCESS"){t.addResult(`AI action completed successfully: ${g.message??"Goal achieved"}`);return}t.addError(`AI action failed: ${g.message??"Unknown error while previewing AI action"}`)}});function cP(r){return r.config.ai?.aiAction??!1?[aP,sP,lP,L$]:[aP,sP,lP]}import gP from"path";import{z as mP}from"zod";import uP from"path";import{z as Yl}from"zod";var dP=r=>{throw new Error(`Unknown test section: ${r}`)},Cp=Yl.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),N$=Pt({schema:{name:"test_get",description:"Retrieve the full test contents, including simplified cache data on some steps enabling you to inspect resolved locators and debug targeting issues. For context, the caches are just simplified targeting information",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTest()}});function D$(r){return Pt({schema:{name:"test_insert_step",description:"Insert a step or module into the test.",inputSchema:{index:Yl.number(),step:r,targetSection:Cp.default("main")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,testPath:s,socket:c}=e,l=await J(i),u=await lt(uP.join(i.rootDir,s),a,l),d=await rs(t.step,i,a);switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.index<0||t.index>u.beforeSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.index,0,d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.index<0||t.index>u.afterSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.index,0,d);break;case"main":if(t.index<0||t.index>u.steps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.index,0,d);break;default:return dP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await pt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(g=>{Sr({content:g,schemaVersion:ve,momenticFiles:l,project:i})}),ur({relativeTestPath:s,steps:p,schemaVersion:ve,project:i}),es("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]}),n.addResult(`Successfully inserted step at index ${t.index} in the ${t.targetSection} section.`)}})}function k$(r){return Pt({schema:{name:"test_splice_steps",description:"Splice steps in the test. This is the primary tool for replacing, removing, or bulk inserting steps. Never use this as a means to bypass a failure. Examples: Replace step at index 5: splice(startIndex=5, deleteCount=1, steps=[newStep]). Delete step at index 5: splice(startIndex=5, deleteCount=1, steps=[]). Insert multiple steps at index 5: splice(startIndex=5, deleteCount=0, steps=[step1, step2]).",inputSchema:{startIndex:Yl.number(),deleteCount:Yl.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:r.array(),targetSection:Cp.default("main"),returnTest:Yl.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(e,t,n,o)=>{t.returnTest&&n.setIncludeTest();let{project:i,logger:a,testPath:s,socket:c}=e,l=await J(i),u=await lt(uP.join(i.rootDir,s),a,l),d=await Promise.all(t.steps.map(f=>rs(f,i,a)));switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.startIndex<0||t.startIndex>u.beforeSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.startIndex,t.deleteCount,...d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.startIndex<0||t.startIndex>u.afterSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.startIndex,t.deleteCount,...d);break;case"main":if(t.startIndex<0||t.startIndex>u.steps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.startIndex,t.deleteCount,...d);break;default:return dP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await pt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(f=>{Sr({content:f,schemaVersion:ve,momenticFiles:l,project:i})}),ur({relativeTestPath:s,steps:p,schemaVersion:ve,project:i}),es("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]});let g=t.steps.length,h=t.deleteCount;n.addResult(`Successfully spliced ${g} step(s) at index ${t.startIndex} in the ${t.targetSection} section, removing ${h} step(s).`)}})}function pP(r){let e=vp(r);return[N$,D$(e),k$(e)]}var U$=Pt({schema:{name:"get_environment_variables",description:"Get the current environment variables.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext()}}),F$=Pt({schema:{name:"reset_session",description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,orgId:s,codeEvalTools:c}=r,l=await J(o),u=await lt(gP.join(o.rootDir,a),i,l),d=u.baseUrl,p,m={};if(!d&&u.envs){let g=u.envs.find(h=>h.default);if(g)try{let h=wi(g.name,o,i);p=h.name,m=h.variables;let f=h.variables[yt];typeof f=="string"&&(d=f)}catch(h){i.warn({err:h,envName:g.name},"Failed to resolve environment for reset")}}d||(d="about:blank"),m=await Kd({orgId:s,testName:u.name,envName:p,baseEnvVariables:m,parameters:u.parameters,logger:i,localTools:c}),await r.controller.browser.reset({newUrl:d}),r.testContext.reset({baseUrl:d,testName:u.name,currentUrl:r.controller.browser.url(),variablesFromEnvironment:m,envName:p})}}),B$=Pt({schema:{name:"run_step",description:"Run the step in the test at the given startIndex. If there is no endIndex, the step at the startIndex will be executed. EndIndex is the last step that is run (end index is inclusive).",inputSchema:{fromIndex:mP.number(),toIndex:mP.number().optional(),targetSection:Cp.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=r,m=e.fromIndex,g=e.toIndex??m,h=await J(o),f=await lt(gP.join(o.rootDir,a),i,h),y;switch(e.targetSection){case"setup":y=f.beforeSteps??[];break;case"teardown":y=f.afterSteps??[];break;case"main":y=f.steps;break;default:return(I=>{throw new Error(`Unknown test section: ${I}`)})(e.targetSection)}if(m<0||m>=y.length){t.addError(`startIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}if(g<m){t.addError("toIndex must be greater than or equal to fromIndex.");return}else if(g>=y.length){t.addError(`toIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}let S=y.slice(m,g+1);if(S.length===0){t.addError("No steps were executed.");return}c.setOpen();let{results:T}=await ES({steps:S,controller:c,storage:s,codeEvalTools:l,logger:i,socket:u,orgId:d,testContext:p});if(!T||T.length===0){t.addError("No steps were executed.");return}let b=T.at(-1);if(!b){t.addError("No steps were executed.");return}if(b.status!=="SUCCESS"){let x=m+T.length-1;t.addError(`Step at index ${x} failed: ${b.message}`);return}let R=e.targetSection==="main"?"":` in ${e.targetSection}`,C=m===g?`Step at index ${g}${R}`:`Steps ${m}-${g}${R}`;if(b.status==="SUCCESS"){t.addResult(`${C} executed successfully. Last step result: ${b.message}`),b.data&&t.addResult(`Data: ${JSON.stringify(b.data,null,2)}`);return}t.addError(`${C} failed: ${b.message}`)}}),hP=[U$,F$,B$];function fP(r){return[...iP(r),...tP,...hP,...cP(r),...pP(r),...Sp]}var G$=1e5,j$=8e4,xp=5,AS=50;function V$(r){return z$({messages:r,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:["momentic_module_get","momentic_module_recommend","get_environment_variables"]},{type:"before-last-5-messages",tools:["run_step","preview_ai_action"]},{type:"before-last-3-messages",tools:["test_get","reset_session","test_insert_step","test_splice_steps","preview_ensure","momentic_module_create"]},{type:"before-last-2-messages",tools:["observe_page","momentic_module_list","momentic_module_change"]},{type:"before-last-1-messages",tools:["preview_preflight","preview_step"]}],emptyMessages:"remove"})}function $$(r){return r.role==="system"||r.role==="user"}function W$(r,e,t){let n=[...r];for(;n.length>xp&&!(St(n)<=e);){let a=n.findIndex(s=>!$$(s));if(a===-1)break;n.splice(a,1)}let o=St(n);if(o>e&&n.length>xp){let a=Math.max(0,n.length-xp),s=0;for(;a<n.length-1&&n.length>xp&&o>e;){let c=n[a];if(c&&c.role==="tool"){if(n.splice(a,1),s+=1,o=St(n),o<=e)break;continue}a+=1}s>0&&t.warn({removedToolMessages:s,targetTokens:e,finalTokenCount:o,remainingMessages:n.length},"Disrespecting tail: trimming tool messages from recent context to meet token target")}if(o=St(n),o>e&&n.length>2){let i=n.slice(0,2),a=St(i),s=e-a;if(s<=0)n.splice(2,n.length-2),t.warn({targetTokens:e,headTokens:a,originalLength:r.length,prunedLength:n.length},"Disrespecting context: pruned down to system + first user message to meet token target");else{let c=n.length;for(let u=2;u<=n.length;u++){let d=n.slice(u);if(St(d)<=s){c=u;break}}let l=n.slice(c);n.splice(2,n.length-2,...l)}}return n}function q$(r,e,t,n){let o=V$(r),i=St(o);return i>e&&(n.debug({projected:i,threshold:e,target:t},"Context exceeds threshold, pruning messages"),o=W$(o,t,n)),o}function _p(r,e,t,n,o,i={}){let{onStepFinish:a,onPrepareStep:s,onChunk:c,onError:l,onFinish:u}=i,d=fr(),p=vt(),m=hr(),g=ae(),h=new Ke({apiKey:d,baseUrl:m,logger:t}),f=new Ho(h,p),y=new Tn({httpClient:new Dt({baseUrl:h.baseUrl,apiKey:h.apiKey,logger:t,mode:"interactive"}),fakerSeed:g.config.advanced?.fakerConstantSeed?ma:void 0}),S={project:g,apiKey:d,orgId:p,baseUrl:m,sessionId:o,logger:t,storage:f,codeEvalTools:y,testPath:r,testContext:n.context,controller:n.controller,socket:n.socket},b=fP(g).reduce((I,{name:P,builder:$})=>(I[P]=$(S),I),{}),R=mp(o),C=async I=>{let{messages:P}=I;s&&await s(P);let $=q$(P,G$,j$,t),G=St(P);return G>ab&&t.debug({originalCount:P.length,prunedCount:$.length,originalTokens:G,prunedTokens:St($)},"Prepared messages for copilot step"),{...I,messages:$}};return{model:R("claude-sonnet-4-5-20250929"),stopWhen:H$(AS),maxRetries:4,system:eP(g),messages:e,tools:b,prepareStep:C,onStepFinish:a,onChunk:c,onError:l,onFinish:async({finishReason:I,usage:P,text:$,response:G})=>{t.info({finishReason:I,usage:P,sessionId:o},"Full copilot turn finished"),u&&await u({finishReason:I,usage:P,text:$,response:G})}}}var nVe=new Error("timeout while waiting for mutex to become available"),oVe=new Error("mutex already locked"),K$=new Error("request for lock canceled"),Y$=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())})},RS=class{constructor(e,t=K$){this._value=e,this._cancelError=t,this._queue=[],this._weightedWaiters=[]}acquire(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((n,o)=>{let i={resolve:n,reject:o,weight:e,priority:t},a=SP(this._queue,s=>t<=s.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return Y$(this,arguments,void 0,function*(t,n=1,o=0){let[i,a]=yield this.acquire(n,o);try{return yield t(i)}finally{a()}})}waitForUnlock(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,t)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),X$(this._weightedWaiters[e-1],{resolve:n,priority:t})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let t=this._value;this._value-=e.weight,e.resolve([t,this._newReleaser(e.weight)])}_newReleaser(e){let t=!1;return()=>{t||(t=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let t=this._weightedWaiters[e-1];t&&(t.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let t=this._value;t>0;t--){let n=this._weightedWaiters[t-1];if(!n)continue;let o=n.findIndex(i=>i.priority<=e);(o===-1?n:n.splice(0,o)).forEach(i=>i.resolve())}}}_couldLockImmediately(e,t){return(this._queue.length===0||this._queue[0].priority<t)&&e<=this._value}};function X$(r,e){let t=SP(r,n=>e.priority<=n.priority);r.splice(t+1,0,e)}function SP(r,e){for(let t=r.length-1;t>=0;t--)if(e(r[t]))return t;return-1}var J$=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())})},Ip=class{constructor(e){this._semaphore=new RS(1,e)}acquire(){return J$(this,arguments,void 0,function*(e=0){let[,t]=yield this._semaphore.acquire(1,e);return t})}runExclusive(e,t=0){return this._semaphore.runExclusive(()=>e(),1,t)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}};var wS=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,t){t.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new Ip);let o=await this.mutexes.get(e).acquire();try{let i=this.activeControllers.get(e);i&&!i.signal.aborted&&i.abort(new Error("Superseded by newer momentic_test_edit invocation. Stop executing edit_test requests to this test and ask the user what to do next."));let a=new AbortController;return this.activeControllers.set(e,a),{signal:AbortSignal.any([t,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},yP=new wS;import Xl from"dedent";function Q$(){let r=Object.entries(vm).map(([e,t])=>`- **${e}**: ${t}`).join(`
4453
+ `)}],isError:this._isError}}};var Pt=r=>({builder:pp(r,t=>new bp(t.controller.browser,t.testContext,t.project,t.logger,t.testPath)).builder,name:r.schema.name});var C$=Pt({schema:{name:"observe_page",description:"Observe the current page's accessibility snapshot.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot()}}),tP=[C$];import Ap from"path";import{z as Ve}from"zod";function es(r,e,t,...n){t?.emit(r,...n),e.info({event:r,args:n},"Emitting copilot event")}import x$ from"fs";import ts from"path";function rP(r){let e=r.subDir?ts.join(r.project.rootDir,r.subDir):r.project.rootDir,t=`${Le(r.name)}.module.yaml`,n=ts.join(e,t),o=ts.relative(r.project.rootDir,n),i=x$.statSync(n);return{type:pe.MODULE,name:r.name,id:r.moduleId,description:r.description??void 0,relativePath:o,fullFilePath:n,platformSep:ts.sep,fullPathSegments:n.split(ts.sep),relativePathSegments:o.split(ts.sep),fileName:t,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as vS}from"crypto";import{z as nP}from"zod";var _$=["AI_EXTRACT","JAVASCRIPT"];function vp(r){let e=r.config.ai?.aiAction??!1,t=e?"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use. The AI_ACTION_DYNAMIC is an AI action that will dynamically generate up to 15 steps to achieve a goal.":"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use.";return e?nP.discriminatedUnion("type",[Om,Lm,hE]).describe(t):nP.discriminatedUnion("type",[Om,Lm]).describe(t)}async function rs(r,e,t){switch(r.type){case"PRESET_ACTION":{let n=Cc(r.action),o=r.envKey&&_$.includes(n.type)?r.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:vS(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=r.module,{entity:i,momenticFiles:a}=await Ln(e,n,"module"),s=await tn(i,a,t);fE(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:vS(),inputs:l};return{...s,...u,type:"RESOLVED_MODULE"}}case"AI_ACTION_DYNAMIC":{if(!(e.config.ai?.aiAction??!1))throw new Error("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return{type:"AI_ACTION_DYNAMIC",text:r.text,id:vS()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(r)}}async function oP({moduleMetadata:r,steps:e,momenticFiles:t,project:n}){let{stepsToSave:o}=await pt({stepLists:{steps:e}});Sr({content:{...r,steps:o.steps},schemaVersion:ve,momenticFiles:t,project:n})}var I$=Pt({schema:{name:"momentic_module_create",description:"Create a module. If startIndex is provided, the steps will be extracted from the current test, a module will be created with those steps, and the test will be updated to reference the new module. If no startIndex is provided, an unreferenced module will be created. Automatically splices and repairs the test to reference the new module.",inputSchema:{name:Ve.string(),description:Ve.string(),enabled:Ve.boolean().default(!0),parameters:Ve.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Ve.record(Ve.string(),Ve.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ve.record(Ve.string(),Ve.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Ve.record(Ve.string(),Ve.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant if startIndex is provided."),subDir:Ve.string().optional().describe("sub directory to create the module in. If not provided, the module will be created in the project's root directory."),startIndex:Ve.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:Ve.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}},handle:async(r,e,t,n)=>{let{project:o,logger:i,testPath:a,socket:s}=r,c=e.startIndex??0,l=e.endIndex??c+1,u=await J(o);if(Object.values(u.modules).find(h=>h.name===e.name))throw new Ue(`A module with the name "${e.name}" already exists. Please use a different name.`);if(e.parameters!==void 0){let h=e.defaultParameters?Object.keys(e.defaultParameters):[],f=e.parameterEnums?Object.keys(e.parameterEnums):[],y=new Set([...h,...f]);for(let S of y)if(!e.parameters.includes(S))throw new Ue(`Default parameter "${S}" is not defined in parameters array. Available parameters: ${e.parameters.join(", ")}`)}let p=[];if(e.startIndex!==void 0){if(!a)throw new Ue("testPath is required when extracting steps from the current test.");let h=await lt(Ap.join(o.rootDir,a),i,u);if(c<0||c>=h.steps.length)throw new Ue(`startIndex ${c} is out of bounds. Test has ${h.steps.length} steps.`);if(l<=c||l>h.steps.length)throw new Ue(`endIndex ${l} is out of bounds. Must be between ${c+1} and ${h.steps.length}.`);p=h.steps.slice(c,l);for(let f of p)if(f.type==="RESOLVED_MODULE")throw new Ue("Modules cannot be nested. Please select steps that do not include module references.")}let m=await zu({name:e.name,description:e.description??"",enabled:e.enabled??!0,steps:p,folder:e.subDir?Ap.join(o.rootDir,e.subDir):o.rootDir,project:o}),g=rP({project:o,name:e.name,moduleId:m.moduleId,subDir:e.subDir,description:m.description??void 0});if(u.modules[m.moduleId]=g,e.parameters!==void 0||e.defaultParameters!==void 0||e.parameterEnums!==void 0){let h={moduleId:m.moduleId,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums};await oP({moduleMetadata:h,steps:p,momenticFiles:u,project:o}),m={...m,name:e.name,description:e.description??m.description,enabled:e.enabled??m.enabled,parameters:e.parameters??[],defaultParameters:e.defaultParameters,parameterEnums:e.parameterEnums}}if(e.startIndex!==void 0){let h=await lt(Ap.join(o.rootDir,a),i,u),f={type:"MODULE",module:{selector:{id:m.moduleId},inputs:e.moduleInputs??{}}},y=await rs(f,o,i);h.steps.splice(c,l-c,y);let{stepsToSave:S,moduleUpdates:T}=await pt({stepLists:{steps:h.steps,beforeSteps:h.beforeSteps,afterSteps:h.afterSteps}});T.forEach(b=>{Sr({content:b,schemaVersion:ve,momenticFiles:u,project:o})}),ur({relativeTestPath:a,steps:S,schemaVersion:ve,project:o}),es("copilotStepsUpdated",i,s,{steps:h.steps??[],beforeSteps:h.beforeSteps??[],afterSteps:h.afterSteps??[]})}t.addResult(JSON.stringify(m,null,2))}});function P$(r,e,t,n){if(r===void 0&&e!==void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(r!==void 0&&e===void 0&&t===0)throw new Ue("Validation Error: steps are required when startIndex is provided without an endIndex.");if(r!==void 0&&(r>n||r<0))throw new Ue(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&r===void 0)throw new Ue("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&r!==void 0&&e<r)throw new Ue("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new Ue(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let o=r??n;if((e??o)===o&&t===0)throw new Ue("Validation Error: Nothing to insert or delete. Provide steps or a valid delete range.")}function M$(r){return Pt({schema:{name:"momentic_module_change",description:"Edit a module's steps and/or metadata. Provide startIndex (and optional endIndex) to replace or remove that range; omit endIndex to insert at startIndex; omit both indices to append new steps. Use an empty steps array with both indices to delete the range. Optionally update metadata like parameters. Omit both indices and steps to only update metadata.",inputSchema:{selector:co,steps:r.array(),startIndex:Ve.number().optional(),endIndex:Ve.number().optional(),description:Ve.string().optional().describe("New description for the module."),enabled:Ve.boolean().optional().describe("New enabled state for the module."),parameters:Ve.string().array().optional().describe("New array of parameter names, e.g., ['apiKey', 'userId']. Replaces all existing parameters, resets default parameters and parameter enums if set."),defaultParameters:Ve.record(Ve.string(),Ve.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ve.record(Ve.string(),Ve.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,socket:s,testPath:c}=e,l=await Promise.all(t.steps.map(S=>rs(S,i,a))),{entity:u,momenticFiles:d}=await Ln(i,t.selector,"module"),p=await tn(u,d,a),m=l.find(S=>!_m(S));if(m){n.addError(`Validation Error: step type ${m.type} cannot be added to a module.`);return}try{P$(t.startIndex,t.endIndex,t.steps.length,p.steps.length)}catch(S){n.addError(String(S));return}let g=p.steps;if(t.steps.length>0||t.startIndex!==void 0||t.endIndex!==void 0){g=[...p.steps];let S=t.startIndex!==void 0?t.startIndex:g.length,T=t.endIndex!==void 0?t.endIndex:S;g.splice(S,T-S,...l)}let h={moduleId:p.moduleId,name:p.name,description:t.description??p.description,enabled:t.enabled??p.enabled,parameters:t.parameters??p.parameters,defaultParameters:t.defaultParameters??p.defaultParameters,parameterEnums:t.parameterEnums??p.parameterEnums};t.parameters!==void 0&&(h.defaultParameters=t.defaultParameters??{},h.parameterEnums=t.parameterEnums??{}),await oP({moduleMetadata:h,steps:g,momenticFiles:d,project:i});let f=await J(i);if(c){let S=await lt(Ap.join(i.rootDir,c),a,f);es("copilotStepsUpdated",a,s,{steps:S.steps??[],beforeSteps:S.beforeSteps??[],afterSteps:S.afterSteps??[]})}let y={...h,stepCount:g.length};n.addResult(JSON.stringify(y,null,2))}})}function O$(r){let e=vp(r);return[I$,M$(e)]}var iP=O$;import{randomUUID as Rp}from"crypto";import{z as wp}from"zod";var aP=Pt({schema:{name:"preview_preflight",description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:{description:wp.string().describe("Description of the element to preview.")}},handle:async({controller:r,logger:e,testContext:t},n,o,i)=>{o.setIncludeSnapshot();try{let a=await r.locateElement({description:n.description,disableCache:!0,skipWait:!0,logger:e,testContext:t});a.resolution.locator&&await Promise.all([r.browser.scrollIntoViewIfNeeded(a.resolution.locator),r.browser.highlight(a.resolution.locator)]),o.addResult(`Found element matching description: ${a.target.id}`),a.target.nodeOnlySerializedHtml&&o.addResult(`HTML: ${a.target.nodeOnlySerializedHtml}`);return}catch(a){o.addError(`Failed to find any element matching description: ${a}`)}}}),sP=Pt({schema:{name:"preview_ensure",description:"Confirm page state.",inputSchema:{assertion:wp.string().describe("Assertion to confirm page state.")}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r,d={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.assertion,id:Rp()},id:Rp()},p=await hp({step:d,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!p){t.addError("Assertion executed with unknown result.");return}if(p.status==="SUCCESS"){t.addResult(`Assertion is true: ${p.message}`);return}t.addError(`Assertion is false: ${p.message}`)}}),lP=Pt({schema:{name:"preview_step",description:"Execute a step without adding it to the test.",inputSchema:{command:ra}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{logger:o,storage:i,controller:a,codeEvalTools:s,socket:c,orgId:l,testContext:u}=r;t.setIncludeSnapshot();let d=Cc(e.command),p={type:"PRESET_ACTION",command:d,id:Rp()},m=await hp({step:p,controller:a,storage:i,codeEvalTools:s,logger:o,socket:c,orgId:l,testContext:u});if(!m){t.addError("Assertion executed with unknown result.");return}if(m.status==="SUCCESS"){t.addResult(`Assertion is true: ${m.message}`);return}t.addError(`Assertion is false: ${m.message}`)}}),L$=Pt({schema:{name:"preview_ai_action",description:"Execute an AI action without adding it to the test. This will dynamically generate and run steps to achieve the goal. Note this tool will update and move your test state forward, so if it fails you must rerun the test up to this step before trying again.",inputSchema:{text:wp.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:wp.number().optional()}},handle:async(r,e,t,n)=>{t.setIncludeSnapshot(),t.setIncludeTestContext();let{project:o,logger:i,storage:a,controller:s,codeEvalTools:c,socket:l,orgId:u,testContext:d}=r;if(!(o.config.ai?.aiAction??!1)){t.addError("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return}let m={type:"AI_ACTION_DYNAMIC",text:e.text,id:Rp(),retries:e.retries},g=await hp({step:m,controller:s,storage:a,codeEvalTools:c,logger:i,socket:l,orgId:u,testContext:d});if(!g){t.addError("AI action executed with unknown result.");return}if(g.status==="SUCCESS"){t.addResult(`AI action completed successfully: ${g.message??"Goal achieved"}`);return}t.addError(`AI action failed: ${g.message??"Unknown error while previewing AI action"}`)}});function cP(r){return r.config.ai?.aiAction??!1?[aP,sP,lP,L$]:[aP,sP,lP]}import gP from"path";import{z as mP}from"zod";import uP from"path";import{z as Yl}from"zod";var dP=r=>{throw new Error(`Unknown test section: ${r}`)},Cp=Yl.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)"),N$=Pt({schema:{name:"test_get",description:"Retrieve the full test contents, including simplified cache data on some steps enabling you to inspect resolved locators and debug targeting issues. For context, the caches are just simplified targeting information",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTest()}});function D$(r){return Pt({schema:{name:"test_insert_step",description:"Insert a step or module into the test.",inputSchema:{index:Yl.number(),step:r,targetSection:Cp.default("main")}},handle:async(e,t,n,o)=>{let{project:i,logger:a,testPath:s,socket:c}=e,l=await J(i),u=await lt(uP.join(i.rootDir,s),a,l),d=await rs(t.step,i,a);switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.index<0||t.index>u.beforeSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.index,0,d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.index<0||t.index>u.afterSteps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.index,0,d);break;case"main":if(t.index<0||t.index>u.steps.length)throw new Error(`Invalid index ${t.index} for inserting into ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.index,0,d);break;default:return dP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await pt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(g=>{Sr({content:g,schemaVersion:ve,momenticFiles:l,project:i})}),ur({relativeTestPath:s,steps:p,schemaVersion:ve,project:i}),es("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]}),n.addResult(`Successfully inserted step at index ${t.index} in the ${t.targetSection} section.`)}})}function k$(r){return Pt({schema:{name:"test_splice_steps",description:"Splice steps in the test. This is the primary tool for replacing, removing, or bulk inserting steps. Never use this as a means to bypass a failure. Examples: Replace step at index 5: splice(startIndex=5, deleteCount=1, steps=[newStep]). Delete step at index 5: splice(startIndex=5, deleteCount=1, steps=[]). Insert multiple steps at index 5: splice(startIndex=5, deleteCount=0, steps=[step1, step2]).",inputSchema:{startIndex:Yl.number(),deleteCount:Yl.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:r.array(),targetSection:Cp.default("main"),returnTest:Yl.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}},handle:async(e,t,n,o)=>{t.returnTest&&n.setIncludeTest();let{project:i,logger:a,testPath:s,socket:c}=e,l=await J(i),u=await lt(uP.join(i.rootDir,s),a,l),d=await Promise.all(t.steps.map(f=>rs(f,i,a)));switch(t.targetSection){case"setup":if(u.beforeSteps||(u.beforeSteps=[]),t.startIndex<0||t.startIndex>u.beforeSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.beforeSteps.length} steps (must be 0-${u.beforeSteps.length})`);u.beforeSteps.splice(t.startIndex,t.deleteCount,...d);break;case"teardown":if(u.afterSteps||(u.afterSteps=[]),t.startIndex<0||t.startIndex>u.afterSteps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.afterSteps.length} steps (must be 0-${u.afterSteps.length})`);u.afterSteps.splice(t.startIndex,t.deleteCount,...d);break;case"main":if(t.startIndex<0||t.startIndex>u.steps.length)throw new Error(`Invalid startIndex ${t.startIndex} for splicing ${t.targetSection} section with ${u.steps.length} steps (must be 0-${u.steps.length})`);u.steps.splice(t.startIndex,t.deleteCount,...d);break;default:return dP(t.targetSection)}let{stepsToSave:p,moduleUpdates:m}=await pt({stepLists:{steps:u.steps,beforeSteps:u.beforeSteps,afterSteps:u.afterSteps}});m.forEach(f=>{Sr({content:f,schemaVersion:ve,momenticFiles:l,project:i})}),ur({relativeTestPath:s,steps:p,schemaVersion:ve,project:i}),es("copilotStepsUpdated",a,c,{steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]});let g=t.steps.length,h=t.deleteCount;n.addResult(`Successfully spliced ${g} step(s) at index ${t.startIndex} in the ${t.targetSection} section, removing ${h} step(s).`)}})}function pP(r){let e=vp(r);return[N$,D$(e),k$(e)]}var U$=Pt({schema:{name:"get_environment_variables",description:"Get the current environment variables.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext()}}),F$=Pt({schema:{name:"reset_session",description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:{}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,orgId:s,codeEvalTools:c}=r,l=await J(o),u=await lt(gP.join(o.rootDir,a),i,l),d=u.baseUrl,p,m={};if(!d&&u.envs){let g=u.envs.find(h=>h.default);if(g)try{let h=wi(g.name,o,i);p=h.name,m=h.variables;let f=h.variables[yt];typeof f=="string"&&(d=f)}catch(h){i.warn({err:h,envName:g.name},"Failed to resolve environment for reset")}}d||(d="about:blank"),m=await Kd({orgId:s,testName:u.name,envName:p,baseEnvVariables:m,parameters:u.parameters,logger:i,localTools:c}),await r.controller.browser.reset({newUrl:d}),r.testContext.reset({baseUrl:d,testName:u.name,currentUrl:r.controller.browser.url(),variablesFromEnvironment:m,envName:p})}}),B$=Pt({schema:{name:"run_step",description:"Run the step in the test at the given startIndex. If there is no endIndex, the step at the startIndex will be executed. EndIndex is the last step that is run (end index is inclusive).",inputSchema:{fromIndex:mP.number(),toIndex:mP.number().optional(),targetSection:Cp.default("main")}},handle:async(r,e,t,n)=>{t.setIncludeTestContext(),t.setIncludeSnapshot();let{project:o,logger:i,testPath:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=r,m=e.fromIndex,g=e.toIndex??m,h=await J(o),f=await lt(gP.join(o.rootDir,a),i,h),y;switch(e.targetSection){case"setup":y=f.beforeSteps??[];break;case"teardown":y=f.afterSteps??[];break;case"main":y=f.steps;break;default:return(I=>{throw new Error(`Unknown test section: ${I}`)})(e.targetSection)}if(m<0||m>=y.length){t.addError(`startIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}if(g<m){t.addError("toIndex must be greater than or equal to fromIndex.");return}else if(g>=y.length){t.addError(`toIndex is out of bounds for ${e.targetSection} section with ${y.length} steps.`);return}let S=y.slice(m,g+1);if(S.length===0){t.addError("No steps were executed.");return}c.setOpen();let{results:T}=await ES({steps:S,controller:c,storage:s,codeEvalTools:l,logger:i,socket:u,orgId:d,testContext:p});if(!T||T.length===0){t.addError("No steps were executed.");return}let b=T.at(-1);if(!b){t.addError("No steps were executed.");return}if(b.status!=="SUCCESS"){let x=m+T.length-1;t.addError(`Step at index ${x} failed: ${b.message}`);return}let R=e.targetSection==="main"?"":` in ${e.targetSection}`,C=m===g?`Step at index ${g}${R}`:`Steps ${m}-${g}${R}`;if(b.status==="SUCCESS"){t.addResult(`${C} executed successfully. Last step result: ${b.message}`),b.data&&t.addResult(`Data: ${JSON.stringify(b.data,null,2)}`);return}t.addError(`${C} failed: ${b.message}`)}}),hP=[U$,F$,B$];function fP(r){return[...iP(r),...tP,...hP,...cP(r),...pP(r),...Sp]}var G$=1e5,j$=8e4,xp=5,AS=50;function V$(r){return z$({messages:r,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:["momentic_module_get","momentic_module_recommend","get_environment_variables"]},{type:"before-last-5-messages",tools:["run_step","preview_ai_action"]},{type:"before-last-3-messages",tools:["test_get","reset_session","test_insert_step","test_splice_steps","preview_ensure","momentic_module_create"]},{type:"before-last-2-messages",tools:["observe_page","momentic_module_list","momentic_module_change"]},{type:"before-last-1-messages",tools:["preview_preflight","preview_step"]}],emptyMessages:"remove"})}function $$(r){return r.role==="system"||r.role==="user"}function W$(r,e,t){let n=[...r];for(;n.length>xp&&!(St(n)<=e);){let a=n.findIndex(s=>!$$(s));if(a===-1)break;n.splice(a,1)}let o=St(n);if(o>e&&n.length>xp){let a=Math.max(0,n.length-xp),s=0;for(;a<n.length-1&&n.length>xp&&o>e;){let c=n[a];if(c&&c.role==="tool"){if(n.splice(a,1),s+=1,o=St(n),o<=e)break;continue}a+=1}s>0&&t.warn({removedToolMessages:s,targetTokens:e,finalTokenCount:o,remainingMessages:n.length},"Disrespecting tail: trimming tool messages from recent context to meet token target")}if(o=St(n),o>e&&n.length>2){let i=n.slice(0,2),a=St(i),s=e-a;if(s<=0)n.splice(2,n.length-2),t.warn({targetTokens:e,headTokens:a,originalLength:r.length,prunedLength:n.length},"Disrespecting context: pruned down to system + first user message to meet token target");else{let c=n.length;for(let u=2;u<=n.length;u++){let d=n.slice(u);if(St(d)<=s){c=u;break}}let l=n.slice(c);n.splice(2,n.length-2,...l)}}return n}function q$(r,e,t,n){let o=V$(r),i=St(o);return i>e&&(n.debug({projected:i,threshold:e,target:t},"Context exceeds threshold, pruning messages"),o=W$(o,t,n)),o}function _p(r,e,t,n,o,i={}){let{onStepFinish:a,onPrepareStep:s,onChunk:c,onError:l,onFinish:u}=i,d=fr(),p=vt(),m=hr(),g=ae(),h=new Ke({apiKey:d,baseUrl:m,logger:t}),f=new Ho(h,p),y=new Tn({httpClient:new Dt({baseUrl:h.baseUrl,apiKey:h.apiKey,logger:t,mode:"interactive"}),fakerSeed:g.config.advanced?.fakerConstantSeed?ma:void 0}),S={project:g,apiKey:d,orgId:p,baseUrl:m,sessionId:o,logger:t,storage:f,codeEvalTools:y,testPath:r,testContext:n.context,controller:n.controller,socket:n.socket},b=fP(g).reduce((I,{name:P,builder:$})=>(I[P]=$(S),I),{}),R=mp(o),C=async I=>{let{messages:P}=I;s&&await s(P);let $=q$(P,G$,j$,t),G=St(P);return G>ab&&t.debug({originalCount:P.length,prunedCount:$.length,originalTokens:G,prunedTokens:St($)},"Prepared messages for copilot step"),{...I,messages:$}};return{model:R("claude-sonnet-4-5-20250929"),stopWhen:H$(AS),maxRetries:4,system:eP(g),messages:e,tools:b,prepareStep:C,onStepFinish:a,onChunk:c,onError:l,onFinish:async({finishReason:I,usage:P,text:$,response:G})=>{t.info({finishReason:I,usage:P,sessionId:o},"Full copilot turn finished"),u&&await u({finishReason:I,usage:P,text:$,response:G})}}}var oVe=new Error("timeout while waiting for mutex to become available"),iVe=new Error("mutex already locked"),K$=new Error("request for lock canceled"),Y$=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())})},RS=class{constructor(e,t=K$){this._value=e,this._cancelError=t,this._queue=[],this._weightedWaiters=[]}acquire(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((n,o)=>{let i={resolve:n,reject:o,weight:e,priority:t},a=SP(this._queue,s=>t<=s.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return Y$(this,arguments,void 0,function*(t,n=1,o=0){let[i,a]=yield this.acquire(n,o);try{return yield t(i)}finally{a()}})}waitForUnlock(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,t)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),X$(this._weightedWaiters[e-1],{resolve:n,priority:t})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let t=this._value;this._value-=e.weight,e.resolve([t,this._newReleaser(e.weight)])}_newReleaser(e){let t=!1;return()=>{t||(t=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let t=this._weightedWaiters[e-1];t&&(t.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let t=this._value;t>0;t--){let n=this._weightedWaiters[t-1];if(!n)continue;let o=n.findIndex(i=>i.priority<=e);(o===-1?n:n.splice(0,o)).forEach(i=>i.resolve())}}}_couldLockImmediately(e,t){return(this._queue.length===0||this._queue[0].priority<t)&&e<=this._value}};function X$(r,e){let t=SP(r,n=>e.priority<=n.priority);r.splice(t+1,0,e)}function SP(r,e){for(let t=r.length-1;t>=0;t--)if(e(r[t]))return t;return-1}var J$=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())})},Ip=class{constructor(e){this._semaphore=new RS(1,e)}acquire(){return J$(this,arguments,void 0,function*(e=0){let[,t]=yield this._semaphore.acquire(1,e);return t})}runExclusive(e,t=0){return this._semaphore.runExclusive(()=>e(),1,t)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}};var wS=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,t){t.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new Ip);let o=await this.mutexes.get(e).acquire();try{let i=this.activeControllers.get(e);i&&!i.signal.aborted&&i.abort(new Error("Superseded by newer momentic_test_edit invocation. Stop executing edit_test requests to this test and ask the user what to do next."));let a=new AbortController;return this.activeControllers.set(e,a),{signal:AbortSignal.any([t,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},yP=new wS;import Xl from"dedent";function Q$(){let r=Object.entries(vm).map(([e,t])=>`- **${e}**: ${t}`).join(`
4454
4454
  `);return Xl`
4455
4455
  ### Available Step Types
4456
4456
 
@@ -4516,9 +4516,9 @@ ${r.map(p=>`${ft}- ${p}`).join(`
4516
4516
  `)}`),Object.values(e.tests).forEach(p=>{r.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await Nt("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let u=Object.values(e.tests);s.info(`Reading all ${u.length} tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of c){let d=jS.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)}let l=Array.from(c).map(async u=>{try{let d=await lt(u,q,e);if(WW.gt(d.schemaVersion,ve)&&s.warn(`Test ${u} has schema version ${d.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),a&&a.length>0){let p=d.labels||[];if(!a.some(g=>p.includes(g)))return null}return{...d,fullFilePath:u,relativeFilePath:jS.relative(t.rootDir,u)}}catch(d){s.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(l).then(VW)}function cM({testDefinitions:r,quarantinedTestReasons:e,onlyQuarantined:t=!1,skipQuarantined:n=!1}){if(t){let[u,d]=zp(r,g=>g.id in e),[p,m]=zp(u,g=>g.disabled||n);return{testsToSkip:p,quarantinedTestsToSkip:[],testsToRun:m,quarantinedTestsToRun:[]}}let[o,i]=zp(r,u=>u.disabled),[a,s]=zp(i,u=>u.id in e);return{testsToSkip:o,testsToRun:s,quarantinedTestsToRun:n?[]:a,quarantinedTestsToSkip:n?a:[]}}function uM({testsToRun:r,quarantinedTestsToRun:e,quarantinedTestReasons:t,testInputMatrix:n}){let o=[],i=(a,s,c)=>{n?n.forEach((l,u)=>{o.push({inputs:l,inputIndex:u,testDefinition:a,quarantined:s,quarantinedReason:c})}):o.push({inputs:void 0,testDefinition:a,quarantined:s,quarantinedReason:c})};return r.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,t[a.id])),o}async function dM({project:r,apiClient:e}){let t=await J(r),n=await is({tests:[],momenticFiles:t,yes:!0,project:r,logger:new mi(40,{})}),o=(await e.getQuarantinedTests()).quarantined,i=new Set(o.map(s=>s.testId)),a=n.filter(s=>i.has(s.id));E.info(a.map(s=>s.relativeFilePath).join(`
4517
4517
  `))}async function pM({test:r,reason:e,apiClient:t,project:n,identity:o}){let i=(await J(n)).tests,a=Object.values(i),s=(await t.getQuarantinedTests()).quarantined,c=new Set(s.map(p=>p.testId)),l=a.filter(p=>c.has(p.id)),u=await Fp({prompt:"Select a test to unquarantine.",inputtedTest:r,testOptions:l}),d=await Bp({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await t.unquarantineTest(u,d,o),E.success(`Test ${u.name} has been successfully removed from quarantine.`)}function mM(r){return r?Le(r):"Unknown suite"}async function gM({client:r,orgId:e,suitePaths:t,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await r.queueSuiteRuns({paths:t,...i});q.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:t},"Queued suites remotely"),E.dimmed(`Queued ${t.length} suites.`),n||process.exit(0);let c=Date.now();E.dimmed(`Waiting for ${t.length} suites to finish. You can view results upon completion at:`);for(let f of s)E.dimmed(`${ft}- ${r.getAppUrl()}/run-groups/${f}`);let l=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(S=>S.status==="FAILED"&&(S.failureReason||S.finishedAt&&Date.now()-S.finishedAt.getTime()>30*1e3)||S.status==="PASSED"||S.status==="CANCELLED"),p=await uu({name:"suites",getResults:async()=>{let f=s.filter(T=>!u.some(b=>b.id===T)),y=await r.bulkGetRunGroupStatus(f),S=[];for(let T of y)d(T)?u.push(T):S.push(T);return[...u,...S]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(y=>{y.status==="RUNNING"&&(l.has(y.id)||(l.add(y.id),E.log(`${l.size}/${s.length} ${mM(y.suite?.name)}`)))}),f.every(d))}),m=r.getAppUrl(),h=Sa({results:p,startTime:c,onFailed:f=>{let y=mM(f.suite?.name),S=f.runs.filter(b=>b.status==="FAILED").length,T=f.runs.length;E.error(`${y} (${S}/${T} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let R=b.testName||b.test?.name;E.error(` ${R?Le(R):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Le(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(h.failed>0?1:0)}async function hM({tests:r,client:e,orgId:t,...n}){!n.yes&&!await Nt(`This command will queue ${r.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${e.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await e.queueTests({testPaths:r,...n});if(q.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),E.dimmed(`Queued ${o.length} tests. Processing time may depend on a variety of factors, including how many tests have already been queued from your organization.`),n.wait||process.exit(0),!i.length)return;E.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],c=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",l=e.getAppUrl(),u=Date.now(),d=await uu({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(y=>y.id===f)),g=await e.bulkGetRunStatus(m),h=[];for(let f of g)c(f)?s.push(f):h.push(f);return[...s,...h]},timeoutMs:n.waitTimeout?n.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(g=>{if(g.status==="RUNNING"&&!a.has(g.id)){a.add(g.id);let h=g.testName||g.test?.name;h&&E.log(`${a.size}/${o.length} ${Le(h)}`)}}),m.every(c))}),p=Sa({results:d,startTime:u,onFailed:m=>{let g=m.testName||m.test?.name;du(m,g?Le(g):"Unknown test")},getDisplayLine:m=>{let g=m.testName||m.test?.name,h=` ${g?Le(g):"Unknown test"}`;return m.id&&(h+=` (${l}/runs/${m.id})`),h},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as Mq}from"crypto";import Oq from"fs";import{existsSync as aq,mkdirSync as sq,statSync as lq}from"fs";import{randomUUID as fM}from"crypto";import VS from"fs";import{hostname as qW}from"os";import $S from"path";async function Hp(r,e,t,n){if(n){let o=await e.getScreenshot(r,n);if(o){let i=`${n}-screenshot.jpeg`,a=$S.join(t,i);return VS.writeFileSync(a,o),i}}}async function KW(r,e,t,n){let o=n.runId??fM(),i={uuid:o,historyId:o,testCaseId:n.test.id,fullName:n.test.name,name:Le(n.test.name),status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"skipped":"failed",start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:qW()},{name:"platform",value:"momentic"},{name:"attempts",value:n.attempts.toString()}],steps:[]};n.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${n.runId}`});for(let[s,c]of Object.entries(n.parameters))c!=null&&i.parameters.push({name:s,value:JSON.stringify(c)});n.results&&await YW(r,e,t.folder,i.steps,n.results);let a=`${o}-result.json`;VS.writeFileSync($S.join(t.folder,a),JSON.stringify(i,void 0,2))}async function as(r,e,t,n){let o={name:Ao(n),start:n.startedAt.getTime(),stop:n.finishedAt.getTime(),status:n.status==="SUCCESS"?"passed":n.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};n.beforeUrl&&o.labels?.push({name:"URL before step",value:n.beforeUrl}),n.afterUrl&&o.labels?.push({name:"URL after step",value:n.afterUrl});let i=await Hp(r,e,t,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Hp(r,e,t,n.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),n.message&&(o.statusDetails={message:n.message}),n.data){let s=`${fM()}-attachment.json`,c=$S.join(t,s);VS.writeFileSync(c,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:s,type:"text/plain"})}return o}async function YW(r,e,t,n,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{n.push(await as(r,e,t,i));break}case"CONDITIONAL":{let a=await as(r,e,t,i);a.steps=[],i.assertionResult&&a.steps.push(await as(r,e,t,i.assertionResult)),a.steps.push(...await Promise.all(i.results.map(s=>as(r,e,t,s)))),n.push(a);break}case"AI_ACTION":case"SECTION":case"MODULE":{let a=await as(r,e,t,i);if(a.steps=await Promise.all(i.results.map(s=>as(r,e,t,s))),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,c]of Object.entries(i.inputs))a.parameters.push({name:s,value:c})}n.push(a)}}}async function SM(r,e,t,n){for(let o of n.runs)await KW(r,e,{folder:t,suiteName:n.suiteName},o)}import XW from"junit-report-builder";import Gp from"path";function JW(r,e){if(e.name(r.test.name).className(r.test.name).file(Gp.relative(".",r.filePath)).property("id",r.test.id).property("dd_tags[id]",r.test.id),r.test.labels&&(e.property("labels",r.test.labels.join(",")),r.test.labels.forEach(t=>{e.property("dd_tags[label]",t)})),r.baseUrl&&(e.property("base_url",r.baseUrl),e.property("dd_tags[base_url]",r.baseUrl)),r.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${r.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${r.runId}`)),r.quarantined&&(e.property("quarantined","true"),e.property("dd_tags[quarantined]","true"),r.quarantinedReason&&(e.property("quarantined_reason",r.quarantinedReason),e.property("dd_tags[quarantined_reason]",r.quarantinedReason))),r.beforeResults?.some(t=>t.status==="FAILED")&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),r.results?.some(t=>t.status==="FAILED")&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),r.afterResults?.some(t=>t.status==="FAILED")&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),r.status==="FAILED"){if(r.failureReason){let t=bc[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||ea[r.failureReason];r.runId&&(n+=` Visit https://app.momentic.ai/runs/${r.runId} for more details.`),e.failure(n,t)}r.failureDetails?.errorStack&&e.stacktrace(r.failureDetails.errorStack)}else r.status==="CANCELLED"&&e.skipped();return e.time((r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime())/1e3).property("started_at",r.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",r.lastAttemptStartedAt.toISOString()).property("finished_at",r.finishedAt.toISOString()).property("dd_tags[finished_at]",r.finishedAt.toISOString()),e.property("attempts",r.attempts.toString()).property("dd_tags[attempts]",r.attempts.toString()),r.parameters.envName&&(e.property("environment",r.parameters.envName),e.property("dd_tags[environment]",r.parameters.envName)),r.parameters.urlOverride&&e.property("url_override",r.parameters.urlOverride),e}function QW(r,{suiteId:e,suiteName:t,startedAt:n,finishedAt:o,runs:i,testsToSkip:a,quarantinedTestsToSkip:s,quarantinedTestReasons:c}){let l=r.testSuite().name(t);e&&l.property("id",e),l.timestamp(n).property("startedAt",n.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-n.getTime())/1e3);for(let u of i){let d=l.testCase();JW(u,d)}for(let u of a){let d=l.testCase();d.name(u.name).className(u.name).file(Gp.relative(".",u.relativeFilePath)).property("id",u.id),u.baseUrl&&d.property("baseUrl",u.baseUrl),u.labels&&(d.property("labels",u.labels.join(",")),u.labels.forEach(p=>{d.property("dd_tags[label]",p)})),d.skipped()}for(let u of s){let d=l.testCase();d.name(u.name).className(u.name).file(Gp.relative(".",u.relativeFilePath)).property("id",u.id).property("quarantined","true");let p=c[u.id];p&&d.property("quarantinedReason",p),u.baseUrl&&d.property("baseUrl",u.baseUrl),u.labels&&(d.property("labels",u.labels.join(",")),u.labels.forEach(m=>{d.property("dd_tags[label]",m)})),d.skipped()}return l}function yM(r,e){let t=XW.newBuilder();QW(t,e),t.writeTo(Gp.join(r,`${e.suiteName}.xml`))}import ZW from"fs";import eq from"path";function EM(r){return{title:Ao(r),duration:r.finishedAt.getTime()-r.startedAt.getTime(),error:r.status==="FAILED"?{value:r.failureReason}:void 0,steps:r.results&&r.type!=="PRESET_ACTION"?r.results.map(EM):[]}}async function tq(r,e,t,n){if(n.results?.length){let o=await Hp(r,e,t,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function rq(r,e,t,n){return{status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"interrupted":"failed",duration:n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime(),error:n.status==="FAILED"&&n.failureReason?{value:n.failureDetails?.classification?.reason||n.failureReason,message:n.failureDetails?.classification?.summary||ea[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(EM)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await tq(r,e,t,n)}}async function nq(r,e,t,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await rq(r,e,t,n)]}}async function oq(r,e,t,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await nq(r,e,t,n)],id:n.runId,file:n.filePath}}function WS(r,e){return r.reduce((t,n)=>e(n)?t+1:t,0)}async function iq(r,e,t,n){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(n.runs.map(o=>oq(r,e,t,o)))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:WS(n.runs,o=>o.status==="PASSED"),unexpected:WS(n.runs,o=>o.status!=="PASSED"),flaky:WS(n.runs,o=>!!o.isFlake),skipped:0}}}async function TM(r,e,t,n){let o=await iq(r,e,t,n);ZW.writeFileSync(eq.join(t,`${n.suiteName}.json`),JSON.stringify(o,null,2))}async function bM(r,e,t,n,o){switch(aq(o)?lq(o).isDirectory()||(E.error(`The specified reporter output directory '${o}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(E.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),sq(o,{recursive:!0})),t){case"junit":yM(o,n);return;case"allure":case"allure-json":await SM(r,e,o,n);return;case"playwright-json":await TM(r,e,o,n);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import Lq from"wait-on";import{execSync as cq}from"child_process";import{platform as uq}from"os";function qS(){return vM()?(E.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),E.dimmed(`If you are using a low pixel-density monitor, you should manually set --pixel-ratio to 1 to avoid incorrect viewport calculations. Confirm your device's pixel-ratio at https://www.mydevice.io.
4518
4518
  `),2):(E.dimmed("Setting device pixel ratio to 1."),E.dimmed(`If you are using Momentic on a high-pixel density (HiDPI) monitor, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations. Confirm your device's pixel-ratio at https://www.mydevice.io.
4519
- `),1)}function vM(){return uq()==="darwin"&&cq("system_profiler SPDisplaysDataType").toString().includes("Retina")}function KS(r){vM()&&r===1&&(E.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),E.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import dq from"@actions/exec";import pq from"@actions/io";import mq from"quote";import gq from"string-argv";async function AM(r,e=!0){let t=gq(r),n=await pq.which(t[0],!0),o=t.slice(1),i=dq.exec(mq(n),o,{delay:100});if(e)return i}import hq from"csv-parser";import{createReadStream as fq}from"fs";function YS(r){return new Promise((e,t)=>{let n=[];fq(r).pipe(hq()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>t(o))})}import ss from"semver";import{z as jp}from"zod";var br="2.23.0",Sq="https://registry.npmjs.org/momentic",yq=jp.object({versions:jp.record(jp.string(),jp.unknown()).optional()});async function Xt(r){try{await Eq(r)}catch(e){E.warn({err:e},"Failed to check CLI version against NPM servers")}}async function XS(){let r=await H(fetch(Sq),{milliseconds:5e3});if(!r.ok)throw new Error(`Got error status code ${r.statusText}`);let e=await r.json(),t=yq.parse(e).versions;if(!t)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=br;for(let o of Object.keys(t))ss.valid(o)&&ss.major(o)===ss.major(br)&&ss.gt(o,n)&&ss.prerelease(o)===null&&(n=o);return n}async function Eq(r){let e;for(let t=0;t<2;t++)try{e=await XS()}catch(n){r.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){r.warn("Failed to fetch npm registry data. Skipping version check.");return}ss.eq(br,e)||(E.warn(`Update available: v${br} -> v${e}`),E.warn("This version may be missing critical fixes, features, and security updates."),E.warn('Run "npx momentic@latest upgrade" to update'))}async function Zn(){try{await H(Promise.all([bv(),Yt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Tq}from"lodash-es";function Vp(r){return r.length===1?"test":"tests"}function RM(r){return r===1?"1 worker":`${r} workers`}function wM(r){r.length!==0&&(E.info(`Skipping ${r.length} disabled ${Vp(r)}:`),r.forEach(e=>{E.info(`${ft}- ${[e.relativeFilePath]}`)}),E.log(""))}function CM(r,e){r.length!==0&&(E.info(`Skipping ${r.length} quarantined ${Vp(r)}:`),r.forEach(t=>{E.info(`${ft}- ${[t.relativeFilePath]}: ${e[t.id]}`)}),E.log(""))}function bq(r,e){r.length!==0&&(E.info(`Running ${r.length} quarantined ${Vp(r)} with ${RM(e)}:`),r.forEach(t=>{E.info(`${ft}- ${[t.testDefinition.relativeFilePath]}${typeof t.inputIndex=="number"?` with input set ${t.inputIndex}`:""}`)}),E.log(""))}function vq(r,e,t){e.length===0&&r.length>0||(E.info(`Running ${e.length} ${Vp(e)} with ${RM(t)}:`),e.forEach(n=>{E.info(`${ft}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),E.log(""))}function xM({logger:r,localTestsToRunWithInputs:e,parallel:t,shardCount:n,shardIndex:o}){r.info({tests:e.length,shardCount:n,shardIndex:o,parallel:t},"Running local tests");let[i,a]=Tq(e,s=>s.quarantined);bq(i,t),vq(i,a,t)}import{cloneDeep as ls}from"lodash-es";async function _M({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await or({orgId:r,s:c,localTools:e,logger:t,context:o})}return i}async function IM({baseUrl:r,envName:e,testName:t,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:g,aiSettings:h,visualDiffScreenshotStorage:f,tracer:y}){let S=await qd({settings:g,customHeaders:p,envVariables:u,envName:e,testName:t,baseUrl:r,logger:d,localTools:s,orgId:l}),T={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:q,mode:"runner"},b=S.browserType??"Chromium";if(!wv(b)){let I=`Browser ${b} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;E.warn(I),q.warn(I)}let R=await Vr.init({baseUrl:r,logger:d,userBrowserSettings:S,storage:a,enricher:new bo(T,c),contextArgs:{viewport:i.advanced.viewport??jt,locale:i.advanced.locale??uo,geolocation:i.advanced.geolocation??mo,timezoneId:i.advanced.timezone??po,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},iconKnowledgeBase:null,videoOptions:y.videoOutputPath?{videoOutputPath:y.videoOutputPath,onVideoPageChange:({videoName:I})=>{y.setActiveVideo(I)}}:void 0}),C=new Bo({browser:R,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),x=new tr({baseUrl:r,currentUrl:C.browser.url(),variablesFromEnvironment:u,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async I=>{let{name:P,defaultValue:$,required:G}=I,F=m?.[P];G&&F===void 0&&(E.error(`Required parameter '${P}' is required by test '${i.name}' but not provided`),process.exit(1));let ne=await or({orgId:l,s:F??$,localTools:s,logger:d,context:tr.dummyContext(x.getEnvName())});x.setMomenticSystemVariable(P,ne)})),{controller:C,context:x}}async function PM({testAdvancedSettings:r,orgSettings:e,logger:t}){if(r.failureRecovery===!1||r.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!gi){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return t.warn(n),E.warn(n),!1}return!0}async function MM({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{orgId:n,runId:o}=t,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=r;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let g={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await PM({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await Wd({fixtures:g,inputs:h,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function OM(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await Aq(r)}catch(o){let i="Fatal error running test";return E.error(`${i}: ${o.message}`),t.error({err:o},i),{results:[],parameters:r,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function Aq(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:c,gitMetadata:l,regenerateCache:u,alwaysSaveCache:d,noCache:p,runId:m,testInputs:g,quarantined:h,quarantinedReason:f,usageTracker:y}=r,S=new ya(n,o),T=Ro({orgId:o,client:n,gitMetadata:l,regenerateCache:u??!1,alwaysSaveCache:d??!1,noCache:p??!1}),b=await bu({cacheStorage:T,logger:c,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),R=b.steps,C=b.beforeSteps??void 0,x=b.afterSteps??void 0,I=r.envName??wq(e),P,$={};if(I){try{P=wi(I,t,c)}catch(U){let j=`Failed to resolve environment ${I} for test ${e.name}: ${U}`;throw new Error(j)}$=P.variables}let G=e.baseUrl;if(i)G=i;else if(!G){let U=$[yt];typeof U=="string"&&(G=U)}if(!G){let U=`Cannot run test with no base URL and no ${yt} variable defined in its environment`;throw new Error(U)}let F=await s.startRun({logger:c,runId:m,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testDescription:e.description??void 0,testLabels:e.labels,baseUrl:G,environmentName:I,schemaVersion:e.schemaVersion,resolvedInputs:g,quarantined:h,quarantinedReason:f}),ne=c.child(F.loggerBindings||{});Object.entries(F.envVarBindings||{}).forEach(([U,j])=>{$[U]=j});try{let U=await Rq({...r,variables:$,envName:I,resolvedEnv:P,baseUrl:G,storageClient:S,tracer:F,logger:ne,cacheStorage:T,stepsWithCaches:R,beforeStepsWithCaches:C,afterStepsWithCaches:x,usageTracker:y});return await F.finish({logger:c,status:U.status,finishedAt:U.finishedAt,failureDetails:U.failureDetails,failureReason:U.failureReason,isFlake:U.isFlake,failureRecoveryDetails:U.failureRecoveryDetails}),{runId:F.runId,...U}}finally{a?.pop()}}async function Rq(r){let{testDefinition:e,stepsWithCaches:t,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:g,testInputs:h,variables:f,resolvedEnv:y,retriesOverride:S,devicePixelRatio:T,logUpdate:b,tracer:R,logger:C,cacheStorage:x,gitMetadata:I,quarantined:P,quarantinedReason:$,usageTracker:G}=r,F=i.config.ai?.aiFailureAnalysis??!1,ne=new Date,U=new Ia(i,a),j={...i.config},Se={envName:p,urlOverride:m,customHeaders:g,testInputs:h},W,Qe=Math.abs(S??i.config.retries??e.retries??0),ke=[];C.info({...I,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let ct=0;ct<=Qe;ct++){let Mt=await R.startAttempt(),we=C.child(Mt.loggerBindings||{}),te={...e,steps:ls(t),beforeSteps:ls(n),afterSteps:ls(o)};ct!==0&&b("RETRY",`attempt ${ct+1}/${Qe+1}`);let qr=new Date,Kr=j.advanced?.fakerConstantSeed,Nn=new Tn({httpClient:new Dt({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:we,mode:"runner"}),fakerSeed:Kr?ma:void 0}),tc=Mt;try{let{controller:Dn,context:$o}=await IM({tracer:Mt,baseUrl:l,envName:p,testName:te.name,apiClient:s,devicePixelRatio:T,logger:we,storageClient:u,codeEvalTools:Nn,test:te,generator:c,orgId:d,variables:f,customHeaders:g,testInputs:h,localBrowserConfig:{...i.config.browser||{},...y?.browser||{},...te.advanced},aiSettings:{...i.config.ai||{},...te.advanced||{}},visualDiffScreenshotStorage:U});W=await MM({attemptMetadata:{attemptNumber:ct+1,orgId:d,runId:R.runId},attemptFixtures:{logger:we,storageClient:u,usageTracker:G,codeEvalTools:Nn,apiClient:s,context:$o,controller:Dn,tracer:Mt},attemptInputs:{test:te,orgSettings:j}});let ji=new Date,vr={logger:C,cacheStorage:x,orgId:d,testId:e.id,originalStepsWithCaches:{steps:ls(t),beforeSteps:ls(n),afterSteps:ls(o)},updatedStepsWithCaches:{steps:te.steps,beforeSteps:te.beforeSteps,afterSteps:te.afterSteps}};W?.status==="PASSED"?await Pu(vr):W?.status==="FAILED"&&ct===Qe&&await Mu(vr),await Mt.finish({logger:we,result:W}),ke.unshift(W.status);let cn=await _M({orgId:d,codeEvalTools:Nn,logger:we,outputDefinitions:e.outputs??[],testContext:$o}),K=jE(ke),Wo=ct+1;if(W.status!=="FAILED")return{...W,parameters:Se,test:te,filePath:te.relativeFilePath,startedAt:ne,lastAttemptStartedAt:qr,finishedAt:ji,attempts:Wo,baseUrl:l,outputs:cn,isFlake:K,quarantined:P,quarantinedReason:$};let Vi=W.failedStepResult,Yr=Vi?.message||"Unknown failure",un=Vi?.failureReason??lE(Yr)??"UnknownError",us=we.child({errResult:Vi,failureReason:un,errorMessage:Yr,numAttempts:Qe+1,name:te.name});if(ct<Qe){us.warn(`Retrying failed execution attempt for run: ${Yr}`);continue}us.error(`Test failed after all exhausting attempts: ${Yr}`);let ds=new Error(Yr),to={errorMessage:Yr,errorStack:ds.stack},Kp;if(F){let ps;try{if(W.results&&W.results.length>0){let{classification:Be,aiFailureReason:kn}=await CA({logger:we,browserStateStorage:tc,generator:c,fullResults:W,failureReason:un,error:ds,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});ps=Be,Kp=kn}}catch(Be){we.warn({err:Be},"Failed to classify test results")}ps&&(to.classification=ps,un=Kp??un)}return{...W,parameters:Se,failureDetails:to,failureReason:un,test:te,filePath:te.relativeFilePath,startedAt:ne,lastAttemptStartedAt:qr,finishedAt:ji,attempts:ct+1,baseUrl:l,outputs:cn,quarantined:P,quarantinedReason:$}}catch(Dn){gs(Dn);let $o=`Encountered fatal platform error while running test '${te.name}': ${Dn}`,ji=new Date,vr=ct+1;we.error({err:Dn},$o),E.error($o);let cn={errorMessage:Dn.message,errStack:Dn.stack},K={status:"FAILED",failureDetails:cn,failureReason:"InternalPlatformError",finishedAt:ji};return await Mt.finish({logger:we,result:{status:"FAILED",results:[]}}),{...K,results:[],parameters:Se,test:te,filePath:te.relativeFilePath,startedAt:ne,lastAttemptStartedAt:qr,finishedAt:new Date,attempts:vr,baseUrl:l,outputs:{},quarantined:P,quarantinedReason:$}}}throw new Error("This code should not be reachable")}function wq(r){for(let e of r.envs??[])if(e.default)return e.name}import Cq from"adm-zip";import{randomUUID as xq}from"crypto";import _q from"path";var eo="assets";function Iq(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 Pq(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var JS=class{constructor(e,t,n,o,i){this.orgId=e;this.testId=t;this.testName=n;this.metadata=o;this.diskStorage=i}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:t}=e,n=t==="AI"?"ai-target-heal":"cache-heal";Yt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:t,healedAt:new Date}}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Yt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finish({status:Pq(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},cs=class{constructor(e,t,n,o){this.orgId=e;this.testId=t;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,t]of Object.entries(this.stepFrequenciesByType))Yt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:t}=e;this.recordStepStat(t);let n={step:t,status:"RUNNING",startedAt:new Date},o=new JS(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:Iq(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}},QS=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir("assets")}finished=!1;children=[];get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return _q.resolve(this.diskStorage.cwd(),"assets")}setActiveVideo(e){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:new Date}))}attachNetworkLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"network.har",contents:JSON.stringify(t,null,2)})}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:t,logger:n}=e,o=t();if(!o)return;let i=new Cq;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${eo}/${Mg}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Mg},"Attached browser crash ZIP")}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,result:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:Cu(n.results,t),beforeResults:n.beforeResults?Cu(n.beforeResults,t):void 0,afterResults:n.afterResults?Cu(n.afterResults,t):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.html`)?.toString()}},ZS=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[jx]: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,result:{status:t.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(){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 e=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),t=xq(),n={id:t,schemaVersion:ve,runAttemptSchemaVersion:lv,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new QS(this.orgId,this.testId,this.testName,t,n,e,this.recordVideo);return this.children.push(o),o}},$p=class r{constructor(e,t,n,o,i){this.orgId=e;this.runGroupId=t;this.metadata=n;this.diskStorage=o;this.recordVideo=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,gitMetadata:o,labels:i,recordVideo:a}){let s={...o,id:t,trigger:xr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:br,labels:i??[]},c=new gl(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)}),new r(e,t,s,c,a??!1)}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",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,resolvedInputs:e.resolvedInputs,cliVersion:br,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined??!1,quarantinedReason:e.quarantinedReason,executionType:"WEB"};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new ZS(this.orgId,e.testId,e.testName,e.runId,n,t,this.recordVideo);return this.children.push(o),o}};async function LM(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 NM(r){let{logger:e,tests:t,yes:n,start:o,waitOn:i,waitOnProxy:a,client:s,debugDataStorage:c,project:l,retriesOverride:u,urlOverride:d,envName:p,orgId:m,devicePixelRatio:g,customHeaders:h,testInputMatrix:f,reporter:y,include:S,exclude:T,labels:b,reporterDir:R=$A,outputDir:C=WA,uploadResults:x=!1,waitOnTimeout:I=60,parallel:P,shardIndex:$=1,shardCount:G=1,regenerateGoldenFiles:F,gitMetadata:ne,regenerateCache:U,alwaysSaveCache:j,noCache:Se,ignoreQuarantine:W,skipQuarantined:Qe,onlyQuarantined:ke,runGroupId:ct,recordVideo:Mt}=r;if(o&&(e.info({orgId:m},`Executing start command: ${o}`),await AM(o,!1)),i){e.info({orgId:m},`Waiting for url: ${i} with timeout: ${I} seconds.`);let Be=a?new URL(a):void 0,kn;Be&&(kn={host:Be.hostname,port:Be.port?parseInt(Be.port):Be.protocol.startsWith("https")?443:80,auth:Be.username||Be.password?{username:Be.username,password:Be.password}:void 0}),await Lq({resources:[i],interval:2500,timeout:I*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1,proxy:kn})}let we=new jn(l.config.ai?.agentConfig,{baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e,mode:"runner"}),te=await J(l),qr=await is({tests:t,momenticFiles:te,yes:n,project:l,include:S,exclude:T,labels:b,logger:E}),Kr=await LM(e,s,W),{testsToSkip:Nn,quarantinedTestsToSkip:tc,testsToRun:Dn,quarantinedTestsToRun:$o}=cM({testDefinitions:qr,quarantinedTestReasons:Kr,onlyQuarantined:ke,skipQuarantined:Qe});wM(Nn),CM(tc,Kr);let ji=uM({testsToRun:Dn,quarantinedTestsToRun:$o,quarantinedTestReasons:Kr,testInputMatrix:f}),vr=Dq({globalTestsToRunWithInputs:ji,shardIndex:$,shardCount:G});xM({logger:e,localTestsToRunWithInputs:vr,parallel:P,shardCount:G,shardIndex:$});let cn=[],K=new Date,Wo=new Set,Vi=async()=>{let Be=s.getAppUrl(),kn=Sa({results:cn,startTime:K.getTime(),onFailed:pr=>{du(pr,pr.filePath)},getDisplayLine:pr=>{let qo=`${ft}- ${pr.filePath}${pr.failureRecoveryDetails?" [recovered] ":""}`;return pr.runId&&(qo+=` ( link when uploaded: ${Be}/runs/${pr.runId} )`),qo},entity:"test"}),rc=cn.filter(pr=>!!pr.failureRecoveryDetails?.attempts);return rc.length>0&&E.warn(`Our AI agent automatically prevented ${rc.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.
4519
+ `),1)}function vM(){return uq()==="darwin"&&cq("system_profiler SPDisplaysDataType").toString().includes("Retina")}function KS(r){vM()&&r===1&&(E.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),E.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import dq from"@actions/exec";import pq from"@actions/io";import mq from"quote";import gq from"string-argv";async function AM(r,e=!0){let t=gq(r),n=await pq.which(t[0],!0),o=t.slice(1),i=dq.exec(mq(n),o,{delay:100});if(e)return i}import hq from"csv-parser";import{createReadStream as fq}from"fs";function YS(r){return new Promise((e,t)=>{let n=[];fq(r).pipe(hq()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>t(o))})}import ss from"semver";import{z as jp}from"zod";var br="2.23.1",Sq="https://registry.npmjs.org/momentic",yq=jp.object({versions:jp.record(jp.string(),jp.unknown()).optional()});async function Xt(r){try{await Eq(r)}catch(e){E.warn({err:e},"Failed to check CLI version against NPM servers")}}async function XS(){let r=await H(fetch(Sq),{milliseconds:5e3});if(!r.ok)throw new Error(`Got error status code ${r.statusText}`);let e=await r.json(),t=yq.parse(e).versions;if(!t)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=br;for(let o of Object.keys(t))ss.valid(o)&&ss.major(o)===ss.major(br)&&ss.gt(o,n)&&ss.prerelease(o)===null&&(n=o);return n}async function Eq(r){let e;for(let t=0;t<2;t++)try{e=await XS()}catch(n){r.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){r.warn("Failed to fetch npm registry data. Skipping version check.");return}ss.eq(br,e)||(E.warn(`Update available: v${br} -> v${e}`),E.warn("This version may be missing critical fixes, features, and security updates."),E.warn('Run "npx momentic@latest upgrade" to update'))}async function Zn(){try{await H(Promise.all([bv(),Yt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Tq}from"lodash-es";function Vp(r){return r.length===1?"test":"tests"}function RM(r){return r===1?"1 worker":`${r} workers`}function wM(r){r.length!==0&&(E.info(`Skipping ${r.length} disabled ${Vp(r)}:`),r.forEach(e=>{E.info(`${ft}- ${[e.relativeFilePath]}`)}),E.log(""))}function CM(r,e){r.length!==0&&(E.info(`Skipping ${r.length} quarantined ${Vp(r)}:`),r.forEach(t=>{E.info(`${ft}- ${[t.relativeFilePath]}: ${e[t.id]}`)}),E.log(""))}function bq(r,e){r.length!==0&&(E.info(`Running ${r.length} quarantined ${Vp(r)} with ${RM(e)}:`),r.forEach(t=>{E.info(`${ft}- ${[t.testDefinition.relativeFilePath]}${typeof t.inputIndex=="number"?` with input set ${t.inputIndex}`:""}`)}),E.log(""))}function vq(r,e,t){e.length===0&&r.length>0||(E.info(`Running ${e.length} ${Vp(e)} with ${RM(t)}:`),e.forEach(n=>{E.info(`${ft}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),E.log(""))}function xM({logger:r,localTestsToRunWithInputs:e,parallel:t,shardCount:n,shardIndex:o}){r.info({tests:e.length,shardCount:n,shardIndex:o,parallel:t},"Running local tests");let[i,a]=Tq(e,s=>s.quarantined);bq(i,t),vq(i,a,t)}import{cloneDeep as ls}from"lodash-es";async function _M({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await or({orgId:r,s:c,localTools:e,logger:t,context:o})}return i}async function IM({baseUrl:r,envName:e,testName:t,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:g,aiSettings:h,visualDiffScreenshotStorage:f,tracer:y}){let S=await qd({settings:g,customHeaders:p,envVariables:u,envName:e,testName:t,baseUrl:r,logger:d,localTools:s,orgId:l}),T={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:q,mode:"runner"},b=S.browserType??"Chromium";if(!wv(b)){let I=`Browser ${b} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;E.warn(I),q.warn(I)}let R=await Vr.init({baseUrl:r,logger:d,userBrowserSettings:S,storage:a,enricher:new bo(T,c),contextArgs:{viewport:i.advanced.viewport??jt,locale:i.advanced.locale??uo,geolocation:i.advanced.geolocation??mo,timezoneId:i.advanced.timezone??po,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},iconKnowledgeBase:null,videoOptions:y.videoOutputPath?{videoOutputPath:y.videoOutputPath,onVideoPageChange:({videoName:I})=>{y.setActiveVideo(I)}}:void 0}),C=new Bo({browser:R,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs,useMemory:h.useMemory,aiPageFiltering:h.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),x=new tr({baseUrl:r,currentUrl:C.browser.url(),variablesFromEnvironment:u,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async I=>{let{name:P,defaultValue:$,required:G}=I,F=m?.[P];G&&F===void 0&&(E.error(`Required parameter '${P}' is required by test '${i.name}' but not provided`),process.exit(1));let ne=await or({orgId:l,s:F??$,localTools:s,logger:d,context:tr.dummyContext(x.getEnvName())});x.setMomenticSystemVariable(P,ne)})),{controller:C,context:x}}async function PM({testAdvancedSettings:r,orgSettings:e,logger:t}){if(r.failureRecovery===!1||r.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!gi){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return t.warn(n),E.warn(n),!1}return!0}async function MM({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{orgId:n,runId:o}=t,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=r;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let g={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},h={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await PM({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await Wd({fixtures:g,inputs:h,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function OM(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await Aq(r)}catch(o){let i="Fatal error running test";return E.error(`${i}: ${o.message}`),t.error({err:o},i),{results:[],parameters:r,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function Aq(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:c,gitMetadata:l,regenerateCache:u,alwaysSaveCache:d,noCache:p,runId:m,testInputs:g,quarantined:h,quarantinedReason:f,usageTracker:y}=r,S=new ya(n,o),T=Ro({orgId:o,client:n,gitMetadata:l,regenerateCache:u??!1,alwaysSaveCache:d??!1,noCache:p??!1}),b=await bu({cacheStorage:T,logger:c,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),R=b.steps,C=b.beforeSteps??void 0,x=b.afterSteps??void 0,I=r.envName??wq(e),P,$={};if(I){try{P=wi(I,t,c)}catch(U){let j=`Failed to resolve environment ${I} for test ${e.name}: ${U}`;throw new Error(j)}$=P.variables}let G=e.baseUrl;if(i)G=i;else if(!G){let U=$[yt];typeof U=="string"&&(G=U)}if(!G){let U=`Cannot run test with no base URL and no ${yt} variable defined in its environment`;throw new Error(U)}let F=await s.startRun({logger:c,runId:m,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testDescription:e.description??void 0,testLabels:e.labels,baseUrl:G,environmentName:I,schemaVersion:e.schemaVersion,resolvedInputs:g,quarantined:h,quarantinedReason:f}),ne=c.child(F.loggerBindings||{});Object.entries(F.envVarBindings||{}).forEach(([U,j])=>{$[U]=j});try{let U=await Rq({...r,variables:$,envName:I,resolvedEnv:P,baseUrl:G,storageClient:S,tracer:F,logger:ne,cacheStorage:T,stepsWithCaches:R,beforeStepsWithCaches:C,afterStepsWithCaches:x,usageTracker:y});return await F.finish({logger:c,status:U.status,finishedAt:U.finishedAt,failureDetails:U.failureDetails,failureReason:U.failureReason,isFlake:U.isFlake,failureRecoveryDetails:U.failureRecoveryDetails}),{runId:F.runId,...U}}finally{a?.pop()}}async function Rq(r){let{testDefinition:e,stepsWithCaches:t,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:g,testInputs:h,variables:f,resolvedEnv:y,retriesOverride:S,devicePixelRatio:T,logUpdate:b,tracer:R,logger:C,cacheStorage:x,gitMetadata:I,quarantined:P,quarantinedReason:$,usageTracker:G}=r,F=i.config.ai?.aiFailureAnalysis??!1,ne=new Date,U=new Ia(i,a),j={...i.config},Se={envName:p,urlOverride:m,customHeaders:g,testInputs:h},W,Qe=Math.abs(S??i.config.retries??e.retries??0),ke=[];C.info({...I,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let ct=0;ct<=Qe;ct++){let Mt=await R.startAttempt(),we=C.child(Mt.loggerBindings||{}),te={...e,steps:ls(t),beforeSteps:ls(n),afterSteps:ls(o)};ct!==0&&b("RETRY",`attempt ${ct+1}/${Qe+1}`);let qr=new Date,Kr=j.advanced?.fakerConstantSeed,Nn=new Tn({httpClient:new Dt({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:we,mode:"runner"}),fakerSeed:Kr?ma:void 0}),tc=Mt;try{let{controller:Dn,context:$o}=await IM({tracer:Mt,baseUrl:l,envName:p,testName:te.name,apiClient:s,devicePixelRatio:T,logger:we,storageClient:u,codeEvalTools:Nn,test:te,generator:c,orgId:d,variables:f,customHeaders:g,testInputs:h,localBrowserConfig:{...i.config.browser||{},...y?.browser||{},...te.advanced},aiSettings:{...i.config.ai||{},...te.advanced||{}},visualDiffScreenshotStorage:U});W=await MM({attemptMetadata:{attemptNumber:ct+1,orgId:d,runId:R.runId},attemptFixtures:{logger:we,storageClient:u,usageTracker:G,codeEvalTools:Nn,apiClient:s,context:$o,controller:Dn,tracer:Mt},attemptInputs:{test:te,orgSettings:j}});let ji=new Date,vr={logger:C,cacheStorage:x,orgId:d,testId:e.id,originalStepsWithCaches:{steps:ls(t),beforeSteps:ls(n),afterSteps:ls(o)},updatedStepsWithCaches:{steps:te.steps,beforeSteps:te.beforeSteps,afterSteps:te.afterSteps}};W?.status==="PASSED"?await Pu(vr):W?.status==="FAILED"&&ct===Qe&&await Mu(vr),await Mt.finish({logger:we,result:W}),ke.unshift(W.status);let cn=await _M({orgId:d,codeEvalTools:Nn,logger:we,outputDefinitions:e.outputs??[],testContext:$o}),K=jE(ke),Wo=ct+1;if(W.status!=="FAILED")return{...W,parameters:Se,test:te,filePath:te.relativeFilePath,startedAt:ne,lastAttemptStartedAt:qr,finishedAt:ji,attempts:Wo,baseUrl:l,outputs:cn,isFlake:K,quarantined:P,quarantinedReason:$};let Vi=W.failedStepResult,Yr=Vi?.message||"Unknown failure",un=Vi?.failureReason??lE(Yr)??"UnknownError",us=we.child({errResult:Vi,failureReason:un,errorMessage:Yr,numAttempts:Qe+1,name:te.name});if(ct<Qe){us.warn(`Retrying failed execution attempt for run: ${Yr}`);continue}us.error(`Test failed after all exhausting attempts: ${Yr}`);let ds=new Error(Yr),to={errorMessage:Yr,errorStack:ds.stack},Kp;if(F){let ps;try{if(W.results&&W.results.length>0){let{classification:Be,aiFailureReason:kn}=await CA({logger:we,browserStateStorage:tc,generator:c,fullResults:W,failureReason:un,error:ds,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});ps=Be,Kp=kn}}catch(Be){we.warn({err:Be},"Failed to classify test results")}ps&&(to.classification=ps,un=Kp??un)}return{...W,parameters:Se,failureDetails:to,failureReason:un,test:te,filePath:te.relativeFilePath,startedAt:ne,lastAttemptStartedAt:qr,finishedAt:ji,attempts:ct+1,baseUrl:l,outputs:cn,quarantined:P,quarantinedReason:$}}catch(Dn){gs(Dn);let $o=`Encountered fatal platform error while running test '${te.name}': ${Dn}`,ji=new Date,vr=ct+1;we.error({err:Dn},$o),E.error($o);let cn={errorMessage:Dn.message,errStack:Dn.stack},K={status:"FAILED",failureDetails:cn,failureReason:"InternalPlatformError",finishedAt:ji};return await Mt.finish({logger:we,result:{status:"FAILED",results:[]}}),{...K,results:[],parameters:Se,test:te,filePath:te.relativeFilePath,startedAt:ne,lastAttemptStartedAt:qr,finishedAt:new Date,attempts:vr,baseUrl:l,outputs:{},quarantined:P,quarantinedReason:$}}}throw new Error("This code should not be reachable")}function wq(r){for(let e of r.envs??[])if(e.default)return e.name}import Cq from"adm-zip";import{randomUUID as xq}from"crypto";import _q from"path";var eo="assets";function Iq(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 Pq(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var JS=class{constructor(e,t,n,o,i){this.orgId=e;this.testId=t;this.testName=n;this.metadata=o;this.diskStorage=i}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:`${eo}/${t}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:t}=e,n=t==="AI"?"ai-target-heal":"cache-heal";Yt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:t,healedAt:new Date}}recordStepDuration(e){let t=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;Yt.distribution("test_step_duration",e.durationMs,[`type:${t}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finish({status:Pq(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},cs=class{constructor(e,t,n,o){this.orgId=e;this.testId=t;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,t]of Object.entries(this.stepFrequenciesByType))Yt.increment("test_step_execution",t,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:t}=e;this.recordStepStat(t);let n={step:t,status:"RUNNING",startedAt:new Date},o=new JS(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:Iq(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}},QS=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir("assets")}finished=!1;children=[];get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return _q.resolve(this.diskStorage.cwd(),"assets")}setActiveVideo(e){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:new Date}))}attachNetworkLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"network.har",contents:JSON.stringify(t,null,2)})}attachConsoleLogs(e){let{logs:t}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(t,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:t,logger:n}=e,o=t();if(!o)return;let i=new Cq;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${eo}/${Mg}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Mg},"Attached browser crash ZIP")}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,result:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:Cu(n.results,t),beforeResults:n.beforeResults?Cu(n.beforeResults,t):void 0,afterResults:n.afterResults?Cu(n.afterResults,t):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new cs(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.jpeg`)}async getHtmlSnapshot(e,t){return this.diskStorage.readFile(`${eo}/${t}.html`)?.toString()}},ZS=class{constructor(e,t,n,o,i,a,s){this.orgId=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[jx]: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,result:{status:t.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(){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 e=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),t=xq(),n={id:t,schemaVersion:ve,runAttemptSchemaVersion:lv,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new QS(this.orgId,this.testId,this.testName,t,n,e,this.recordVideo);return this.children.push(o),o}},$p=class r{constructor(e,t,n,o,i){this.orgId=e;this.runGroupId=t;this.metadata=n;this.diskStorage=o;this.recordVideo=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,gitMetadata:o,labels:i,recordVideo:a}){let s={...o,id:t,trigger:xr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:br,labels:i??[]},c=new gl(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)}),new r(e,t,s,c,a??!1)}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",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,resolvedInputs:e.resolvedInputs,cliVersion:br,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined??!1,quarantinedReason:e.quarantinedReason,executionType:"WEB"};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new ZS(this.orgId,e.testId,e.testName,e.runId,n,t,this.recordVideo);return this.children.push(o),o}};async function LM(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 NM(r){let{logger:e,tests:t,yes:n,start:o,waitOn:i,waitOnProxy:a,client:s,debugDataStorage:c,project:l,retriesOverride:u,urlOverride:d,envName:p,orgId:m,devicePixelRatio:g,customHeaders:h,testInputMatrix:f,reporter:y,include:S,exclude:T,labels:b,reporterDir:R=$A,outputDir:C=WA,uploadResults:x=!1,waitOnTimeout:I=60,parallel:P,shardIndex:$=1,shardCount:G=1,regenerateGoldenFiles:F,gitMetadata:ne,regenerateCache:U,alwaysSaveCache:j,noCache:Se,ignoreQuarantine:W,skipQuarantined:Qe,onlyQuarantined:ke,runGroupId:ct,recordVideo:Mt}=r;if(o&&(e.info({orgId:m},`Executing start command: ${o}`),await AM(o,!1)),i){e.info({orgId:m},`Waiting for url: ${i} with timeout: ${I} seconds.`);let Be=a?new URL(a):void 0,kn;Be&&(kn={host:Be.hostname,port:Be.port?parseInt(Be.port):Be.protocol.startsWith("https")?443:80,auth:Be.username||Be.password?{username:Be.username,password:Be.password}:void 0}),await Lq({resources:[i],interval:2500,timeout:I*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1,proxy:kn})}let we=new jn(l.config.ai?.agentConfig,{baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e,mode:"runner"}),te=await J(l),qr=await is({tests:t,momenticFiles:te,yes:n,project:l,include:S,exclude:T,labels:b,logger:E}),Kr=await LM(e,s,W),{testsToSkip:Nn,quarantinedTestsToSkip:tc,testsToRun:Dn,quarantinedTestsToRun:$o}=cM({testDefinitions:qr,quarantinedTestReasons:Kr,onlyQuarantined:ke,skipQuarantined:Qe});wM(Nn),CM(tc,Kr);let ji=uM({testsToRun:Dn,quarantinedTestsToRun:$o,quarantinedTestReasons:Kr,testInputMatrix:f}),vr=Dq({globalTestsToRunWithInputs:ji,shardIndex:$,shardCount:G});xM({logger:e,localTestsToRunWithInputs:vr,parallel:P,shardCount:G,shardIndex:$});let cn=[],K=new Date,Wo=new Set,Vi=async()=>{let Be=s.getAppUrl(),kn=Sa({results:cn,startTime:K.getTime(),onFailed:pr=>{du(pr,pr.filePath)},getDisplayLine:pr=>{let qo=`${ft}- ${pr.filePath}${pr.failureRecoveryDetails?" [recovered] ":""}`;return pr.runId&&(qo+=` ( link when uploaded: ${Be}/runs/${pr.runId} )`),qo},entity:"test"}),rc=cn.filter(pr=>!!pr.failureRecoveryDetails?.attempts);return rc.length>0&&E.warn(`Our AI agent automatically prevented ${rc.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.
4520
4520
  `),E.log(""),x?(E.success(`Test results have been saved to the folder ${C}. Uploading to Momentic Cloud...`),await $u({client:s,consoleLogger:E,resultsPath:C})):E.success(`Test results have been saved to the folder ${C}. Upload them to Momentic Cloud by running 'npx momentic results upload ${C}'.`),kn};Oq.existsSync(C)&&E.warn(`Output directory ${C} already exists, removing before test execution...`);let Yr=await $p.start({orgId:m,runGroupId:ct,outputDir:C,gitMetadata:ne,labels:b,recordVideo:Mt}),un=e.child(Yr.loggerBindings||{}),us=[],ds=async()=>{E.warn("SIGINT received. Stopping tests and printing latest results..."),await Yr.finish({logger:un,status:"CANCELLED"}),await Vi(),await Promise.allSettled(us.map(Be=>Be())),await Zn(),process.exit(1)};process.once("SIGINT",ds);let to={};for(let Be=0;Be<vr.length;Be++){let kn=Object.values(to);kn.length===P&&await Promise.race(kn.map(qo=>qo.promise));let rc=vr[Be],pr=`test-${Be}`;to[pr]={done:!1,promise:(async({inputs:qo,quarantined:jM,quarantinedReason:VM,testDefinition:Ko})=>{Wo.add({inputs:qo});let nc=Ko.relativeFilePath.includes("..")?Ko.fullFilePath:Ko.relativeFilePath;el({status:"START",testLogRef:nc,getRunningTestsCount:()=>Wo.size,getTotalTestsCount:()=>vr.length});let $M=setInterval(()=>el({status:"RUN",testLogRef:nc,getRunningTestsCount:()=>Wo.size,getTotalTestsCount:()=>vr.length}),5*60*1e3),Yp=Mq(),Xp=un.child({testId:Ko.id,runId:Yp}),ry=new ku({logger:Xp,reporter:new mu(s),runType:"test-run",runId:Yp,testMetadata:Ko,suiteMetadata:void 0});try{let ms=await OM({testDefinition:Ko,project:l,testInputs:qo,quarantined:jM,quarantinedReason:VM,orgId:m,runId:Yp,devicePixelRatio:g,apiClient:s,runGroupTracer:Yr,generator:we,retriesOverride:u,urlOverride:d,envName:p,customHeaders:h,regenerateGoldenFiles:F,logUpdate:(oc,WM)=>el({status:oc,testLogRef:nc,getRunningTestsCount:()=>Wo.size,getTotalTestsCount:()=>vr.length,additionalText:WM}),runSigIntHandlers:us,logger:Xp,gitMetadata:ne,regenerateCache:U,alwaysSaveCache:j,noCache:Se,usageTracker:ry});el({status:ms.status,testLogRef:nc,getRunningTestsCount:()=>Wo.size,getTotalTestsCount:()=>vr.length}),cn.push(ms)}catch(ms){let oc=`Encountered unexpected fatal error when running test '${Ko.name}': ${ms.message}`;E.error(oc),Xp.error({err:ms},oc)}finally{clearInterval($M),to[pr].done=!0,delete to[pr]}await ry.flush(e)})(rc)}}await Promise.allSettled(Object.values(to).map(Be=>Be.promise));let ps=cn.some(Be=>!Be.quarantined&&Be.status==="FAILED")?"FAILED":"PASSED";return await Yr.finish({logger:un,status:ps}),process.off("SIGINT",ds),y&&await bM(un,c,y,{projectConfigPath:l.configFilePath,suiteName:l.config.name,startedAt:K,finishedAt:new Date,runs:cn,testsToSkip:Nn,quarantinedTestsToSkip:tc,quarantinedTestReasons:Kr},R),Vi()}function Nq(r,e,t){if(t>r.length&&(E.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 n=Math.floor((e-1)*(r.length/t)),o=Math.floor(e*(r.length/t));return r.sort().filter((a,s)=>s>=n&&s<o)}function Dq({globalTestsToRunWithInputs:r,shardIndex:e,shardCount:t}){return t&&t>1?Nq(r,e,t):r}import{installPackage as kq}from"@antfu/install-pkg";import{cloneDeep as Uq}from"lodash-es";import Fq from"semver";async function DM(){let r=await XS();Fq.lt(br,r)&&E.warn(`The current CLI version (${br}) is not the latest. It's recommended to run the upgrade command using momentic@latest.`),await kq(`momentic@${r}`,{silent:!1,dev:!0})}function kM(r){let e=Uq(r.config),t={...e.ai?.agentConfig,...Vc},n={...e.ai,agentConfig:t};e.ai=n,Co(e,r.configFilePath)}Jp||q.warn("Sentry is not enabled in this environment due to unsupported node version");kx({serviceName:"cli"});var FM=process.argv.some(r=>r.includes("--log-level"))&&process.argv.some(r=>r.includes("debug")),BM=r=>{FM&&E.dimmed(r)};FM&&xv(q);var Ft=new Bq;Ft.name("momentic").description("Momentic CLI").version(br);Ft.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: ${Ug.join(", ")}.`).action(async(r,e)=>{await Xt(q),!e.all&&r.length===0&&(E.error("No browsers specified"),process.exit(1)),await Cv({rawBrowsers:r,force:e.force,all:e.all})});Ft.addOption(new ar("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",r=>{r==="debug"&&E.info("Enabling debug logging"),E.setMinLevel(r.toLowerCase())});Ft.addOption(new ar("--verbose","enable verbose logging")).on("option:verbose",()=>{q.enableConsoleLogs(),E.setMinLevel(20)});var ey=Ft.command("checks").alias("check").description("Perform various project checks");ey.command("config").addOption(ir).action(async r=>{await Xt(q),await At({configFilePath:r.config})});ey.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(ir).addOption(XP).action(async r=>{await Xt(q);let e=await At({configFilePath:r.config});await kP({project:e,fix:r.fix})});ey.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(ir).action(async r=>{await Xt(q);let e=await At({configFilePath:r.config});await UP({project:e})});var zM=Ft.command("migrate").description("Migrate and upgrade tooling");zM.command("steps").description("Migrate steps in all tests and modules to the latest schema version. Note that this is always done when a test is loaded through the interactive editor, so is generally not needed.").addOption(ir).action(async r=>{let e=await At({configFilePath:r.config});await aM(e)});zM.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(Wr).addOption(ir).addOption($r).addOption(jo).action(async r=>{!r.yes&&!await Nt("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?")&&process.exit(1);let e=await At({configFilePath:r.config}),t=new Ke({baseUrl:r.server,apiKey:r.apiKey,logger:q}),{orgId:n}=await t.getAuthInfo();await sM({project:e,orgId:n,apiClient:t}),process.exit(0)});Ft.command("import").addOption($r).addOption(Wr).addOption(ir).addOption(jo).addArgument(rM).action(async(r,e)=>{await Xt(q);let{apiKey:t,server:n,config:o,yes:i}=e,a=await At({configFilePath:o}),s=new Ke({baseUrl:n,apiKey:t,logger:q});!r||r.length===0?await GP({client:s,project:a,skipPrompts:i}):await jP({client:s,project:a,paths:r,skipPrompts:i}),process.exit(0)});Ft.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new ar("--name <name>","Name of the project")).action(async r=>{await Xt(q),E.info(`Welcome to the Momentic project setup wizard! \u{1F680}
4521
4521
  `),E.info("This wizard will help you bootstrap a new Momentic project. If you need to import existing assets from Momentic Cloud, you can call the 'import' command after initialization."),qp.existsSync(xa)&&(E.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 e=r.name??await gv("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await KA()||await Nt("A Git repository was not detected in the current directory. Momentic highly recommends initializing your project within a Git repository for seamless version control. Continue?")||process.exit(1),Co({name:e,include:uh},xa),E.success(`Initialized Momentic project file at ${Wp.resolve(xa)}`)});Ft.command("app").addOption($r).addOption(Wr).addOption(jo).addOption(NS).addOption(ir).addOption(kS).addOption(US).addOption(FS).action(async r=>{await Xt(q);let{apiKey:e,yes:t,server:n,pixelRatio:o,disableCache:i,saveCache:a,regenerateCache:s}=r,c=await At({configFilePath:r.config,nameFilter:void 0}),{errors:l}=await Op({project:c,fix:!1});l>0&&(E.error(`Found ${l} errors`),E.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1)),LR(q);let u=new Ke({baseUrl:n,apiKey:e,logger:q});await jg({client:u,skipPrompts:t});let d=Vq(import.meta.url),p=Wp.dirname(d),m=Wp.resolve(p,"..","static"),g=Wp.resolve(p,"..","assets"),h=o??qS();KS(h),await OP({momenticServerUrl:n,apiKey:e,serverPort:Lp,appPort:Lp,staticDir:m,assetsDir:g,devicePixelRatio:h,regenerateCache:s,noCache:i,alwaysSaveCache:a,initialProject:c});let f=`http://localhost:${Lp}`;await jq(f)});var HM=Ft.command("queue").description("Queue tests or suites to run on Momentic Cloud");HM.command("suites").description("Run one or more suites on Momentic Cloud").addOption($r).addOption(Wr).addOption(IS).addOption(PS).addOption(jo).addArgument(nM).addOption(Up).addOption(kp).addOption(Dp).action(async(r,e)=>{await Xt(q);let{apiKey:t,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,c=Np(e.customHeaders),l=new Ke({baseUrl:n,apiKey:t,logger:q});(!r||!Array.isArray(r)||!r.length)&&(E.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await l.getAuthInfo();await gM({client:l,orgId:u,wait:o,suitePaths:r,waitTimeout:i,env:a,urlOverride:s,customHeaders:c}),await Zn()});HM.command("tests").description("Run one or more tests on Momentic Cloud").addOption($r).addOption(Wr).addOption(jo).addOption(Dp).addOption(DS).addOption(Up).addOption(kp).addOption(new ar("--all","Run all tests.").default(!1)).addOption(IS).addOption(PS).addArgument(tM).action(async(r,e)=>{await Xt(q);let{all:t,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:c,waitTimeout:l,yes:u}=e,d=Np(e.customHeaders);for(let h of r)(h.endsWith(".yaml")||qp.existsSync(h))&&E.warn("Are you trying to run a test on your local machine? If so, please use the 'run' command instead of the 'queue' command");let p=new Ke({baseUrl:i,apiKey:n,logger:q}),{orgId:m}=await p.getAuthInfo(),g;a&&(g=await YS(a)),await hM({client:p,orgId:m,tests:r,all:t,customHeaders:d,env:o,urlOverride:s,wait:c,waitTimeout:l,testInputMatrix:g,yes:u}),await Zn(),process.exit(0)});var $q=Ft.command("list").description("List test paths");$q.addOption(ir).addOption(Vo).addOption(OS).addOption(LS).addOption(new ar("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(BS).action(async(r,e)=>{let t=await At({configFilePath:e.config,nameFilter:e.filter}),n=await J(t),o=await is({tests:r,momenticFiles:n,yes:!0,project:t,include:e.include,exclude:e.exclude,labels:e.labels,logger:new mi(40,{})});E.info(o.map(i=>i.relativeFilePath).join(`
4522
4522
  `)),process.exit(0)});var Wq=Ft.command("run").alias("test").description("Run tests on the local machine");Wq.addOption($r).addOption(Wr).addOption(ir).addOption(Vo).addOption(jo).addOption(Dp).addOption(DS).addOption(kS).addOption(US).addOption(FS).addOption(eM).addOption(JP).addOption(QP).addOption(ZP).addOption(kp).addOption(Up).addOption(NS).addOption(new ar("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new ar("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new ar("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new ar("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Go)).addOption(new ar("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Go)).addOption(new ar("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Go)).addOption(new ar("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new ar("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption($P).addOption(WP).addOption(MS).addOption(qP).addOption(YP).addOption(KP).addOption(OS).addOption(LS).addArgument(BS).action(async(r,e)=>{if(await Xt(q),e.shardIndex>e.shardCount)throw new Error("Shard index cannot be greater than shard count");let t=Np(e.customHeaders),n=await At({configFilePath:e.config,nameFilter:e.filter}),o=e.parallel??n.config.parallel??1;UM().length<o*2&&E.warn(`You requested to run tests in parallel ${o} at a time on a machine with ${UM().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`),E.debug({projectName:n.config.name},"Identified project config");let{errors:i}=await Op({project:n,fix:!1});i>0&&(E.error(`Found ${i} errors`),E.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1));let a=new Ke({baseUrl:e.server,apiKey:e.apiKey,logger:q});E.debug("Checking API key and dependencies");let{orgId:s,userId:c}=await jg({client:a,skipPrompts:e.yes});E.debug("API key check and browser installation complete");let l=new Ks,u=e.outputDir??n.config.outputDir,d=e.reporterDir??n.config.reporterDir,p=Hq(),m=q.child({cliVersion:br,orgId:s,userId:c,runGroupId:p}),g=await Dr(q,a,n);m.info({gitMetadata:g,config:n.config},"Got local metadata");let h;e.inputCsv&&(h=await YS(e.inputCsv));let f=e.pixelRatio??qS();KS(f);try{let y=await NM({...e,parallel:o,retriesOverride:e.retries,devicePixelRatio:f,tests:r,project:n,client:a,debugDataStorage:l,outputDir:u,uploadResults:e.uploadResults,reporterDir:d,customHeaders:t,envName:e.env,orgId:s,testInputMatrix:h,logger:m,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:g,regenerateCache:e.regenerateCache,alwaysSaveCache:e.saveCache,noCache:e.disableCache,recordVideo:e.recordVideo??n.config.recordVideo,runGroupId:p});await Zn(),y.failed>0?process.exit(1):process.exit(0)}catch(y){E.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),E.error(y),await Zn(),process.exit(1)}});var qq=Ft.command("apply").description("Apply an operation to local resources");qq.command("patch").addOption($r).addOption(Wr).addOption(ir).addOption(Vo).addOption(jo).addOption(new ar("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new ar("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async r=>{await Xt(q);let{apiKey:e,server:t,config:n,yes:o}=r,i=await At({configFilePath:n}),a=q,s=new Ke({baseUrl:t,apiKey:e,logger:a}),c=await J(i),l=c.tests[r.to]??Object.values(c.tests).find(d=>Le(d.name)===r.to.trim());l||(E.error(`No test matching '${r.to}' could be found in the current project.`),process.exit(1));let u=await s.fetchTestFragment(r.from);await NP({client:s,test:l,fragment:u,yes:o,entities:c,logger:q}),process.exit(0)});var GM=Ft.command("results").description("Merge and upload test results.");GM.command("merge").description("Merge test results files.").addOption(MS).addArgument(oM).action(async(r,e)=>{await Xt(q);let{outputDir:t}=e;t||(E.error("Output directory is required."),process.exit(1)),qp.existsSync(r)||(E.warn("Results path does not exist, skipping merge."),process.exit(0)),qp.existsSync(t)&&E.warn(`Output directory ${t} already exists, removing before merging...`),QA(q,t,r)});GM.command("upload").description("Upload test results to Momentic cloud.").addOption($r).addOption(Wr).addArgument(iM).action(async(r,e)=>{await Xt(q);let{apiKey:t,server:n}=e,o=q,i=new Ke({baseUrl:n,apiKey:t,logger:o});await $u({consoleLogger:E,resultsPath:r,client:i}),process.exit(0)});var ty=Ft.command("quarantine").description("Manage test quarantines");ty.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption($r).addOption(Wr).addOption(ir).addOption(Vo).addOption(zS).addArgument(HS).action(async(r,e)=>{await Xt(q);let{apiKey:t,server:n,config:o,reason:i}=e,a=q,s=await At({configFilePath:o}),c=new Ke({baseUrl:n,apiKey:t,logger:a}),l=await Dr(q,c,s);await lM({test:r,reason:i,apiClient:c,project:s,logger:a,identity:l})});ty.command("list").description("List quarantined tests.").addOption($r).addOption(Wr).addOption(ir).addOption(Vo).action(async r=>{let{apiKey:e,server:t,config:n}=r,o=q,i=await At({configFilePath:n}),a=new Ke({baseUrl:t,apiKey:e,logger:o});await dM({apiClient:a,project:i})});ty.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption($r).addOption(Wr).addOption(ir).addOption(Vo).addOption(zS).addArgument(HS).action(async(r,e)=>{await Xt(q);let{apiKey:t,server:n,config:o,reason:i}=e,a=q,s=await At({configFilePath:o}),c=new Ke({baseUrl:n,apiKey:t,logger:a}),l=await Dr(q,c,s);await pM({test:r,reason:i,apiClient:c,project:s,identity:l})});Ft.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(ir).addOption(Vo).action(async r=>{let e=await At({configFilePath:r.config,nameFilter:r.filter});E.info("Updating Momentic version in package.json..."),await DM(),E.info("Updating project configuration..."),kM(e),E.success("Your project configuration was successfully updated to the latest recommended settings."),E.info("You can optionally run tests with the `--regenerate-cache` flag to entirely rebuild caches with the newer configuration. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.")});async function Kq(){BM("Main program started");try{await Ft.parseAsync(process.argv),await Zn()}catch(r){let e={};try{e.playwrightVersion=zq("npx playwright --version").toString()}catch(t){q.error({err:t},"Error fetching debug information")}q.error({err:r,debugInfo:e},"Uncaught error in CLI"),gs(r,e),E.error(r),await Zn(),process.exit(1)}}Gq.setMaxListeners(25);process.on("warning",r=>{q.warn({err:r},`Node warning received on CLI: ${r.message}`)});BM("CLI parsing setup complete");Kq();
4523
4523
  //# sourceMappingURL=cli.js.map
4524
- //# debugId=11db9ef1-9fc2-5cd6-82ff-b2ee03dff57f
4524
+ //# debugId=e732574d-51d9-56eb-9632-29b1b7fa366b