momentic 2.3.1 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
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]="
|
|
4
|
-
var ST=Object.create;var Tu=Object.defineProperty;var yT=Object.getOwnPropertyDescriptor;var bT=Object.getOwnPropertyNames;var wT=Object.getPrototypeOf,vT=Object.prototype.hasOwnProperty;var xu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var TT=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of bT(e))!vT.call(n,o)&&o!==t&&Tu(n,o,{get:()=>e[o],enumerable:!(r=yT(e,o))||r.enumerable});return n};var xT=(n,e,t)=>(t=n!=null?ST(wT(n)):{},TT(e||!n||!n.__esModule?Tu(t,"default",{value:n,enumerable:!0}):t,n));var Nf=xu((TK,Mf)=>{"use strict";Mf.exports=Lf;function Lf(n,e,t){n instanceof RegExp&&(n=Pf(n,t)),e instanceof RegExp&&(e=Pf(e,t));var r=Of(n,e,t);return r&&{start:r[0],end:r[1],pre:t.slice(0,r[0]),body:t.slice(r[0]+n.length,r[1]),post:t.slice(r[1]+e.length)}}function Pf(n,e){var t=e.match(n);return t?t[0]:null}Lf.range=Of;function Of(n,e,t){var r,o,i,a,s,l=t.indexOf(n),c=t.indexOf(e,l+1),d=l;if(l>=0&&c>0){if(n===e)return[l,c];for(r=[],i=t.length;d>=0&&!s;)d==l?(r.push(d),l=t.indexOf(n,d+1)):r.length==1?s=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,a=c),c=t.indexOf(e,d+1)),d=l<c&&l>=0?l:c;r.length&&(s=[i,a])}return s}});var Hf=xu((xK,zf)=>{"use strict";var kf=Nf();zf.exports=gA;var _f="\0SLASH"+Math.random()+"\0",Df="\0OPEN"+Math.random()+"\0",fd="\0CLOSE"+Math.random()+"\0",Ff="\0COMMA"+Math.random()+"\0",Uf="\0PERIOD"+Math.random()+"\0";function gd(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function mA(n){return n.split("\\\\").join(_f).split("\\{").join(Df).split("\\}").join(fd).split("\\,").join(Ff).split("\\.").join(Uf)}function hA(n){return n.split(_f).join("\\").split(Df).join("{").split(fd).join("}").split(Ff).join(",").split(Uf).join(".")}function Bf(n){if(!n)return[""];var e=[],t=kf("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,a=r.split(",");a[a.length-1]+="{"+o+"}";var s=Bf(i);return i.length&&(a[a.length-1]+=s.shift(),a.push.apply(a,s)),e.push.apply(e,a),e}function gA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),sa(mA(n),!0).map(hA)):[]}function fA(n){return"{"+n+"}"}function SA(n){return/^-?0\d/.test(n)}function yA(n,e){return n<=e}function bA(n,e){return n>=e}function sa(n,e){var t=[],r=kf("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?sa(r.post,!1):[""];if(/\$$/.test(r.pre))for(var a=0;a<i.length;a++){var s=o+"{"+r.body+"}"+i[a];t.push(s)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(r.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(r.body),d=l||c,p=r.body.indexOf(",")>=0;if(!d&&!p)return r.post.match(/,.*\}/)?(n=r.pre+"{"+r.body+fd+r.post,sa(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=Bf(r.body),u.length===1&&(u=sa(u[0],!1).map(fA),u.length===1))return i.map(function(H){return r.pre+u[0]+H});var m;if(d){var h=gd(u[0]),g=gd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(gd(u[2])):1,w=yA,v=g<h;v&&(S*=-1,w=bA);var b=u.some(SA);m=[];for(var x=h;w(x,g);x+=S){var C;if(c)C=String.fromCharCode(x),C==="\\"&&(C="");else if(C=String(x),b){var A=f-C.length;if(A>0){var N=new Array(A+1).join("0");x<0?C="-"+N+C.slice(1):C=N+C}}m.push(C)}}else{m=[];for(var P=0;P<u.length;P++)m.push.apply(m,sa(u[P],!1))}for(var P=0;P<m.length;P++)for(var a=0;a<i.length;a++){var s=o+m[P]+i[a];(!e||d||s)&&t.push(s)}}return t}});var Ri=(n,e)=>{},tc=!1;try{let n=await import("@sentry/node");Ri=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),tc=!0}catch{}import{Command as Ok,Option as on}from"@commander-js/extra-typings";import{execSync as Mk}from"child_process";import $w from"body-parser";import hN from"cors";import gN from"dedent";import fN from"events";import jw,{Router as SN}from"express";import{diff as dA}from"deep-object-diff";import pn from"fs";import Kr from"path";import{diff as DR}from"deep-object-diff";import{z as Eu}from"zod";var jk=Eu.object({input:Eu.string()});import{z as Ve}from"zod";var Vk=Ve.object({srcs:Ve.array(Ve.string()),urls:Ve.array(Ve.string()),desiredSrc:Ve.string().optional(),desiredUrl:Ve.string().optional()}),Cu=Ve.object({srcRegex:Ve.string().optional(),urlRegex:Ve.string().optional()}),Ru=Ve.object({x:Ve.number(),y:Ve.number(),correlation:Ve.number()}),qk=Ve.object({searchImageBase64String:Ve.string(),pageImageBase64String:Ve.string(),id:Ve.string().uuid(),timeoutMs:Ve.number().max(1e4).min(0).optional()});import{z as M}from"zod";import{v4 as Se}from"uuid";import*as T from"zod";function Te(n){if(typeof n.ZodType.prototype.openapi<"u")return;n.ZodType.prototype.openapi=function(o){return new this.constructor({...this._def,openapi:o})};let e=n.ZodObject.prototype.extend;n.ZodObject.prototype.extend=function(...o){let i=e.apply(this,o);return i._def.extendMetadata={extends:this},delete i._def.openapi,i};let t=n.ZodObject.prototype.omit;n.ZodObject.prototype.omit=function(...o){let i=t.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i};let r=n.ZodObject.prototype.pick;n.ZodObject.prototype.pick=function(...o){let i=r.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i}}import{z as ge}from"zod";Te(ge);var Au=ge.object({plan:ge.string().optional(),evidence:ge.string().optional(),thoughts:ge.string(),result:ge.boolean(),relevantElements:ge.array(ge.number()).optional()}),go=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(go||{});var ET=ge.object({type:ge.literal("ELEMENT_CONTENT"),negated:ge.boolean().optional(),operation:ge.nativeEnum(go),value:ge.string()}).openapi({ref:"ElementContentAssertion"}),CT=ge.object({type:ge.literal("ELEMENT_ATTRIBUTE"),negated:ge.boolean().optional(),operation:ge.nativeEnum(go),attr:ge.string(),value:ge.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Ai=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(Ai||{}),RT=ge.object({type:ge.literal("ELEMENT_EXISTENCE"),negated:ge.boolean().optional(),condition:ge.nativeEnum(Ai).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Iu=ge.discriminatedUnion("type",[ET,CT,RT]).openapi({ref:"ManualElementAssertion"});var AT=ge.object({type:ge.literal("CONTENT"),negated:ge.boolean().optional(),value:ge.string()}).openapi({ref:"PageContentAssertion"}),Pu=ge.discriminatedUnion("type",[AT]).openapi({ref:"ManualPageAssertion"});import*as D from"zod";Te(D);var er=(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))(er||{}),IT=D.object({mPathSelectorTokens:D.string().array(),frameSrcRegex:D.string().optional(),frameUrlRegex:D.string().optional(),indices:D.number().array()}),Er=D.object({id:D.number().int(),dataMomenticId:D.number().int().optional(),selector:D.string().optional(),hybridSelector:D.object({textContent:D.string().or(D.null()),attributes:D.record(D.string(),D.string()),tagName:D.string(),expandShadowRoot:D.boolean(),classNames:D.string().array(),nthChild:D.number()}).array().optional(),generatedSelectors:D.string().array().optional(),role:D.string().optional(),name:D.string().optional(),numChildren:D.number().optional(),content:D.string().optional(),pathFromRoot:D.string().optional(),serializedForm:D.string().optional(),nodeOnlySerializedForm: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:IT.optional(),inputDescription:D.string().optional().describe("the description that generated this cache"),targetSource:D.nativeEnum(er).optional(),targetUpdateTime:D.string().optional(),targetUpdateLoggerTags:D.record(D.string(),D.string()).optional()}).openapi({ref:"A11yTargetWithCache"});function Lu(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var PT=D.object({type:D.literal("description"),elementDescriptor:D.string(),a11yData:Er.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),LT=D.object({x:D.number(),y:D.number()}),OT=D.object({type:D.literal("coordinates"),pixels:LT}).openapi({ref:"CoordinatesTarget"});function tr(n){return n.type==="description"}function wn(n){return n.type==="coordinates"}var ct=D.discriminatedUnion("type",[PT,OT]).openapi({ref:"ElementTarget"});function nc(n){if(!n)return!1;switch(n.type){case"description":return!!n.elementDescriptor}return!0}function dt(n){if(!n)return"";switch(n.type){case"description":return n.elementDescriptor;case"coordinates":return`x: ${n.pixels.x}, y: ${n.pixels.y}`}}import{z as ae}from"zod";var Da=ae.object({url:ae.string(),method:ae.union([ae.literal("GET"),ae.literal("POST"),ae.literal("PUT"),ae.literal("DELETE"),ae.literal("PATCH")]),headers:ae.record(ae.string(),ae.string()).optional(),params:ae.record(ae.string(),ae.string()).optional(),body:ae.string().optional(),timeout:ae.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ou=ae.object({url:ae.string(),headers:ae.record(ae.string(),ae.string()).optional(),query:ae.string(),variables:ae.record(ae.string(),ae.string()).optional(),timeout:ae.number().int().optional().describe("Max seconds to wait for the request to complete")}),Fa=ae.object({code:ae.string(),fragment:ae.boolean().optional(),environment:ae.union([ae.literal("NODE"),ae.literal("BROWSER")]).optional().describe("default NODE"),timeout:ae.number().int().max(60).optional().describe("Max seconds for the code to complete")});var De=(j=>(j.AI_EXTRACT="AI_EXTRACT",j.AI_ASSERTION="AI_ASSERTION",j.AUTH_LOAD="AUTH_LOAD",j.AUTH_SAVE="AUTH_SAVE",j.BLUR="BLUR",j.CAPTCHA="CAPTCHA",j.CLICK="CLICK",j.COOKIE="COOKIE",j.COPY="COPY",j.DIALOG="DIALOG",j.DRAG="DRAG",j.ELEMENT_CHECK="ELEMENT_CHECK",j.FILE_UPLOAD="FILE_UPLOAD",j.FOCUS="FOCUS",j.GO_BACK="GO_BACK",j.GO_FORWARD="GO_FORWARD",j.HOVER="HOVER",j.JAVASCRIPT="JAVASCRIPT",j.LOCAL_STORAGE="LOCAL_STORAGE",j.MOUSE_DRAG="MOUSE_DRAG",j.NAVIGATE="NAVIGATE",j.NEW_TAB="NEW_TAB",j.PAGE_CHECK="PAGE_CHECK",j.PASTE="PASTE",j.PRESS="PRESS",j.REFRESH="REFRESH",j.REQUEST="REQUEST",j.GRAPHQL_REQUEST="GRAPHQL_REQUEST",j.SCROLL_DOWN="SCROLL_DOWN",j.SCROLL_UP="SCROLL_UP",j.SCROLL_LEFT="SCROLL_LEFT",j.SCROLL_RIGHT="SCROLL_RIGHT",j.SELECT_OPTION="SELECT_OPTION",j.SWITCH_TAB="TAB",j.TYPE="TYPE",j.VISUAL_DIFF="VISUAL_DIFF",j.WAIT="WAIT",j.WAIT_FOR_URL="WAIT_FOR_URL",j.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",j.AWAIT_LISTENER="AWAIT_LISTENER",j.RECORD_REQUESTS="RECORD_REQUESTS",j.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",j.SET_HEADER="SET_HEADER",j.SUCCESS="SUCCESS",j))(De||{});Te(T);var Y=T.object({thoughts:T.string().optional(),id:T.string().uuid().describe("unique identifier to this step, used for step cache")}),Ht=T.object({useSelector:T.boolean().optional(),force:T.boolean().optional(),disableCache:T.boolean().optional().describe("disable element caching for this step"),iframeUrl:T.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),vn=T.object({target:Er}).optional().openapi({ref:"SingleTargetCache"}),Ua=T.object({loadTimeout:T.number().int().max(60).optional().describe("Max seconds for the page to load")}),MT=Y.merge(Ua).merge(T.object({type:T.literal("NAVIGATE"),url:T.string()})).openapi({ref:"NavigateCommand"}),Ba=Ht.merge(T.object({cache:vn})),fo=Y.merge(Ba.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_UP"),deltaY:T.number().optional()}))).openapi({ref:"ScrollUpCommand"}),So=Y.merge(Ba.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_DOWN"),deltaY:T.number().optional()}))).openapi({ref:"ScrollDownCommand"}),yo=Y.merge(Ba.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_LEFT"),deltaX:T.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),bo=Y.merge(Ba.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_RIGHT"),deltaX:T.number().optional()}))).openapi({ref:"ScrollRightCommand"}),d_=T.discriminatedUnion("type",[fo,So,yo,bo]).openapi({ref:"AllScrollCommands"}),NT=Y.merge(T.object({type:T.literal("DIALOG"),action:T.union([T.literal("ACCEPT"),T.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),kT=Y.merge(T.object({type:T.literal("WAIT"),delay:T.number()})).openapi({ref:"WaitCommand"}),_T=T.discriminatedUnion("type",[T.object({type:T.literal("SUBSTRING"),url:T.string()}),T.object({type:T.literal("GLOB"),glob:T.string()}),T.object({type:T.literal("REGEX"),regex:T.string()})]),DT=T.object({caseInsensitive:T.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:T.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:T.number().int().optional().describe("Max seconds to wait for the URL to match")}),FT=Y.extend({type:T.literal("WAIT_FOR_URL"),matcher:_T}).merge(DT).openapi({ref:"WaitUrlCommand"}),UT=Y.merge(Ua).merge(T.object({type:T.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),BT=Y.merge(T.object({type:T.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),zT=Y.merge(T.object({type:T.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),HT=Y.extend({type:T.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),$T=Y.extend({type:T.literal("AUTH_LOAD"),storageState:T.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),oc=Y.merge(Ht).extend({type:T.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),jT=Y.extend({type:T.literal("COPY"),value:T.string()}).openapi({ref:"CopyCommand"}),GT=Y.extend({type:T.literal("PASTE")}).openapi({ref:"PasteCommand"}),WT=Y.merge(Fa).extend({type:T.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Pi=Y.merge(Ht).merge(T.object({type:T.literal("CLICK"),target:ct,doubleClick:T.boolean().optional(),rightClick:T.boolean().optional(),waitForDownload:T.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:T.number().optional(),downloadTimeoutMs:T.number().optional(),cache:vn,relativePosition:T.object({x:T.number(),y:T.number()}).optional()})).openapi({ref:"ClickCommand"}),Li=Y.merge(Ht).merge(T.object({type:T.literal("DRAG"),fromTarget:ct,toTarget:ct,steps:T.number().optional(),hoverSeconds:T.number().optional().describe("Seconds to hover the object before dropping"),cache:T.object({fromTarget:Er.optional(),toTarget:Er.optional()}).optional()})).openapi({ref:"DragCommand"}),Oi=Y.merge(Ht).merge(T.object({type:T.literal("MOUSE_DRAG"),target:ct.optional(),deltaX:T.string().describe("pixels to move horizontally, can be template"),deltaY:T.string().describe("pixels to move vertically, can be template"),steps:T.number().optional(),cache:vn})).openapi({ref:"MouseDragCommand"}),Mi=Y.merge(Ht).merge(T.object({type:T.literal("HOVER"),target:ct,cache:vn})).openapi({ref:"HoverCommand"}),Ni=Y.merge(Ht).merge(T.object({type:T.literal("FOCUS"),target:ct,cache:vn})).openapi({ref:"FocusCommand"}),ki=Y.merge(Ht).extend({type:T.literal("BLUR"),target:ct.optional(),cache:vn}).openapi({ref:"BlurCommand"}),VT=T.object({type:T.literal("URL"),url:T.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),qT=T.object({type:T.literal("USER_FILE"),name:T.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),KT=Y.extend({type:T.literal("FILE_UPLOAD"),fileSource:T.discriminatedUnion("type",[VT,qT]),filename:T.string().optional()}).openapi({ref:"FileUploadCommand"}),YT=T.discriminatedUnion("type",[T.object({type:T.literal("VALUE"),value:T.string()}),T.object({type:T.literal("LABEL"),label:T.string()}),T.object({type:T.literal("INDEX"),index:T.coerce.string()})]),_i=Y.merge(Ht).extend({type:T.literal("SELECT_OPTION"),target:ct,cache:vn,choice:YT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),ic=T.union([T.literal("MULTIMODAL"),T.literal("VISION_ONLY")]),Mu=Y.merge(T.object({type:T.literal("AI_ASSERTION"),assertion:T.string(),disableCache:T.boolean().optional(),iframeUrl:T.string().optional(),contextChoice:ic.optional(),timeout:T.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),Tn=5,ac=600,Di=Y.merge(Ht).extend({type:T.literal("ELEMENT_CHECK"),target:ct,assertion:Iu,cache:vn,timeout:T.number().int().min(0).max(ac).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),JT=Y.extend({type:T.literal("PAGE_CHECK"),assertion:Pu,iframeUrl:T.string().optional().describe("url or url regex for the iframe"),timeout:T.number().int().min(0).max(ac).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),XT=Y.merge(T.object({type:T.literal("AI_EXTRACT"),goal:T.string(),schema:T.string().optional(),envKey:T.string().optional(),disableCache:T.boolean().optional(),iframeUrl:T.string().optional()})).openapi({ref:"AIExtractCommand"}),ZT=T.object({clearContent:T.boolean().optional(),forceClearContent:T.boolean().optional(),delay:T.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:T.boolean().optional(),pressEnter:T.boolean().optional()}),Nu=25,Fi=Y.merge(Ht).merge(ZT).extend({type:T.literal("TYPE"),target:ct.optional(),value:T.string(),cache:vn}).openapi({ref:"TypeCommand"}),QT=Y.merge(T.object({type:T.literal("PRESS"),value:T.string(),repeat:T.number().optional(),convertMeta:T.boolean().optional(),delayMs:T.number().optional()})).openapi({ref:"PressCommand"}),ex=T.object({type:T.literal("SUBSTRING"),substring:T.string()}),tx=T.object({type:T.literal("REGEX"),pattern:T.string()}),nx=T.object({type:T.literal("INDEX"),index:T.coerce.string()}),rx=T.discriminatedUnion("type",[ex,tx,nx]),ox=Y.merge(Ua).merge(T.object({type:T.literal("TAB"),action:rx})).openapi({ref:"TabCommand"}),ix=Y.merge(Ua).merge(T.object({type:T.literal("NEW_TAB"),url:T.string()})).openapi({ref:"NewTabCommand"}),ax=Y.merge(T.object({type:T.literal("COOKIE"),value:T.string()})).openapi({ref:"CookieCommand"}),sx=Y.merge(T.object({type:T.literal("LOCAL_STORAGE"),key:T.string(),value:T.string()})).openapi({ref:"LocalStorageCommand"}),lx=Y.extend({type:T.literal("REQUEST")}).merge(Da).openapi({ref:"RequestCommand"}),cx=Y.extend({type:T.literal("GRAPHQL_REQUEST")}).merge(Ou).openapi({ref:"GraphQLRequestCommand"}),dx=Y.merge(T.object({type:T.literal("SUCCESS"),condition:Mu.optional()})).openapi({ref:"SuccessCommand"}),px=Y.merge(T.object({type:T.literal("FAILURE")})).openapi({ref:"FailureCommand"}),ux=T.object({data:T.string().describe("location at which to find a jpg"),width:T.number(),height:T.number()}),Ui=Y.merge(Ht).merge(T.object({type:T.literal("VISUAL_DIFF"),threshold:T.number().optional().describe("default 0.1"),target:ct.optional(),screenshot:ux.optional(),cache:vn})).openapi({ref:"VisualDiffCommand"}),mx=Y.merge(T.object({type:T.literal("REGISTER_REQUEST_LISTENER"),pattern:T.string(),key:T.string()})).openapi({ref:"RegisterRequestListenerCommand"}),hx=Y.merge(T.object({type:T.literal("AWAIT_LISTENER"),key:T.string(),timeout:T.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),gx=Y.merge(T.object({type:T.literal("RECORD_REQUESTS"),pattern:T.string(),key:T.string()})).openapi({ref:"RecordRequestsCommand"}),fx=Y.merge(T.object({type:T.literal("GET_RECORDED_REQUESTS"),key:T.string()})).openapi({ref:"GetRecordedRequestsCommand"}),Sx=Y.merge(T.object({type:T.literal("SET_HEADER"),name:T.string(),value:T.string(),urlPattern:T.string().optional().describe("URL pattern to match")})).openapi({ref:"SetHeaderCommand"}),ku=T.discriminatedUnion("type",[Pi,Fi,QT,_i,MT,So,fo,Mu,Mi,kT,dx]),yx=T.discriminatedUnion("type",[XT,$T,HT,oc,ax,jT,NT,Li,Di,KT,BT,zT,WT,sx,Oi,ix,JT,GT,UT,lx,cx,yo,bo,ox,Ui,Ni,ki,FT,mx,hx,gx,fx,Sx]),wo=T.discriminatedUnion("type",[...ku.options,...yx.options]).openapi({ref:"Command"}),za=T.discriminatedUnion("type",[...ku.options,px]);function Un(n){let e;switch(n){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:Se(),type:n};break;case"AUTH_LOAD":{e={id:Se(),type:n,storageState:""};break}case"AI_EXTRACT":e={id:Se(),type:n,goal:""};break;case"DIALOG":e={id:Se(),type:n,action:"DISMISS"};break;case"DRAG":e={id:Se(),type:n,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Se(),type:n,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Se(),type:n,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Se(),type:n,delay:1};break;case"BLUR":e={id:Se(),type:n};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Se(),type:n,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Se(),type:n,value:"",clearContent:!0};break;case"SELECT_OPTION":e={id:Se(),type:n,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Se(),type:n,url:""};case"TAB":e={id:Se(),type:n,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Se(),type:n,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Se(),type:n,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Se(),type:n,key:"",value:""};break;case"JAVASCRIPT":e={id:Se(),type:n,code:""};break;case"AI_ASSERTION":e={id:Se(),type:n,assertion:""};break;case"FILE_UPLOAD":{e={id:Se(),type:n,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Se(),type:n,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Se(),type:n,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Se(),type:n,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:Se(),type:n,key:""};break}case"RECORD_REQUESTS":{e={id:Se(),type:n,pattern:"",key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Se(),type:n,key:""};break}case"SET_HEADER":{e={id:Se(),type:n,name:"",value:""};break}default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return e}function _u(n){switch(n.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":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":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}import{z as bx}from"zod";var g_=bx.discriminatedUnion("type",[ki,oc,Pi,Li,Ni,Mi,Oi,fo,So,yo,bo,_i,Fi,Ui,Di]);function Du(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as wx}from"zod";var Tt={type:!0,cache:!0},Cr=wx.discriminatedUnion("type",[ki.pick(Tt),Pi.pick(Tt),Li.pick(Tt),Di.pick(Tt),Ni.pick(Tt),Mi.pick(Tt),Oi.pick(Tt),fo.pick(Tt),So.pick(Tt),yo.pick(Tt),bo.pick(Tt),_i.pick(Tt),Fi.pick(Tt),Ui.pick(Tt)]),sc=Object.values(De).filter(n=>Cr.options.some(e=>e.shape.type.safeParse(n).success));wo.options.forEach(n=>{if("target"in n.shape&&!sc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as cc}from"zod";import{z as lc}from"zod";import{z as vo}from"zod";var xt=vo.object({index:vo.number().optional().describe("global index within a test (in-order traversal)"),id:vo.string(),skipped:vo.boolean().optional(),envKey:vo.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:vo.boolean().optional()});Te(lc);var Et=xt.extend({type:lc.literal("PRESET_ACTION"),command:wo,skipped:lc.boolean().optional()}).openapi({ref:"PresetAction"});Te(cc);var Rr=xt.extend({type:cc.literal("AI_ACTION"),text:cc.string(),steps:Et.array().optional()}).openapi({ref:"AIAction"});import{z as le}from"zod";var vx=le.object({cacheKey:le.string(),cacheExpiryMs:le.number()}),dc=xt.extend({id:le.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:le.record(le.string()).optional(),cacheConfig:vx.optional()}),Bn=dc.extend({type:le.literal("MODULE"),moduleId:le.string().uuid()}),Tx=le.union([Bn.pick({type:!0,moduleId:!0}),le.record(le.unknown())]),xx=le.object({type:le.literal("URL_REGEX"),regex:le.string()}),Ex=le.object({type:le.literal("PAGE_CHECK"),substring:le.string()}),pc=le.object({cacheInvalidation:le.discriminatedUnion("type",[Ex,xx]).optional()}),Ct=le.object({moduleId:le.string().uuid(),name:le.string(),description:le.string().nullish(),enabled:le.boolean().nullish(),parameters:le.string().array().nullish(),defaultParameters:le.record(le.string(),le.string()).nullish(),defaultCacheKey:le.string().nullish(),defaultCacheTtl:le.number().nullish(),defaultCacheAllInvocations:le.boolean().nullish(),autoAuth:le.boolean().nullish(),advanced:pc.nullish()});import{z as ot}from"zod";import{z as uc}from"zod";Te(uc);var To=xt.extend({type:uc.literal("AI_ACTION_DYNAMIC"),text:uc.string()}).openapi({ref:"AIActionDynamic"});import{z as Fu}from"zod";var mc=xt.extend({type:Fu.literal("CONDITIONAL"),skipped:Fu.boolean().optional()});import{z as Ha}from"zod";var Cx=Ha.object({type:Ha.literal("url"),url:Ha.string()}),Bi=xt.extend({type:Ha.literal("IFRAME"),identifier:Cx});import{z as $t}from"zod";var hc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(hc||{});var Rx=$t.discriminatedUnion("type",[$t.object({type:$t.literal("NAVIGATE_URL"),url:$t.string().url()}),$t.object({type:$t.literal("GO_TO_SECTION_START")})]),Ax=$t.object({trigger:$t.nativeEnum(hc).optional(),attempts:$t.number().int().optional(),restartBehavior:Rx}),zi=xt.extend({type:$t.literal("SECTION"),description:$t.string().describe("user provided goal of what the section should accomplish"),plan:$t.string().array().optional(),autohealingConfig:Ax.optional()});var Uu=Ct.merge(dc).extend({type:ot.literal("RESOLVED_MODULE"),steps:ot.lazy(()=>Ae.array())}),gc=Ct.extend({steps:ot.lazy(()=>Ae.array())}),fc=Bi.extend({steps:ot.lazy(()=>ye.array())}),Ix=Bi.extend({steps:ot.lazy(()=>Ae.array())}),Sc=zi.extend({steps:ot.lazy(()=>ye.array())}),Px=zi.extend({steps:ot.lazy(()=>Ae.array())}),Ar=mc.extend({blocks:ot.object({assertion:ot.lazy(()=>Et),steps:ot.lazy(()=>ye.array())}).array(),elseSteps:ot.lazy(()=>ye.array().optional())}),Lx=mc.extend({blocks:ot.object({assertion:ot.lazy(()=>Et),steps:ot.lazy(()=>Ae.array())}).array(),elseSteps:ot.lazy(()=>Ae.array().optional())}),ye=ot.discriminatedUnion("type",[Et,Rr,To,Bn,Ar,fc,Sc]),Ae=ot.discriminatedUnion("type",[Et,Rr,To,Uu,Lx,Ix,Px]);import{z as jt}from"zod";var Ox=jt.object({steps:ye.array(),beforeSteps:ye.array().nullish(),afterSteps:ye.array().nullish()}),xo=jt.object({steps:Ae.array(),beforeSteps:Ae.array().nullish(),afterSteps:Ae.array().nullish()}),Ir=jt.object({steps:jt.record(jt.string(),jt.unknown()).array(),beforeSteps:jt.record(jt.string(),jt.unknown()).array().nullish(),afterSteps:jt.record(jt.string(),jt.unknown()).array().nullish()});var _e="1.0.20";import{z as nr}from"zod";var yc=nr.object({key:nr.string(),testId:nr.string().optional(),moduleId:nr.string().optional(),organizationId:nr.string(),value:Cr}),Mx=yc.extend({uniqueKey:nr.string()}),Bu=nr.record(nr.string(),Mx);var zu=M.object({phrase:M.string()}),bc=M.object({thoughts:M.string().optional(),result:M.union([M.literal("NOT_FOUND"),M.string(),M.number(),M.array(M.unknown()),M.record(M.unknown(),M.unknown()),M.unknown()])}),hF=M.object({text:M.string()}),Hu=M.object({thoughts:M.string(),review:M.string().optional(),id:M.number().int()}),$a=(u=>(u.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",u.FEW_WORDS="FEW_WORDS",u.STYLE_TAG="STYLE_TAG",u.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",u.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",u.NONE="NONE",u.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",u.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",u.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",u.PREFER_ASSERTION="PREFER_ASSERTION",u.HTML_ELEMENTS="HTML_ELEMENTS",u.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",u))($a||{});var $u=M.object({thoughts:M.string(),category:M.nativeEnum($a)}),Nx=M.discriminatedUnion("op",[M.object({op:M.literal("replace"),path:M.string(),value:M.string()}),M.object({op:M.literal("add"),path:M.string(),value:M.string()}),M.object({op:M.literal("remove"),path:M.string()})]),gF=M.object({thoughts:M.string(),patches:Nx.array()}),ju=[M.literal("add"),M.literal("replace"),M.literal("remove")],kx=M.object({op:M.union(ju),path:M.string(),value:Ae.optional()}),Gu=M.object({patches:kx.array(),thoughts:M.string()});var _x=M.object({thoughts:M.string(),op:M.union(ju),value:M.union([M.null(),Ae])}),Wu=M.object({reasoning:M.string(),scenario:M.string(),patch:_x.or(M.null())}),fF=M.object({thoughts:M.string(),evaluation:M.number().min(1).max(10)}),SF=M.object({observations:M.string(),reasoning:M.string(),command:za});var wc=M.object({summary:M.string(),reasoning:M.string(),evaluation:M.discriminatedUnion("type",[M.object({type:M.literal("DONE")}),M.object({type:M.literal("RIGHT_TRACK")}),M.object({type:M.literal("WRONG_TRACK"),feedback:M.string()}),M.object({type:M.literal("IMPOSSIBLE")})])});import{z as k}from"zod";import*as ee from"zod";var xF=ee.object({thoughts:ee.string().optional().describe("only provided if a description was provided"),target:Er.optional().describe("only provided if a description was provided"),pageState:ee.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ee.object({label:ee.string(),value:ee.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ee.object({data:ee.string(),height:ee.number().int(),width:ee.number().int()}).optional().describe("only provided if returnScreenshot is true")}),Vu=ee.union([ee.literal("ELEMENT_CHECK"),ee.literal("NEGATED_CHECK"),ee.literal("SELECT_OPTION"),ee.literal("TYPE")]);function Pr(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.negated)return"NEGATED_CHECK";if(n.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Hi=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Hi||{}),Eo=ee.object({matched:ee.boolean(),reason:ee.string().optional().describe("Human understandable description"),logs:ee.string().array().optional().describe("Logs for debugging")}),Dx=Eo.extend({type:ee.literal("USER_SELECTOR")}),Fx=Eo.extend({type:ee.literal("CSS_SELECTOR"),selectors:ee.string().array()}),Ux=Eo.extend({type:ee.literal("HYBRID_SELECTOR")}),Bx=Eo.extend({type:ee.literal("HTML_DISTANCE"),distance:ee.number().optional(),closestElement:ee.string().optional(),savedElement:ee.string().optional()}),zx=Eo.extend({type:ee.literal("TEMPLATE_MATCHING"),elementImageUrl:ee.string().url()}),Hx=Eo.extend({type:ee.literal("AUTO_FRAME"),logs:ee.string().array().optional()}),qu=ee.discriminatedUnion("type",[Dx,Fx,Ux,Bx,zx,Hx]);import{z as Vi}from"zod";import{z as cC}from"zod";import*as X from"zod";import{cloneDeep as ji}from"lodash-es";var $x=n=>{let e=Ku(n,0);if(e===void 0||!Gx(n[e]))return;let t=Ku(n,e+1);if(t!==void 0)return Wx(n,e,t)},Yu=$x,Ku=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!jx(r))return t}},jx=n=>n===" "||n===" "||n===`
|
|
5
|
-
`||n==="\r",
|
|
6
|
-
`)return
|
|
7
|
-
${e.message}`)}},QE=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?Ju(e,t):hm(e,t);import*as Or from"zod";import{z as ln}from"zod";import{z as St}from"zod";var Oc=St.object({autoFollowNewTabs:St.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:St.boolean().optional(),ignoreHrefForCaching:St.boolean().optional(),hybridSelectorMode:St.enum(["test","prefer"]).optional()});var Am=1e4,Im=6e4,Lr=Oc.extend({pageLoadTimeoutMs:St.number().optional().refine(n=>n===void 0||n<=Im&&n>=-1,{message:`Page load timeout must be between 0 and ${Im/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:St.number().optional().refine(n=>n===void 0||n<=Am&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${Am/1e3} seconds`}),localChromeExtensionPaths:St.string().array().optional(),extraHeaders:St.record(St.string(),St.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:St.string().optional(),disableGpu:St.boolean().optional(),bustCacheOnBoundingBoxChange:St.boolean().optional().describe("Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:St.boolean().optional().describe("Allow fetching the partial accessibility tree if the full tree takes too long.")});var Ge="BASE_URL",Za="CURRENT_URL",Ro="ENV_NAME",k0={[Ge]:"https://www.google.com"},Pm=ln.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),Lm=ln.object({name:ln.string(),variables:ln.record(ln.string().describe("variable name"),ln.string().describe("variable value"))}),Om=ln.object({name:ln.string(),variables:ln.record(ln.string().describe("variable name"),ln.unknown().describe("variable value")),browser:Lr.optional()});Te(Or);var Gi=Or.object({env:Or.record(Or.unknown())}).openapi({ref:"TestContextSnapshot"}),eC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",tC=[Ge,Ro],Mm=[Za,Ge,Ro],Rt=class n{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t={}){return new n({baseUrl:"about:blank",currentUrl:"about:blank",envName:e,variablesFromEnvironment:t})}static fromSnapshot({snapshot:e,environmentVariables:t}){let r=e.env[Ge]??"about:blank",o=e.env[Za]??"about:blank",i=e.env[Ro],a={};for(let[l,c]of Object.entries(e.env))Mm.includes(l)||(t??{})[l]===void 0&&(a[l]=c);return new n({baseUrl:r,currentUrl:o,dynamicVariables:a,envName:i,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=ji(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){tC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Ro]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return ji(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>Mm.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,eC]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Co(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Co(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Za]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=ji(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ge,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Ro,e.envName)}getDynamicVariablesCopy(){return ji(this.env)}getVariablesFromEnvironmentCopy(){return ji(this.varsFromMomenticEnvironment)}};import{z as Mr}from"zod";Te(Mr);var ce=(c=>(c.AI_PROVIDER="AIProviderError",c.USER_INFRA="UserInfrastructureError",c.ACTION_FAILURE="ActionFailureError",c.ASSERTION_FAILURE="AssertionFailureError",c.CONFIG_ERROR="UserConfigurationError",c.WEB_AGENT_PLATFORM="InternalWebAgentError",c.UNKNOWN_PLATFORM="InternalPlatformError",c.JOB_TIMEOUT="JobTimeoutError",c.UNKNOWN="UnknownError",c))(ce||{});var Nm=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],Qa={ActionFailureError:"Action failure",AssertionFailureError:"Assertion failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error"},Ao={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",AssertionFailureError:"An AI check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},Mc=Mr.object({reason:Mr.nativeEnum(ce),summary:Mr.string()}).openapi({ref:"TestResultClassification"}),es=Mr.object({errorMessage:Mr.string(),errorStack:Mr.string().optional(),classification:Mc.optional()}).openapi({ref:"TestFailureDetails"});Te(X);var xe=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(xe||{}),Nc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(Nc||{}),kc=X.object({beforeUrl:X.string().optional(),afterUrl:X.string().optional(),message:X.string().optional(),beforeScreenshot:X.string().optional(),afterScreenshot:X.string().optional(),beforeSnapshot:X.string().optional(),afterSnapshot:X.string().optional(),startedAt:X.coerce.date(),finishedAt:X.coerce.date()}),nC=kc.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(Nc),message:X.string().optional(),elementInteracted:X.string().optional()}),rr=kc.extend({status:X.nativeEnum(xe),message:X.string().optional(),data:X.unknown().optional(),beforeTestContext:Gi.optional(),afterTestContext:Gi.optional(),failureReason:X.nativeEnum(ce).optional(),details:X.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),ts=rr.merge(Et).extend({results:nC.array(),proposedStep:Et.optional()}),rC=rr.merge(Rr).extend({results:X.lazy(()=>ts.array())}),oC=rr.merge(To).extend({results:X.lazy(()=>ts.array())}),iC=rr.merge(Bn).extend({moduleName:X.string().optional(),results:X.lazy(()=>At.array())}),aC=rr.merge(Ar).extend({assertion:ts.optional(),results:X.lazy(()=>At.array()).describe("results for the block actually executed")}),sC=rr.merge(Bi).extend({results:X.lazy(()=>At.array())}),lC=rr.merge(zi).extend({results:X.lazy(()=>At.array()),healingAttempts:X.lazy(()=>At.array().array()).optional()}),At=X.discriminatedUnion("type",[rC,oC,ts,iC,aC,sC,lC]),ns=rr.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),rs=kc.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var _c=cC.object({results:At.array().describe("main results"),beforeResults:At.array().optional(),afterResults:At.array().optional()}),os=_c.partial();import{z as G}from"zod";import{z as Ee}from"zod";var dC=Ee.object({type:Ee.literal("FAILURE_RECOVERY"),thoughts:Ee.string()}),pC=Ee.object({type:Ee.literal("DESCRIPTION_UPDATE"),thoughts:Ee.string()}),is=Ee.discriminatedUnion("type",[pC,dC]),as=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(as||{}),uC=Ee.object({testId:Ee.string(),name:Ee.string(),orgId:Ee.string(),runId:Ee.string(),purpose:Ee.nativeEnum(as).catch("AUTO_HEALING"),steps:Ae.array(),details:is.or(is.array()).optional()}),aU=uC.pick({name:!0,orgId:!0}),Dc=Ee.object({id:Ee.string(),name:Ee.string().nullish(),createdAt:Ee.string().pipe(Ee.coerce.date()).or(Ee.date()),organizationId:Ee.string(),schemaVersion:Ee.string(),purpose:Ee.nativeEnum(as).catch("AUTO_HEALING"),runId:Ee.string().nullish(),details:is.or(is.array()).nullish(),applied:Ee.boolean().nullish(),appliedAt:Ee.coerce.date().nullish()}),km=Dc.extend({steps:Ae.array()});import{isValidCron as mC}from"cron-validator";import{z as oe}from"zod";import{z as Fc}from"zod";var zn=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r))(zn||{});var ss=Fc.object({width:Fc.number().min(200).max(1e4),height:Fc.number().min(200).max(1e4)}),_m={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},cU=Object.keys(_m);var Gt=_m["Desktop Large"],Io="en-us",Po="America/Los_Angeles";var Lo={latitude:37.7749,longitude:-122.4194};var Dm=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Fm=2e3,ls=Lr.extend({browserType:oe.nativeEnum(zn).optional(),slowMoMs:oe.number().optional().refine(n=>n===void 0||n<=Fm&&n>=-1,{message:`Slow motion must be between 0 and ${Fm} milliseconds`}),basicAuthorization:oe.object({username:oe.string().optional(),password:oe.string().optional()}).optional(),geolocation:oe.object({latitude:oe.coerce.number().refine(n=>n>=-90&&n<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:oe.coerce.number().refine(n=>n>=-180&&n<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:oe.boolean().optional(),locale:oe.string().optional(),timezone:oe.enum(Dm).optional(),colorScheme:oe.enum(["light","dark"]).optional()}),Um=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],hC=oe.object({disableAICaching:oe.boolean().optional(),failureRecovery:oe.boolean().optional().describe("undefined means inherit org settings")});var gC=oe.object({viewport:ss.optional()}),Oo=gC.merge(hC).merge(ls),Mo=oe.object({cron:oe.string().refine(n=>mC(n),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:oe.boolean().default(!1),env:oe.string().optional(),timeZone:oe.string().default("America/Los_Angeles"),jobKey:oe.string().optional()}),No=oe.object({onSuccess:oe.boolean().default(!1),failureMessage:oe.string().optional(),onFailure:oe.boolean().default(!0),successMessage:oe.string().optional()}),fC=oe.object({name:oe.string(),required:oe.boolean().optional(),defaultValue:oe.string().describe("this is not optional because we need a value when the editor is first loaded")}),cs=fC.array(),SC=oe.object({name:oe.string(),value:oe.string()}),Bm=SC.array(),ds=oe.object({name:oe.string(),default:oe.boolean().optional(),fixtures:Pm.array().optional()});Te(G);var Wt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},ie=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(ie||{}),ps=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(ps||{});var We=G.string().pipe(G.coerce.date()).or(G.date()),Wi=G.object({id:G.string(),runKey:G.string(),organizationId:G.string(),createdAt:We,createdBy:G.string(),flake:G.boolean().nullish(),scheduledAt:We.or(G.null()),startedAt:We.or(G.null()),updatedAt:We.nullish(),finishedAt:We.or(G.null()),resolvedBaseUrl:G.string().nullish(),environmentName:G.string().nullish(),labels:G.array(G.string()).optional(),cliVersion:G.string().nullish(),section:G.nativeEnum(ps).nullish(),status:G.nativeEnum(ie),trigger:G.nativeEnum(Wt),attempts:G.number(),runAttempts:G.array(G.object({id:G.string(),status:G.nativeEnum(ie),startedAt:We.or(G.null()),finishedAt:We.or(G.null())})).optional(),videos:G.array(G.string()).optional(),failureReason:G.nativeEnum(ce).nullish(),failureDetails:es.nullish(),testFragments:G.array(Dc).nullish(),localTestId:G.string().nullish(),testId:G.string().nullish(),testName:G.string().nullish(),test:G.object({name:G.string(),id:G.string()}).nullish().default(null),suiteId:G.string().nullish()}).openapi({ref:"RunMetadata"}),yC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},us=Wi.pick({...yC,test:!0}),zm=Wi.omit({failureReason:!0,failureDetails:!0,test:!0}),Uc=Wi.extend({stepsSnapshot:G.array(G.record(G.unknown())).nullish(),resolvedInputs:G.record(G.string(),G.string()).nullish(),test:G.object({name:G.string(),id:G.string(),description:G.string().nullish(),baseUrl:G.string().nullish(),advanced:Oo.nullish()}).nullish()}).merge(_c),Hm=n=>n.includes("PASSED")&&n.includes("FAILED");var bC=Vi.object({id:Vi.string().uuid(),startedAt:We.or(Vi.null()),finishedAt:We.or(Vi.null()),status:Vi.nativeEnum(ie)}).merge(os),OU=bC.array();var qi=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(qi||{});import{z as qe}from"zod";var wC=qe.object({id:qe.string(),status:qe.nativeEnum(ie),trigger:qe.nativeEnum(Wt),createdAt:We,startedAt:We.nullish(),finishedAt:We.nullish(),gitCommitSha:qe.string().nullish(),gitCommitShaShort:qe.string().nullish(),gitCommitTimestamp:We.nullish(),gitBranchName:qe.string().nullish(),gitOriginUrl:qe.string().nullish(),gitCommitMessage:qe.string().nullish(),gitCommitAuthorName:qe.string().nullish(),githubRepository:qe.string().nullish(),gitlabProjectPath:qe.string().nullish(),pipelineId:qe.string().nullish(),cliVersion:qe.string().nullish(),suite:qe.object({id:qe.string(),name:qe.string()}).nullish(),runs:qe.object({status:qe.nativeEnum(ie)}).array()}).openapi({ref:"RunGroup"}),$m=wC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:us.array()});import{z as Xe}from"zod";var vC=Xe.object({type:Xe.literal("TARGETING"),name:Xe.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:qu.array(),pageState:Xe.string().optional(),targetSource:Xe.nativeEnum(er).optional(),targetUpdateTime:Xe.string().optional()}),TC=Xe.object({type:Xe.literal("AI_LOCATION"),matched:Xe.boolean(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional(),thoughts:Xe.string().optional()}),xC=Xe.object({type:Xe.literal("ASSERTION"),relevantElementsSerialized:Xe.string().array().optional(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional()}),jm=Xe.discriminatedUnion("type",[vC,TC,xC]);function ms(){return{details:[]}}import{z as Fe}from"zod";var EC=Fe.object({id:Fe.string(),name:Fe.string()}),WU=EC.merge(Fe.object({createdAt:We,createdBy:Fe.string(),schedule:Mo,notification:No,environment:Fe.object({name:Fe.string()}).nullish(),beforeTests:Fe.object({id:Fe.string()}).array().nullish(),afterTests:Fe.object({id:Fe.string()}).array().nullish()})),Gm=Fe.object({id:Fe.string().uuid(),orgId:Fe.string(),createdAt:We,startedAt:We.or(Fe.null()),finishedAt:We.or(Fe.null()),status:Fe.nativeEnum(ie),trigger:Fe.nativeEnum(Wt),suite:Fe.object({id:Fe.string(),name:Fe.string()}).nullish(),runs:Wi.array()}),VU=Gm.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),Wm=Gm.extend({runs:us.array()});import{z as Vt}from"zod";import{cloneDeep as JU}from"lodash-es";import{z as ue}from"zod";var tB=ue.object({thoughts:ue.string(),subGoals:ue.object({instruction:ue.string()}).array()}),nB=ue.object({thoughts:ue.string(),newPlanMarkdown:ue.string()}),rB=ue.object({thoughts:ue.string(),correct:ue.boolean(),failedActionIndex:ue.number().optional()}),CC=ue.object({type:ue.literal("PLANNING"),beforePlan:ue.string(),goalDecision:ue.string(),thoughts:ue.string()}),RC=ue.object({type:ue.literal("RUNNING"),stepDisplayName:ue.string(),status:ue.nativeEnum(xe),results:At.array()}),AC=ue.object({type:ue.literal("REVISING"),beforePlan:ue.string(),afterPlan:ue.string(),errString:ue.string(),diffs:ue.string(),thoughts:ue.string()}),IC=ue.object({type:ue.literal("SYSTEM"),message:ue.string()}),PC=ue.discriminatedUnion("type",[CC,RC,AC,IC]),Vm=PC.array();var lB=Vt.object({id:Vt.string(),scheduledAt:Vt.coerce.date().nullable(),startedAt:Vt.coerce.date().nullable(),finishedAt:Vt.coerce.date().nullable(),status:Vt.nativeEnum(ie),history:Vm.nullable(),testPlan:Vt.object({id:Vt.string(),name:Vt.string()}).nullable(),test:Vt.object({id:Vt.string(),name:Vt.string()}).nullable()});var qt=k.object({disableCache:k.boolean().optional(),loggerTags:k.record(k.string(),k.string()).optional(),langfuseSessionId:k.string().optional(),agentConfigVersion:k.string().optional()}),LC=k.object({screenshotBase64AfterCommand:k.string(),urlAfterCommand:k.string(),serializedCommand:k.string(),elementInteracted:k.string().optional(),thoughts:k.string().optional()}),qm=k.object({goal:k.string(),browserState:k.string(),screenshot:k.string(),source:Vu.optional().catch(void 0)}),Km=k.object({target:k.string().or(k.number()),browserState:k.string().optional(),screenshot:k.string().optional(),boundingBox:k.object({x:k.number(),y:k.number(),height:k.number(),width:k.number()}).optional()}),Ym=k.object({goal:k.string(),browserState:k.string(),screenshot:k.string().optional(),returnSchema:k.string().optional()}),Jm=k.object({goal:k.string(),browserState:k.string(),screenshot:k.string(),url:k.string(),contextChoice:ic.optional()}),Xm=k.object({command:wo}),Bc=k.object({goal:k.string(),browserState:k.string(),startingScreenshot:k.string().optional(),screenshot:k.string(),url:k.string(),history:LC.array(),actionHint:k.string().optional(),lastError:k.string().optional()}),Zm=k.object({results:rs.array(),errorMessage:k.string(),errorStack:k.string().optional()}),Qm=k.object({results:rs.array(),goal:k.string(),errorMessage:k.string()}),eh=k.object({failedResults:rs.array(),nextStepsSerialized:k.string().array(),currentUrl:k.string(),currentPageState:k.string(),currentScreenshot:k.string()}),IB=k.object({description:k.string(),type:k.union([k.literal("locator"),k.literal("assertion"),k.literal("ai-action")]),excerpt:k.string()});import{z as Ki}from"zod";var OB=Ki.object({goal:Ki.string()}),th=Ki.object({keywords:Ki.array(Ki.string())});import{z as yt}from"zod";var zc=yt.object({content:yt.string(),ids:yt.string().array(),tokenLength:yt.number()}),OC=yt.object({chunks:zc.array()}),kB=yt.object({ids:yt.string().array(),score:yt.number(),tokenLength:yt.number()}),_B=OC.extend({description:yt.string().describe("Input to pass to RAG engine"),tokenLimit:yt.number()}),nh=yt.object({ids:yt.number().array()}),rh=yt.object({indices:yt.number().array()});import{z as Hc}from"zod";var $c=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))($c||{}),UB=Hc.nativeEnum($c),MC=Hc.enum(["v1","v2"]),BB=MC.or(Hc.string().describe("for people with special configurations"));var oh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as Nr}from"zod";var ih=Nr.object({id:Nr.string().uuid(),skipped:Nr.boolean().optional(),envKey:Nr.string().optional().describe("key in the environment to save the result of this step to")}),jc=ih.merge(Da).extend({type:Nr.literal("REQUEST")}),Gc=ih.merge(Fa).extend({type:Nr.literal("JAVASCRIPT")}),Wc=Nr.discriminatedUnion("type",[Gc,jc]);import{z as Kt}from"zod";import{z as kr}from"zod";var NC=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Me=n=>{let e=n.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var hs=kr.string().min(1).max(255).superRefine((n,e)=>{try{ko(n)}catch(t){return e.addIssue({code:kr.ZodIssueCode.custom,message:t.message,fatal:!0}),kr.NEVER}});function ko(n){if(n=n.toLowerCase().trim(),n.length===0||n.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(n))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(n.endsWith("-")||n.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(n.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(n))throw new Error(`"${n}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(n)||/^\s|\s$/.test(n))throw new Error("Name cannot start or end with a space or dot.");if(n.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(n==="none")throw new Error("Name cannot be 'none'.");if(n.match(NC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var gs=kr.preprocess(n=>n===null?"":n,kr.union([kr.string().url(),kr.literal("")])).optional();var ah=Kt.object({id:Kt.string(),name:hs,description:Kt.string().optional().nullish(),baseUrl:gs.nullish(),schemaVersion:Kt.string(),advanced:Kt.unknown().optional(),retries:Kt.number(),envs:Kt.array(ds).nullish(),parameters:cs.nullish()}),kC=Kt.object({createdAt:Kt.coerce.date(),updatedAt:Kt.coerce.date(),schedule:Mo.nullish(),notification:No.nullish(),createdBy:Kt.string(),organizationId:Kt.string()}),_C=ah.merge(kC),a1=_C.extend({steps:Wc.array()}),s1=ah.extend({steps:Wc.array()});import{z as It}from"zod";var sh=It.object({startedAt:It.coerce.date(),finishedAt:It.coerce.date(),status:It.nativeEnum(xe),message:It.string().optional(),data:It.unknown().optional()}),FC=sh.merge(Gc).extend({type:It.literal("JAVASCRIPT")}),UC=sh.merge(jc).extend({type:It.literal("REQUEST")}),BC=It.discriminatedUnion("type",[FC,UC]),lh=It.object({startedAt:It.coerce.date(),finishedAt:It.coerce.date().nullish(),status:It.nativeEnum(ie),results:BC.array(),failureReason:It.string().nullish(),failureDetails:es.nullish()});import{z as Pt}from"zod";var zC=Pt.object({id:Pt.string(),organizationId:Pt.string(),createdAt:Pt.coerce.date(),updatedAt:Pt.coerce.date(),createdBy:Pt.string(),scheduledAt:Pt.coerce.date().nullish(),startedAt:Pt.coerce.date().nullish(),finishedAt:Pt.coerce.date().nullish(),status:Pt.nativeEnum(ie),trigger:Pt.nativeEnum(Wt),results:lh.array().nullish(),apiTestName:Pt.string().nullish(),apiTestPath:Pt.string().nullish(),apiTestId:Pt.string().nullish()}),f1=zC.pick({status:!0,startedAt:!0,finishedAt:!0});var Yi=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Yi||{}),ch=3;function HC(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function Ji(n){if(!HC(n))switch(n){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Xi(n){switch(n.type){case"AI_EXTRACT":case"AI_ASSERTION":return ch;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"DRAG":case"MOUSE_DRAG":return n.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var _o=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function Vc(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as $C,splitCookiesString as jC}from"set-cookie-parser";import{z as he}from"zod";var qc=he.object({name:he.string(),value:he.string(),url:he.string().optional(),domain:he.string().optional(),path:he.string().optional(),expires:he.number().default(Date.now()/1e3+60*60*24*365),httpOnly:he.boolean().optional(),secure:he.boolean().default(!0),sameSite:he.union([he.literal("Strict"),he.literal("Lax"),he.literal("None")]).default("None")});function fs(n,e){let t=[],r=jC(n);for(let o of r){let i=$C(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let d=i.sameSite.trim().toLowerCase();if(d==="strict")a="Strict";else if(d==="lax")a="Lax";else if(d==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${d}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=qc.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let l=[s.name,...Object.keys(s)].map(d=>d.toLowerCase()),c=o.match(/\b(\S+)=([^;]*)/g);if(c)for(let d of c){let[p,u]=d.split("=");if(!p||!u)throw new Error(`Invalid key-value pair in cookie: ${d}`);l.includes(p.toLowerCase())||t.push({...s,name:p,value:u})}}return t}var GC=he.object({origin:he.string(),localStorage:he.array(he.object({name:he.string(),value:he.string()}))}),WC=he.object({entries:he.record(he.string(),he.array(he.tuple([he.unknown(),he.unknown()]))),version:he.number().optional()}),Ss=he.object({cookies:qc.array().optional(),origins:GC.array().optional(),idb:he.record(he.string(),WC).optional().describe("key is db name")});function ys(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=qc.safeParse({name:r.key,...r});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var U1=new Set(Object.values(De));var VC={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",SUCCESS:"Done"},B1={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],SUCCESS:[]},z1={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."};import{Faker as j1,en as G1}from"@faker-js/faker";import{z as W}from"zod";var dh=55555,K1=W.object({body:W.string(),to:W.string(),from:W.string()}),Y1=W.object({from:W.string().optional(),to:W.string(),timeout:W.number().optional(),beforeDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional()}),J1=W.object({to:W.string(),from:W.string(),subject:W.string(),body:W.string()}),X1=W.object({inbox:W.string(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),timeout:W.number().optional(),trimWhitespace:W.boolean().optional()}),Z1=W.object({inbox:W.string(),limit:W.number().optional(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),trimWhitespace:W.boolean().optional()});var ph=W.object({result:W.unknown(),variableUpdates:W.record(W.string(),W.unknown()).optional(),persistentVariableUpdates:W.record(W.string(),W.unknown()).optional(),error:W.string().optional(),success:W.boolean()}),Q1=W.object({id:W.string().optional(),orgId:W.string(),momenticLambdaAuthHash:W.string(),code:W.string(),fragment:W.boolean(),state:Gi,timeoutMs:W.number().optional()}),or=15e3;import*as pt from"zod";Te(pt);var qC=pt.object({url:pt.string(),lineNumber:pt.number(),columnNumber:pt.number()}).openapi({ref:"CodeLocation"}),bs=pt.object({timestamp:pt.number(),text:pt.string(),type:pt.string(),tabIndex:pt.number(),args:pt.unknown().array().optional(),url:pt.string().optional(),location:qC.optional()}).openapi({ref:"ConsoleLog"}),uh=bs.array(),KC=uh.array();import*as Yc from"zod";import{z as I}from"zod";var YC=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),JC=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),XC=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),hh=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:XC,comment:I.string().optional()}),ZC=I.array(hh),QC=I.object({name:I.string(),value:I.string(),path:I.string().optional(),domain:I.string().optional(),expires:I.string().optional(),httpOnly:I.boolean().optional(),secure:I.boolean().optional(),comment:I.string().optional()}),gh=I.array(QC),eR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),fh=I.array(eR),tR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),nR=I.array(tR),rR=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),oR=I.array(rR),iR=I.object({mimeType:I.string(),params:oR,text:I.string(),comment:I.string().optional()}),aR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:gh,headers:fh,queryString:nR,postData:iR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),sR=I.object({size:I.number().optional(),compression:I.number().optional(),mimeType:I.string().optional(),text:I.string().optional(),encoding:I.string().optional(),comment:I.string().optional()}),lR=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:gh,headers:fh,content:sR,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),mh=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),cR=I.object({beforeRequest:mh.optional(),afterRequest:mh.optional(),comment:I.string().optional()}),dR=I.object({blocked:I.number().optional(),dns:I.number().optional(),connect:I.number().optional(),send:I.number(),wait:I.number(),receive:I.number(),ssl:I.number().optional(),comment:I.string().optional()}),Sh=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:aR,response:lR.optional(),cache:cR.optional(),timings:dR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),pR=I.array(Sh),uR=I.object({version:I.string().default("1.1"),creator:YC.optional(),browser:JC.optional(),pages:ZC.optional(),entries:pR,comment:I.string().optional()}),mR=I.object({log:uR}),yh=I.record(I.string(),hh),bh=I.record(I.string(),Sh);function Kc(n,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(n).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime()),entries:Object.values(e).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime())}}}Te(Yc);var hR=Yc.object({logsPerPage:bs.array().array(),harPages:yh.optional(),harEntries:bh.optional()}).openapi({ref:"DebugData"});var _r=class{async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,r,o){}async storeNetworkLogsForRunAttempt(e,t,r,o){}async storeScreenshot(e,t,r){}async storeHtmlSnapshot(e,t,r){}};var ws=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function wh(n){for(let e of Object.values(ce))if(n.includes(e))return e}var R=class extends Error{reason;constructor(e,t,r){let o=!1;for(let i of Object.values(ce))if(t.startsWith(i)){o=!0,e=i;break}if(r?.errOptions?.cause)super(o?t:`${e}: ${t}`,r?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,r?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e,Object.defineProperty(this,"lastScreenshotBuffer",{value:r?.lastScreenshotBuffer,enumerable:!1})}getLastScreenshotBuffer(){return"lastScreenshotBuffer"in this?this.lastScreenshotBuffer:void 0}toString(){return this.message}toJSON(){return{message:this.message}}},xn=class extends Error{decisions;constructor(e,t,r={}){super(e,r),this.decisions=t,this.name="NoElementsFoundError"}toString(){return`${this.message}
|
|
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]="d8b5e4b1-ddb5-59d8-9465-6798a8d59560")}catch(e){}}();
|
|
4
|
+
var Px=Object.create;var Lu=Object.defineProperty;var Lx=Object.getOwnPropertyDescriptor;var Ox=Object.getOwnPropertyNames;var Mx=Object.getPrototypeOf,Nx=Object.prototype.hasOwnProperty;var Ou=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var kx=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ox(e))!Nx.call(n,o)&&o!==t&&Lu(n,o,{get:()=>e[o],enumerable:!(r=Lx(e,o))||r.enumerable});return n};var _x=(n,e,t)=>(t=n!=null?Px(Mx(n)):{},kx(e||!n||!n.__esModule?Lu(t,"default",{value:n,enumerable:!0}):t,n));var Wf=Ou(($K,Gf)=>{"use strict";Gf.exports=jf;function jf(n,e,t){n instanceof RegExp&&(n=Hf(n,t)),e instanceof RegExp&&(e=Hf(e,t));var r=$f(n,e,t);return r&&{start:r[0],end:r[1],pre:t.slice(0,r[0]),body:t.slice(r[0]+n.length,r[1]),post:t.slice(r[1]+e.length)}}function Hf(n,e){var t=e.match(n);return t?t[0]:null}jf.range=$f;function $f(n,e,t){var r,o,i,a,s,l=t.indexOf(n),c=t.indexOf(e,l+1),d=l;if(l>=0&&c>0){if(n===e)return[l,c];for(r=[],i=t.length;d>=0&&!s;)d==l?(r.push(d),l=t.indexOf(n,d+1)):r.length==1?s=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,a=c),c=t.indexOf(e,d+1)),d=l<c&&l>=0?l:c;r.length&&(s=[i,a])}return s}});var Qf=Ou((GK,Zf)=>{"use strict";var Vf=Wf();Zf.exports=PA;var qf="\0SLASH"+Math.random()+"\0",Kf="\0OPEN"+Math.random()+"\0",vd="\0CLOSE"+Math.random()+"\0",Yf="\0COMMA"+Math.random()+"\0",Jf="\0PERIOD"+Math.random()+"\0";function wd(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function AA(n){return n.split("\\\\").join(qf).split("\\{").join(Kf).split("\\}").join(vd).split("\\,").join(Yf).split("\\.").join(Jf)}function IA(n){return n.split(qf).join("\\").split(Kf).join("{").split(vd).join("}").split(Yf).join(",").split(Jf).join(".")}function Xf(n){if(!n)return[""];var e=[],t=Vf("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,a=r.split(",");a[a.length-1]+="{"+o+"}";var s=Xf(i);return i.length&&(a[a.length-1]+=s.shift(),a.push.apply(a,s)),e.push.apply(e,a),e}function PA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),da(AA(n),!0).map(IA)):[]}function LA(n){return"{"+n+"}"}function OA(n){return/^-?0\d/.test(n)}function MA(n,e){return n<=e}function NA(n,e){return n>=e}function da(n,e){var t=[],r=Vf("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?da(r.post,!1):[""];if(/\$$/.test(r.pre))for(var a=0;a<i.length;a++){var s=o+"{"+r.body+"}"+i[a];t.push(s)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(r.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(r.body),d=l||c,p=r.body.indexOf(",")>=0;if(!d&&!p)return r.post.match(/,.*\}/)?(n=r.pre+"{"+r.body+vd+r.post,da(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=Xf(r.body),u.length===1&&(u=da(u[0],!1).map(LA),u.length===1))return i.map(function(j){return r.pre+u[0]+j});var m;if(d){var h=wd(u[0]),g=wd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(wd(u[2])):1,w=MA,v=g<h;v&&(S*=-1,w=NA);var b=u.some(OA);m=[];for(var T=h;w(T,g);T+=S){var C;if(c)C=String.fromCharCode(T),C==="\\"&&(C="");else if(C=String(T),b){var A=f-C.length;if(A>0){var k=new Array(A+1).join("0");T<0?C="-"+k+C.slice(1):C=k+C}}m.push(C)}}else{m=[];for(var L=0;L<u.length;L++)m.push.apply(m,da(u[L],!1))}for(var L=0;L<m.length;L++)for(var a=0;a<i.length;a++){var s=o+m[L]+i[a];(!e||d||s)&&t.push(s)}}return t}});var Ii=(n,e)=>{},ac=!1;try{let n=await import("@sentry/node");Ii=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),ac=!0}catch{}import{Command as Jk,Option as sn}from"@commander-js/extra-typings";import{execSync as Xk}from"child_process";import tv from"body-parser";import MN from"cors";import NN from"dedent";import kN from"events";import nv,{Router as _N}from"express";import{diff as EA}from"deep-object-diff";import mn from"fs";import Jr from"path";import{diff as JR}from"deep-object-diff";import{z as Mu}from"zod";var l_=Mu.object({input:Mu.string()});import{z as Ve}from"zod";var p_=Ve.object({srcs:Ve.array(Ve.string()),urls:Ve.array(Ve.string()),desiredSrc:Ve.string().optional(),desiredUrl:Ve.string().optional()}),Nu=Ve.object({srcRegex:Ve.string().optional(),urlRegex:Ve.string().optional()}),ku=Ve.object({x:Ve.number(),y:Ve.number(),correlation:Ve.number()}),u_=Ve.object({searchImageBase64String:Ve.string(),pageImageBase64String:Ve.string(),id:Ve.string().uuid(),timeoutMs:Ve.number().max(1e4).min(0).optional()});import{z as N}from"zod";import{v4 as ye}from"uuid";import*as x from"zod";function Ee(n){if(typeof n.ZodType.prototype.openapi<"u")return;n.ZodType.prototype.openapi=function(o){return new this.constructor({...this._def,openapi:o})};let e=n.ZodObject.prototype.extend;n.ZodObject.prototype.extend=function(...o){let i=e.apply(this,o);return i._def.extendMetadata={extends:this},delete i._def.openapi,i};let t=n.ZodObject.prototype.omit;n.ZodObject.prototype.omit=function(...o){let i=t.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i};let r=n.ZodObject.prototype.pick;n.ZodObject.prototype.pick=function(...o){let i=r.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i}}import{z as fe}from"zod";Ee(fe);var _u=fe.object({plan:fe.string().optional(),evidence:fe.string().optional(),thoughts:fe.string(),result:fe.boolean(),relevantElements:fe.array(fe.number()).optional()}),So=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(So||{});var Dx=fe.object({type:fe.literal("ELEMENT_CONTENT"),negated:fe.boolean().optional(),operation:fe.nativeEnum(So),value:fe.string()}).openapi({ref:"ElementContentAssertion"}),Fx=fe.object({type:fe.literal("ELEMENT_ATTRIBUTE"),negated:fe.boolean().optional(),operation:fe.nativeEnum(So),attr:fe.string(),value:fe.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Pi=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(Pi||{}),Ux=fe.object({type:fe.literal("ELEMENT_EXISTENCE"),negated:fe.boolean().optional(),condition:fe.nativeEnum(Pi).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Du=fe.discriminatedUnion("type",[Dx,Fx,Ux]).openapi({ref:"ManualElementAssertion"});var Bx=fe.object({type:fe.literal("CONTENT"),negated:fe.boolean().optional(),value:fe.string()}).openapi({ref:"PageContentAssertion"}),Fu=fe.discriminatedUnion("type",[Bx]).openapi({ref:"ManualPageAssertion"});import*as F from"zod";Ee(F);var nr=(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))(nr||{}),zx=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),Rr=F.object({id:F.number().int(),dataMomenticId:F.number().int().optional(),selector:F.string().optional(),hybridSelector:F.object({textContent:F.string().or(F.null()),attributes:F.record(F.string(),F.string()),tagName:F.string(),expandShadowRoot:F.boolean(),classNames:F.string().array(),nthChild:F.number()}).array().optional(),generatedSelectors:F.string().array().optional(),role:F.string().optional(),name:F.string().optional(),numChildren:F.number().optional(),content:F.string().optional(),pathFromRoot:F.string().optional(),serializedForm:F.string().optional(),nodeOnlySerializedForm:F.string().optional(),serializedHtml:F.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:F.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:F.string().url().optional(),boundingBox:F.object({x:F.number().optional(),y:F.number().optional(),width:F.number(),height:F.number()}).describe("css pixel bounding box").optional(),frameCache:zx.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(nr).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional()}).openapi({ref:"A11yTargetWithCache"});function Uu(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var Hx=F.object({type:F.literal("description"),elementDescriptor:F.string(),a11yData:Rr.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),jx=F.object({x:F.number(),y:F.number()}),$x=F.object({type:F.literal("coordinates"),pixels:jx}).openapi({ref:"CoordinatesTarget"});function rr(n){return n.type==="description"}function xn(n){return n.type==="coordinates"}var dt=F.discriminatedUnion("type",[Hx,$x]).openapi({ref:"ElementTarget"});function sc(n){if(!n)return!1;switch(n.type){case"description":return!!n.elementDescriptor}return!0}function pt(n){if(!n)return"";switch(n.type){case"description":return n.elementDescriptor;case"coordinates":return`x: ${n.pixels.x}, y: ${n.pixels.y}`}}import{z as se}from"zod";var ja=se.object({url:se.string(),method:se.union([se.literal("GET"),se.literal("POST"),se.literal("PUT"),se.literal("DELETE"),se.literal("PATCH")]),headers:se.record(se.string(),se.string()).optional(),params:se.record(se.string(),se.string()).optional(),body:se.string().optional(),timeout:se.number().int().optional().describe("Max seconds to wait for the request to complete")}),Bu=se.object({url:se.string(),headers:se.record(se.string(),se.string()).optional(),query:se.string(),variables:se.record(se.string(),se.string()).optional(),timeout:se.number().int().optional().describe("Max seconds to wait for the request to complete")}),$a=se.object({code:se.string(),fragment:se.boolean().optional(),environment:se.union([se.literal("NODE"),se.literal("BROWSER")]).optional().describe("default NODE"),timeout:se.number().int().max(60).optional().describe("Max seconds for the code to complete")});var De=(G=>(G.AI_EXTRACT="AI_EXTRACT",G.AI_ASSERTION="AI_ASSERTION",G.AUTH_LOAD="AUTH_LOAD",G.AUTH_SAVE="AUTH_SAVE",G.BLUR="BLUR",G.CAPTCHA="CAPTCHA",G.CLICK="CLICK",G.COOKIE="COOKIE",G.COPY="COPY",G.DIALOG="DIALOG",G.DRAG="DRAG",G.ELEMENT_CHECK="ELEMENT_CHECK",G.FILE_UPLOAD="FILE_UPLOAD",G.FOCUS="FOCUS",G.GO_BACK="GO_BACK",G.GO_FORWARD="GO_FORWARD",G.HOVER="HOVER",G.JAVASCRIPT="JAVASCRIPT",G.LOCAL_STORAGE="LOCAL_STORAGE",G.MOUSE_DRAG="MOUSE_DRAG",G.NAVIGATE="NAVIGATE",G.NEW_TAB="NEW_TAB",G.PAGE_CHECK="PAGE_CHECK",G.PASTE="PASTE",G.PRESS="PRESS",G.REFRESH="REFRESH",G.REQUEST="REQUEST",G.GRAPHQL_REQUEST="GRAPHQL_REQUEST",G.SCROLL_DOWN="SCROLL_DOWN",G.SCROLL_UP="SCROLL_UP",G.SCROLL_LEFT="SCROLL_LEFT",G.SCROLL_RIGHT="SCROLL_RIGHT",G.SELECT_OPTION="SELECT_OPTION",G.SWITCH_TAB="TAB",G.TYPE="TYPE",G.VISUAL_DIFF="VISUAL_DIFF",G.WAIT="WAIT",G.WAIT_FOR_URL="WAIT_FOR_URL",G.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",G.AWAIT_LISTENER="AWAIT_LISTENER",G.RECORD_REQUESTS="RECORD_REQUESTS",G.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",G.SET_HEADER="SET_HEADER",G.SUCCESS="SUCCESS",G))(De||{});Ee(x);var Y=x.object({thoughts:x.string().optional(),id:x.string().uuid().describe("unique identifier to this step, used for step cache")}),$t=x.object({useSelector:x.boolean().optional(),force:x.boolean().optional(),disableCache:x.boolean().optional().describe("disable element caching for this step"),iframeUrl:x.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Tn=x.object({target:Rr}).optional().openapi({ref:"SingleTargetCache"}),Ga=x.object({loadTimeout:x.number().int().max(60).optional().describe("Max seconds for the page to load")}),Gx=Y.merge(Ga).merge(x.object({type:x.literal("NAVIGATE"),url:x.string()})).openapi({ref:"NavigateCommand"}),Wa=$t.merge(x.object({cache:Tn})),yo=Y.merge(Wa.merge(x.object({target:dt.optional(),type:x.literal("SCROLL_UP"),deltaY:x.number().optional()}))).openapi({ref:"ScrollUpCommand"}),bo=Y.merge(Wa.merge(x.object({target:dt.optional(),type:x.literal("SCROLL_DOWN"),deltaY:x.number().optional()}))).openapi({ref:"ScrollDownCommand"}),wo=Y.merge(Wa.merge(x.object({target:dt.optional(),type:x.literal("SCROLL_LEFT"),deltaX:x.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),vo=Y.merge(Wa.merge(x.object({target:dt.optional(),type:x.literal("SCROLL_RIGHT"),deltaX:x.number().optional()}))).openapi({ref:"ScrollRightCommand"}),P_=x.discriminatedUnion("type",[yo,bo,wo,vo]).openapi({ref:"AllScrollCommands"}),Wx=Y.merge(x.object({type:x.literal("DIALOG"),action:x.union([x.literal("ACCEPT"),x.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Vx=Y.merge(x.object({type:x.literal("WAIT"),delay:x.number()})).openapi({ref:"WaitCommand"}),qx=x.discriminatedUnion("type",[x.object({type:x.literal("SUBSTRING"),url:x.string()}),x.object({type:x.literal("GLOB"),glob:x.string()}),x.object({type:x.literal("REGEX"),regex:x.string()})]),Kx=x.object({caseInsensitive:x.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:x.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:x.number().int().optional().describe("Max seconds to wait for the URL to match")}),Yx=Y.extend({type:x.literal("WAIT_FOR_URL"),matcher:qx}).merge(Kx).openapi({ref:"WaitUrlCommand"}),Jx=Y.merge(Ga).merge(x.object({type:x.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Xx=Y.merge(x.object({type:x.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Zx=Y.merge(x.object({type:x.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),Qx=Y.extend({type:x.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),eT=Y.extend({type:x.literal("AUTH_LOAD"),storageState:x.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),cc=Y.merge($t).extend({type:x.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),tT=Y.extend({type:x.literal("COPY"),value:x.string()}).openapi({ref:"CopyCommand"}),nT=Y.extend({type:x.literal("PASTE")}).openapi({ref:"PasteCommand"}),rT=Y.merge($a).extend({type:x.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Oi=Y.merge($t).merge(x.object({type:x.literal("CLICK"),target:dt,doubleClick:x.boolean().optional(),rightClick:x.boolean().optional(),waitForDownload:x.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:x.number().optional(),downloadTimeoutMs:x.number().optional(),cache:Tn,relativePosition:x.object({x:x.number(),y:x.number()}).optional()})).openapi({ref:"ClickCommand"}),Mi=Y.merge($t).merge(x.object({type:x.literal("DRAG"),fromTarget:dt,toTarget:dt,steps:x.number().optional(),hoverSeconds:x.number().optional().describe("Seconds to hover the object before dropping"),cache:x.object({fromTarget:Rr.optional(),toTarget:Rr.optional()}).optional()})).openapi({ref:"DragCommand"}),Ni=Y.merge($t).merge(x.object({type:x.literal("MOUSE_DRAG"),target:dt.optional(),deltaX:x.string().describe("pixels to move horizontally, can be template"),deltaY:x.string().describe("pixels to move vertically, can be template"),steps:x.number().optional(),cache:Tn})).openapi({ref:"MouseDragCommand"}),ki=Y.merge($t).merge(x.object({type:x.literal("HOVER"),target:dt,cache:Tn})).openapi({ref:"HoverCommand"}),_i=Y.merge($t).merge(x.object({type:x.literal("FOCUS"),target:dt,cache:Tn})).openapi({ref:"FocusCommand"}),Di=Y.merge($t).extend({type:x.literal("BLUR"),target:dt.optional(),cache:Tn}).openapi({ref:"BlurCommand"}),oT=x.object({type:x.literal("URL"),url:x.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),iT=x.object({type:x.literal("USER_FILE"),name:x.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),aT=Y.extend({type:x.literal("FILE_UPLOAD"),fileSource:x.discriminatedUnion("type",[oT,iT]),filename:x.string().optional()}).openapi({ref:"FileUploadCommand"}),sT=x.discriminatedUnion("type",[x.object({type:x.literal("VALUE"),value:x.string()}),x.object({type:x.literal("LABEL"),label:x.string()}),x.object({type:x.literal("INDEX"),index:x.coerce.string()})]),Fi=Y.merge($t).extend({type:x.literal("SELECT_OPTION"),target:dt,cache:Tn,choice:sT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),dc=x.union([x.literal("MULTIMODAL"),x.literal("VISION_ONLY")]),zu=Y.merge(x.object({type:x.literal("AI_ASSERTION"),assertion:x.string(),disableCache:x.boolean().optional(),iframeUrl:x.string().optional(),contextChoice:dc.optional(),timeout:x.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),En=5,pc=600,Ui=Y.merge($t).extend({type:x.literal("ELEMENT_CHECK"),target:dt,assertion:Du,cache:Tn,timeout:x.number().int().min(0).max(pc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),lT=Y.extend({type:x.literal("PAGE_CHECK"),assertion:Fu,iframeUrl:x.string().optional().describe("url or url regex for the iframe"),timeout:x.number().int().min(0).max(pc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),cT=Y.merge(x.object({type:x.literal("AI_EXTRACT"),goal:x.string(),schema:x.string().optional(),envKey:x.string().optional(),disableCache:x.boolean().optional(),iframeUrl:x.string().optional()})).openapi({ref:"AIExtractCommand"}),dT=x.object({clearContent:x.boolean().optional(),forceClearContent:x.boolean().optional(),delay:x.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:x.boolean().optional(),pressEnter:x.boolean().optional()}),Hu=25,Bi=Y.merge($t).merge(dT).extend({type:x.literal("TYPE"),target:dt.optional(),value:x.string(),cache:Tn}).openapi({ref:"TypeCommand"}),pT=Y.merge(x.object({type:x.literal("PRESS"),value:x.string(),repeat:x.number().optional(),convertMeta:x.boolean().optional(),delayMs:x.number().optional()})).openapi({ref:"PressCommand"}),uT=x.object({type:x.literal("SUBSTRING"),substring:x.string()}),mT=x.object({type:x.literal("REGEX"),pattern:x.string()}),hT=x.object({type:x.literal("INDEX"),index:x.coerce.string()}),gT=x.discriminatedUnion("type",[uT,mT,hT]),fT=Y.merge(Ga).merge(x.object({type:x.literal("TAB"),action:gT})).openapi({ref:"TabCommand"}),ST=Y.merge(Ga).merge(x.object({type:x.literal("NEW_TAB"),url:x.string()})).openapi({ref:"NewTabCommand"}),yT=Y.merge(x.object({type:x.literal("COOKIE"),value:x.string()})).openapi({ref:"CookieCommand"}),bT=Y.merge(x.object({type:x.literal("LOCAL_STORAGE"),key:x.string(),value:x.string()})).openapi({ref:"LocalStorageCommand"}),wT=Y.extend({type:x.literal("REQUEST")}).merge(ja).openapi({ref:"RequestCommand"}),vT=Y.extend({type:x.literal("GRAPHQL_REQUEST")}).merge(Bu).openapi({ref:"GraphQLRequestCommand"}),xT=Y.merge(x.object({type:x.literal("SUCCESS"),condition:zu.optional()})).openapi({ref:"SuccessCommand"}),TT=Y.merge(x.object({type:x.literal("FAILURE")})).openapi({ref:"FailureCommand"}),ET=x.object({data:x.string().describe("location at which to find a jpg"),width:x.number(),height:x.number()}),zi=Y.merge($t).merge(x.object({type:x.literal("VISUAL_DIFF"),threshold:x.number().optional().describe("default 0.1"),target:dt.optional(),screenshot:ET.optional(),cache:Tn})).openapi({ref:"VisualDiffCommand"}),CT=Y.merge(x.object({type:x.literal("REGISTER_REQUEST_LISTENER"),pattern:x.string(),key:x.string()})).openapi({ref:"RegisterRequestListenerCommand"}),RT=Y.merge(x.object({type:x.literal("AWAIT_LISTENER"),key:x.string(),timeout:x.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),AT=Y.merge(x.object({type:x.literal("RECORD_REQUESTS"),pattern:x.string(),key:x.string()})).openapi({ref:"RecordRequestsCommand"}),IT=Y.merge(x.object({type:x.literal("GET_RECORDED_REQUESTS"),key:x.string()})).openapi({ref:"GetRecordedRequestsCommand"}),PT=Y.merge(x.object({type:x.literal("SET_HEADER"),name:x.string(),value:x.string(),urlPattern:x.string().optional().describe("URL pattern to match")})).openapi({ref:"SetHeaderCommand"}),ju=x.discriminatedUnion("type",[Oi,Bi,pT,Fi,Gx,bo,yo,zu,ki,Vx,xT]),LT=x.discriminatedUnion("type",[cT,eT,Qx,cc,yT,tT,Wx,Mi,Ui,aT,Xx,Zx,rT,bT,Ni,ST,lT,nT,Jx,wT,vT,wo,vo,fT,zi,_i,Di,Yx,CT,RT,AT,IT,PT]),xo=x.discriminatedUnion("type",[...ju.options,...LT.options]).openapi({ref:"Command"}),Va=x.discriminatedUnion("type",[...ju.options,TT]);function zn(n){let e;switch(n){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:ye(),type:n};break;case"AUTH_LOAD":{e={id:ye(),type:n,storageState:""};break}case"AI_EXTRACT":e={id:ye(),type:n,goal:""};break;case"DIALOG":e={id:ye(),type:n,action:"DISMISS"};break;case"DRAG":e={id:ye(),type:n,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ye(),type:n,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ye(),type:n,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ye(),type:n,delay:1};break;case"BLUR":e={id:ye(),type:n};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ye(),type:n,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ye(),type:n,value:"",clearContent:!0};break;case"SELECT_OPTION":e={id:ye(),type:n,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:ye(),type:n,url:""};case"TAB":e={id:ye(),type:n,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ye(),type:n,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ye(),type:n,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ye(),type:n,key:"",value:""};break;case"JAVASCRIPT":e={id:ye(),type:n,code:""};break;case"AI_ASSERTION":e={id:ye(),type:n,assertion:""};break;case"FILE_UPLOAD":{e={id:ye(),type:n,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ye(),type:n,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:ye(),type:n,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ye(),type:n,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:ye(),type:n,key:""};break}case"RECORD_REQUESTS":{e={id:ye(),type:n,pattern:"",key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ye(),type:n,key:""};break}case"SET_HEADER":{e={id:ye(),type:n,name:"",value:""};break}default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return e}function $u(n){switch(n.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":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":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}import{z as OT}from"zod";var k_=OT.discriminatedUnion("type",[Di,cc,Oi,Mi,_i,ki,Ni,yo,bo,wo,vo,Fi,Bi,zi,Ui]);function Gu(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as MT}from"zod";var Et={type:!0,cache:!0},Ar=MT.discriminatedUnion("type",[Di.pick(Et),Oi.pick(Et),Mi.pick(Et),Ui.pick(Et),_i.pick(Et),ki.pick(Et),Ni.pick(Et),yo.pick(Et),bo.pick(Et),wo.pick(Et),vo.pick(Et),Fi.pick(Et),Bi.pick(Et),zi.pick(Et)]),uc=Object.values(De).filter(n=>Ar.options.some(e=>e.shape.type.safeParse(n).success));xo.options.forEach(n=>{if("target"in n.shape&&!uc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as hc}from"zod";import{z as mc}from"zod";import{z as To}from"zod";var Ct=To.object({index:To.number().optional().describe("global index within a test (in-order traversal)"),id:To.string(),skipped:To.boolean().optional(),envKey:To.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:To.boolean().optional()});Ee(mc);var Rt=Ct.extend({type:mc.literal("PRESET_ACTION"),command:xo,skipped:mc.boolean().optional()}).openapi({ref:"PresetAction"});Ee(hc);var Ir=Ct.extend({type:hc.literal("AI_ACTION"),text:hc.string(),steps:Rt.array().optional()}).openapi({ref:"AIAction"});import{z as de}from"zod";var NT=de.object({cacheKey:de.string(),cacheExpiryMs:de.number()}),gc=Ct.extend({id:de.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:de.record(de.string()).optional(),cacheConfig:NT.optional()}),Hn=gc.extend({type:de.literal("MODULE"),moduleId:de.string().uuid()}),kT=de.union([Hn.pick({type:!0,moduleId:!0}),de.record(de.unknown())]),_T=de.object({type:de.literal("URL_REGEX"),regex:de.string()}),DT=de.object({type:de.literal("PAGE_CHECK"),substring:de.string()}),fc=de.object({cacheInvalidation:de.discriminatedUnion("type",[DT,_T]).optional()}),At=de.object({moduleId:de.string().uuid(),name:de.string(),description:de.string().nullish(),enabled:de.boolean().nullish(),parameters:de.string().array().nullish(),defaultParameters:de.record(de.string(),de.string()).nullish(),defaultCacheKey:de.string().nullish(),defaultCacheTtl:de.number().nullish(),defaultCacheAllInvocations:de.boolean().nullish(),autoAuth:de.boolean().nullish(),advanced:fc.nullish()});import{z as it}from"zod";import{z as Sc}from"zod";Ee(Sc);var Eo=Ct.extend({type:Sc.literal("AI_ACTION_DYNAMIC"),text:Sc.string()}).openapi({ref:"AIActionDynamic"});import{z as Wu}from"zod";var yc=Ct.extend({type:Wu.literal("CONDITIONAL"),skipped:Wu.boolean().optional()});import{z as qa}from"zod";var FT=qa.object({type:qa.literal("url"),url:qa.string()}),Hi=Ct.extend({type:qa.literal("IFRAME"),identifier:FT});import{z as Gt}from"zod";var bc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(bc||{});var UT=Gt.discriminatedUnion("type",[Gt.object({type:Gt.literal("NAVIGATE_URL"),url:Gt.string().url()}),Gt.object({type:Gt.literal("GO_TO_SECTION_START")})]),BT=Gt.object({trigger:Gt.nativeEnum(bc).optional(),attempts:Gt.number().int().optional(),restartBehavior:UT}),ji=Ct.extend({type:Gt.literal("SECTION"),description:Gt.string().describe("user provided goal of what the section should accomplish"),plan:Gt.string().array().optional(),autohealingConfig:BT.optional()});var Vu=At.merge(gc).extend({type:it.literal("RESOLVED_MODULE"),steps:it.lazy(()=>Ie.array())}),wc=At.extend({steps:it.lazy(()=>Ie.array())}),vc=Hi.extend({steps:it.lazy(()=>be.array())}),zT=Hi.extend({steps:it.lazy(()=>Ie.array())}),xc=ji.extend({steps:it.lazy(()=>be.array())}),HT=ji.extend({steps:it.lazy(()=>Ie.array())}),Pr=yc.extend({blocks:it.object({assertion:it.lazy(()=>Rt),steps:it.lazy(()=>be.array())}).array(),elseSteps:it.lazy(()=>be.array().optional())}),jT=yc.extend({blocks:it.object({assertion:it.lazy(()=>Rt),steps:it.lazy(()=>Ie.array())}).array(),elseSteps:it.lazy(()=>Ie.array().optional())}),be=it.discriminatedUnion("type",[Rt,Ir,Eo,Hn,Pr,vc,xc]),Ie=it.discriminatedUnion("type",[Rt,Ir,Eo,Vu,jT,zT,HT]);import{z as Wt}from"zod";var $T=Wt.object({steps:be.array(),beforeSteps:be.array().nullish(),afterSteps:be.array().nullish()}),Co=Wt.object({steps:Ie.array(),beforeSteps:Ie.array().nullish(),afterSteps:Ie.array().nullish()}),Lr=Wt.object({steps:Wt.record(Wt.string(),Wt.unknown()).array(),beforeSteps:Wt.record(Wt.string(),Wt.unknown()).array().nullish(),afterSteps:Wt.record(Wt.string(),Wt.unknown()).array().nullish()});var _e="1.0.20";import{z as or}from"zod";var Tc=or.object({key:or.string(),testId:or.string().optional(),moduleId:or.string().optional(),organizationId:or.string(),value:Ar}),GT=Tc.extend({uniqueKey:or.string()}),qu=or.record(or.string(),GT);var Ku=N.object({phrase:N.string()}),Ec=N.object({thoughts:N.string().optional(),result:N.union([N.literal("NOT_FOUND"),N.string(),N.number(),N.array(N.unknown()),N.record(N.unknown(),N.unknown()),N.unknown()])}),NF=N.object({text:N.string()}),Yu=N.object({thoughts:N.string(),review:N.string().optional(),id:N.number().int()}),Ka=(u=>(u.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",u.FEW_WORDS="FEW_WORDS",u.STYLE_TAG="STYLE_TAG",u.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",u.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",u.NONE="NONE",u.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",u.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",u.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",u.PREFER_ASSERTION="PREFER_ASSERTION",u.HTML_ELEMENTS="HTML_ELEMENTS",u.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",u))(Ka||{});var Ju=N.object({thoughts:N.string(),category:N.nativeEnum(Ka)}),WT=N.discriminatedUnion("op",[N.object({op:N.literal("replace"),path:N.string(),value:N.string()}),N.object({op:N.literal("add"),path:N.string(),value:N.string()}),N.object({op:N.literal("remove"),path:N.string()})]),kF=N.object({thoughts:N.string(),patches:WT.array()}),Xu=[N.literal("add"),N.literal("replace"),N.literal("remove")],VT=N.object({op:N.union(Xu),path:N.string(),value:Ie.optional()}),Zu=N.object({patches:VT.array(),thoughts:N.string()});var qT=N.object({thoughts:N.string(),op:N.union(Xu),value:N.union([N.null(),Ie])}),Qu=N.object({reasoning:N.string(),scenario:N.string(),patch:qT.or(N.null())}),_F=N.object({thoughts:N.string(),evaluation:N.number().min(1).max(10)}),DF=N.object({observations:N.string(),reasoning:N.string(),command:Va});var Cc=N.object({summary:N.string(),reasoning:N.string(),evaluation:N.discriminatedUnion("type",[N.object({type:N.literal("DONE")}),N.object({type:N.literal("RIGHT_TRACK")}),N.object({type:N.literal("WRONG_TRACK"),feedback:N.string()}),N.object({type:N.literal("IMPOSSIBLE")})])});import{z as _}from"zod";import*as te from"zod";var jF=te.object({thoughts:te.string().optional().describe("only provided if a description was provided"),target:Rr.optional().describe("only provided if a description was provided"),pageState:te.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:te.object({label:te.string(),value:te.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:te.object({data:te.string(),height:te.number().int(),width:te.number().int()}).optional().describe("only provided if returnScreenshot is true")}),em=te.union([te.literal("ELEMENT_CHECK"),te.literal("NEGATED_CHECK"),te.literal("SELECT_OPTION"),te.literal("TYPE")]);function Or(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.negated)return"NEGATED_CHECK";if(n.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var $i=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))($i||{}),Ro=te.object({matched:te.boolean(),reason:te.string().optional().describe("Human understandable description"),logs:te.string().array().optional().describe("Logs for debugging")}),KT=Ro.extend({type:te.literal("USER_SELECTOR")}),YT=Ro.extend({type:te.literal("CSS_SELECTOR"),selectors:te.string().array()}),JT=Ro.extend({type:te.literal("HYBRID_SELECTOR")}),XT=Ro.extend({type:te.literal("HTML_DISTANCE"),distance:te.number().optional(),closestElement:te.string().optional(),savedElement:te.string().optional()}),ZT=Ro.extend({type:te.literal("TEMPLATE_MATCHING"),elementImageUrl:te.string().url()}),QT=Ro.extend({type:te.literal("AUTO_FRAME"),logs:te.string().array().optional()}),tm=te.discriminatedUnion("type",[KT,YT,JT,XT,ZT,QT]);import{z as Ki}from"zod";import{z as vC}from"zod";import*as X from"zod";import{cloneDeep as Wi}from"lodash-es";var eE=n=>{let e=nm(n,0);if(e===void 0||!nE(n[e]))return;let t=nm(n,e+1);if(t!==void 0)return rE(n,e,t)},rm=eE,nm=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!tE(r))return t}},tE=n=>n===" "||n===" "||n===`
|
|
5
|
+
`||n==="\r",nE=n=>n==="{"||n==="[",rE=(n,e,t)=>{let r;for(let o=t-1;o>e;o-=1){let i=n[o];if(i==="\r")return;if(i===`
|
|
6
|
+
`)return oE(r);if(r===void 0)r=i;else if(r[0]===i)r+=i;else return}},oE=n=>n===void 0?0:n[0]===" "?n.length:n;var om=(n,e)=>{let t=Rc(n,"toPrecision",e,e);return t===void 0?Rc(n,"toExponential",e,e):t},Rc=(n,e,t,r)=>{let i=n[e](r).replace(iE,"$1").replace(aE,"$1");return i.length<=t?i:r===1?void 0:Rc(n,e,t,r-1)},iE=/(e)\+/iu,aE=/\.?0*($|e)/iu;var am=(n,e)=>{if(typeof n!="string")throw new TypeError(`Input must be a JSON string: ${n}`);sE(e)},sE=n=>{if(lE(n),n<0)throw new TypeError(`"maxSize" argument must be positive: ${n}`);if(n<im)throw new TypeError(`"maxSize" argument must be at least ${im}: ${n}`)},lE=n=>{if(n===void 0)throw new TypeError('"maxSize" argument must be defined');if(!Number.isInteger(n))throw new TypeError(`"maxSize" argument must be an integer: ${n}`)},im=7;var Ya=(n,e,t)=>{let r=lm(e,t);return sm(n,e,r)},sm=(n,e,t)=>{if(t>=e)return t;let r=n[t];return r>=SE&&r<=yE?sm(n,e,t+1):t},Ja=(n,e,t)=>{if(t===void 0)return t;let r=lm(e,t);return cE(n,r)},cE=(n,e)=>dE(n,e)?e-3:pE(n,e)?e-2:uE(n,e)?e-1:e,dE=(n,e)=>e>=3&&n[e-3]>=mE&&n[e-3]<=hE,pE=(n,e)=>e>=2&&n[e-2]>=gE,uE=(n,e)=>e>=1&&n[e-1]>=fE,lm=(n,e)=>e<0||Object.is(e,-0)?Math.max(n+e,0):e,mE=240,hE=244,gE=224,fE=194,SE=128,yE=191;var cm=(n,e,t)=>{let r=globalThis.Buffer.from(n),o=Ya(r,r.length,e),i=Ja(r,r.length,t);return o===0&&i>=r.length?r.toString():r.toString("utf8",o,i)};var dm=/[\uD800-\uDFFF]/gu,pm="\uFFFD";var Xa=n=>bE(n)?n.replace(dm,pm):n,bE=n=>{for(let e=0;e<n.length;e+=1){let t=n.codePointAt(e);if(t>=55296&&t<=57343)return!0}return!1};var Pc=({input:n,targetByteCount:e,firstStartSurrogate:t,lastStartSurrogate:r,firstEndSurrogate:o,lastEndSurrogate:i,increment:a,canBacktrack:s,shift:l,charIndexInit:c})=>{let d=c,p=d,u=0;for(;u<e;d+=a){p=d;let h=n.charCodeAt(d);if(Number.isNaN(h))break;if(h<=127){u+=1;continue}if(h<=2047){u+=2;continue}if(u+=3,h<t||h>r)continue;let g=n.charCodeAt(d+a);Number.isNaN(g)||g<o||g>i||(u+=1,d+=a)}return(s&&u>e?p:d)+l};var Lc=(n,e,t)=>e<0||Object.is(e,-0)?CE(n,e,t):EE(n,e,t),EE=(n,e,t)=>Pc({input:n,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),CE=(n,e,t)=>Pc({input:n,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:n.length-1});var Za=(n,e,t)=>{let r=Lc(n,e,!1),o=RE(n,t),i=r===0&&o===void 0?n:n.slice(r,o);return Xa(i)},RE=(n,e)=>{if(e===void 0)return e;let t=Lc(n,e,!0);return t===n.length?void 0:t};var mm=(n,e,t)=>{let{textEncoder:r,textDecoder:o}=AE(),i=IE(n),{written:a}=r.encodeInto(n,i),s=Ya(i,a,e),l=Ja(i,a,t),c=l===void 0?a:Math.min(l,a),d=i.subarray(s,c);return o.decode(d)},AE=()=>(Oc===void 0&&(Oc=new globalThis.TextEncoder,um=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:Oc,textDecoder:um}),Oc,um,IE=n=>{let e=n.length*3;return e>PE?new Uint8Array(e):((Qa===void 0||Qa.length<e)&&(Qa=new Uint8Array(e)),Qa)},PE=1e5,Qa;var hm=(n,e)=>{if(e===void 0)return e;let t=Mc(n,e);return t>=n.length*gm?void 0:t},Mc=(n,e)=>e<=n.length*-gm?0:e,gm=4;var fm=(n,e,t)=>{if(typeof n!="string")throw new TypeError(`First argument must be a string: ${n}`);LE(e),OE(t)},LE=n=>{if(n===void 0)throw new TypeError("Second argument is required.");Sm("Second",n)},OE=n=>{n!==void 0&&Sm("Third",n)},Sm=(n,e)=>{if(!Number.isInteger(e))throw new TypeError(`${n} argument must be an integer: ${e}`)};var ym=n=>{let e=!0,t=0;for(let r=0;r<Nc;r+=1){let o=ME(n,r);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/Nc}},ME=(n,e)=>{let t=Nc-1,r=1-(t-e)/t,o=Math.round(r*(n.length-1));return n.charCodeAt(o)},Nc=50;var NE=(n,e,t)=>{if(fm(n,e,t),n==="")return n;let r=Mc(n,e),o=hm(n,t);return o===void 0&&Object.is(r,0)?Xa(n):kE(n,r,o)},bm=NE,kE=(n,e,t)=>{if(n.length<=_E)return Za(n,e,t);let{asciiOnly:r,longCharsPercentage:o}=ym(n);return r?FE(n,e,t):o>=DE?Za(n,e,t):wm(n,e,t)},_E=200,DE=.4,FE=(n,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?cm(n,e,t):wm(n,e,t),wm=(n,e,t)=>"TextEncoder"in globalThis?mm(n,e,t):Za(n,e,t);var xm=(n,e)=>{let t=JSON.stringify(n),r=zE(t),o=bm(r,0,e-vm.length-Gi.length*2),a=`${UE(o)}${vm}`;return HE(a)},UE=n=>n.replace(BE,""),BE=/(\\|\\u[0-9a-fA-F]{0,3})$/u,zE=n=>n.slice(Gi.length,-Gi.length),HE=n=>`${Gi}${n}${Gi}`,Gi='"',vm="...";var Tm=n=>globalThis.Buffer.byteLength(n);var kc=n=>{let e=n.length,t=e;for(let r=0;r<e;r+=1){let o=n.charCodeAt(r);if(o<=jE)continue;if(o<=$E){t+=1;continue}if(t+=2,o<GE||o>WE)continue;let i=n.charCodeAt(r+1);i<VE||i>qE||(r+=1)}return t},jE=127,$E=2047,GE=55296,WE=56319,VE=56320,qE=57343;var Em=()=>KE.bind(void 0,new TextEncoder),KE=(n,e)=>{let t=YE(e);return n.encodeInto(e,t).written},YE=n=>{let e=n.length*3;return e>JE?new Uint8Array(e):((es===void 0||es.length<e)&&(es=new Uint8Array(e)),es)},JE=1e5,es;var ZE=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?Tm:"TextEncoder"in globalThis?QE.bind(void 0,Em()):kc,QE=(n,e)=>e.length<100?kc(e):n(e),Cm=ZE();var Rm=n=>{if(n===null)return eC;if(n===!0)return tC;if(n===!1)return nC;let e=typeof n;return e==="object"?rC:e==="number"?JSON.stringify(n).length:_c(n)},eC=4,tC=4,nC=5,rC=2,_c=n=>Cm(JSON.stringify(n));var ts=({size:n,increment:e,maxSize:t,truncatedProps:r,path:o,value:i})=>{let a=n+e,s=a>t;return s?{size:n,stop:s,truncatedProps:[...r,{path:o,value:i}]}:{size:a,stop:s,truncatedProps:r}},Im=n=>Rm(n),Pm=(n,e,t)=>{let r=Om({empty:n,indent:e,depth:t,keySpaceSize:0}),o=Mm(n);return r+o},Lm=({key:n,empty:e,indent:t,depth:r})=>{let o=Om({empty:e,indent:t,depth:r,keySpaceSize:1}),i=_c(n),a=Mm(e);return o+i+oC+a},oC=1,Om=({empty:n,indent:e,depth:t,keySpaceSize:r})=>{if(e===void 0)return 0;let o=Am+e*(t+1),i=n?Am+e*t:0;return r+o+i},Am=1,Mm=n=>n?0:iC,iC=1;var ns=({parent:n,truncatedProps:e,path:t,increment:r,maxSize:o,key:i,empty:a,size:s,truncateValue:l,indent:c,depth:d})=>{let p=n[i],u=[...t,i],{size:m,stop:h,truncatedProps:g}=ts({size:s,increment:r,maxSize:o,truncatedProps:e,path:u,value:p});return h?{empty:a,size:m,truncatedProps:g}:aC({value:p,truncatedProps:e,path:u,maxSize:o,empty:a,size:s,newSize:m,truncateValue:l,indent:c,depth:d})},aC=({value:n,truncatedProps:e,path:t,maxSize:r,empty:o,size:i,newSize:a,truncateValue:s,indent:l,depth:c})=>{let{value:d,size:p,truncatedProps:u}=s({value:n,truncatedProps:e,path:t,size:a,maxSize:r,indent:l,depth:c+1});return d===void 0?{empty:o,size:i,truncatedProps:u}:{empty:!1,size:p,value:d,truncatedProps:u}};var Nm=({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:a,depth:s})=>{let l=[],c={empty:!0,size:r,truncatedProps:e};for(let d=0;d<n.length;d+=1){let p=Pm(c.empty,a,s);c=ns({parent:n,truncatedProps:c.truncatedProps,path:t,increment:p,maxSize:o,key:d,empty:c.empty,size:c.size,truncateValue:i,indent:a,depth:s}),c.value!==void 0&&l.push(c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var km=({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:a,depth:s})=>{let l={},c={empty:!0,size:r,truncatedProps:e};for(let d in n){let p=Lm({key:d,empty:c.empty,indent:a,depth:s});c=ns({parent:n,truncatedProps:c.truncatedProps,path:t,increment:p,maxSize:o,key:d,empty:c.empty,size:c.size,truncateValue:i,indent:a,depth:s}),c.value!==void 0&&(l[d]=c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var rs=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:a})=>{let s=Im(n),{size:l,stop:c,truncatedProps:d}=ts({size:r,increment:s,maxSize:o,truncatedProps:e,path:t,value:n});return c?{value:void 0,size:l,truncatedProps:d}:sC({value:n,truncatedProps:d,path:t,size:l,maxSize:o,indent:i,depth:a})},sC=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:a})=>typeof n!="object"||n===null?{value:n,size:r,truncatedProps:e}:Array.isArray(n)?Nm({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:rs,indent:i,depth:a}):km({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:rs,indent:i,depth:a});var lC=(n,e)=>{am(n,e);let t=cC(n),r=dC(n),{value:o,truncatedProps:i}=rs({value:r,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:pC({newValue:o,value:r,maxSize:e,indent:t}),truncatedProps:i}},Ao=lC,cC=n=>{let e=rm(n);return typeof e=="string"?e.length:e},dC=n=>{try{return JSON.parse(n)}catch(e){throw new TypeError(`Invalid JSON string: "${n}"
|
|
7
|
+
${e.message}`)}},pC=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?om(e,t):xm(e,t);import*as Nr from"zod";import{z as dn}from"zod";import{z as bt}from"zod";var Dc=bt.object({autoFollowNewTabs:bt.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:bt.boolean().optional(),ignoreHrefForCaching:bt.boolean().optional(),hybridSelectorMode:bt.enum(["test","prefer"]).optional()});var _m=1e4,Dm=6e4,Mr=Dc.extend({pageLoadTimeoutMs:bt.number().optional().refine(n=>n===void 0||n<=Dm&&n>=-1,{message:`Page load timeout must be between 0 and ${Dm/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:bt.number().optional().refine(n=>n===void 0||n<=_m&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${_m/1e3} seconds`}),localChromeExtensionPaths:bt.string().array().optional(),extraHeaders:bt.record(bt.string(),bt.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:bt.string().optional(),disableGpu:bt.boolean().optional(),bustCacheOnBoundingBoxChange:bt.boolean().optional().describe("Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:bt.boolean().optional().describe("Allow fetching the partial accessibility tree if the full tree takes too long.")});var Ge="BASE_URL",os="CURRENT_URL",Io="ENV_NAME",Q0={[Ge]:"https://www.google.com"},Fm=dn.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),Um=dn.object({name:dn.string(),variables:dn.record(dn.string().describe("variable name"),dn.string().describe("variable value"))}),Bm=dn.object({name:dn.string(),variables:dn.record(dn.string().describe("variable name"),dn.unknown().describe("variable value")),browser:Mr.optional()});Ee(Nr);var Vi=Nr.object({env:Nr.record(Nr.unknown())}).openapi({ref:"TestContextSnapshot"}),uC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",mC=[Ge,Io],zm=[os,Ge,Io],It=class n{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t={}){return new n({baseUrl:"about:blank",currentUrl:"about:blank",envName:e,variablesFromEnvironment:t})}static fromSnapshot({snapshot:e,environmentVariables:t}){let r=e.env[Ge]??"about:blank",o=e.env[os]??"about:blank",i=e.env[Io],a={};for(let[l,c]of Object.entries(e.env))zm.includes(l)||(t??{})[l]===void 0&&(a[l]=c);return new n({baseUrl:r,currentUrl:o,dynamicVariables:a,envName:i,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Wi(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){mC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Io]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Wi(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>zm.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,uC]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Ao(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Ao(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[os]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Wi(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ge,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Io,e.envName)}getDynamicVariablesCopy(){return Wi(this.env)}getVariablesFromEnvironmentCopy(){return Wi(this.varsFromMomenticEnvironment)}};import{z as kr}from"zod";Ee(kr);var pe=(c=>(c.AI_PROVIDER="AIProviderError",c.USER_INFRA="UserInfrastructureError",c.ACTION_FAILURE="ActionFailureError",c.ASSERTION_FAILURE="AssertionFailureError",c.CONFIG_ERROR="UserConfigurationError",c.WEB_AGENT_PLATFORM="InternalWebAgentError",c.UNKNOWN_PLATFORM="InternalPlatformError",c.JOB_TIMEOUT="JobTimeoutError",c.UNKNOWN="UnknownError",c))(pe||{});var Hm=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],is={ActionFailureError:"Action failure",AssertionFailureError:"Assertion failure",UserInfrastructureError:"Infrastructure failure",UserConfigurationError:"Configuration error",AIProviderError:"AI provider error",InternalWebAgentError:"Momentic AI agent error",JobTimeoutError:"Job timeout",InternalPlatformError:"Unknown Momentic platform error",UnknownError:"Unknown error"},Po={ActionFailureError:"A browser action such as a click or type failed to execute because of the underlying page state is incorrect, suggesting a bug in the application itself.",AssertionFailureError:"An AI check failed for a legitimate reason, such as a missing element, a change in the page structure, or an unexpected state (e.g. loading state).",AIProviderError:"The AI provider failed to return a response or returned a malformed response.",UserInfrastructureError:"The user's web application exhibited an infrastructure failure, such as a page load timeout, a 5XX status code, maintenance page, or session crash.",UserConfigurationError:"The error message suggests a user-caused misconfiguration in the test, such as an undefined variable, a missing base URL, an empty test/module input parameter, or an invalid step option",JobTimeoutError:"The test took too long to complete, suggesting a problem with the test itself.",InternalWebAgentError:"The AI testing framework failed to find the correct element or evaluate the assertion correctly, even though the test steps and application state look valid. In other words, the AI agent failed to understand the page.",UnknownError:"An unknown error occurred. Please refer to the failure details in the run for more information or reach out to Momentic Support for assistance.",InternalPlatformError:"An unknown error occurred with the Momentic platform."},Fc=kr.object({reason:kr.nativeEnum(pe),summary:kr.string()}).openapi({ref:"TestResultClassification"}),as=kr.object({errorMessage:kr.string(),errorStack:kr.string().optional(),classification:Fc.optional()}).openapi({ref:"TestFailureDetails"});Ee(X);var Ce=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ce||{}),Uc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(Uc||{}),Bc=X.object({beforeUrl:X.string().optional(),afterUrl:X.string().optional(),message:X.string().optional(),beforeScreenshot:X.string().optional(),afterScreenshot:X.string().optional(),beforeSnapshot:X.string().optional(),afterSnapshot:X.string().optional(),startedAt:X.coerce.date(),finishedAt:X.coerce.date()}),hC=Bc.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(Uc),message:X.string().optional(),elementInteracted:X.string().optional()}),ir=Bc.extend({status:X.nativeEnum(Ce),message:X.string().optional(),data:X.unknown().optional(),beforeTestContext:Vi.optional(),afterTestContext:Vi.optional(),failureReason:X.nativeEnum(pe).optional(),details:X.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),ss=ir.merge(Rt).extend({results:hC.array(),proposedStep:Rt.optional()}),gC=ir.merge(Ir).extend({results:X.lazy(()=>ss.array())}),fC=ir.merge(Eo).extend({results:X.lazy(()=>ss.array())}),SC=ir.merge(Hn).extend({moduleName:X.string().optional(),results:X.lazy(()=>Pt.array())}),yC=ir.merge(Pr).extend({assertion:ss.optional(),results:X.lazy(()=>Pt.array()).describe("results for the block actually executed")}),bC=ir.merge(Hi).extend({results:X.lazy(()=>Pt.array())}),wC=ir.merge(ji).extend({results:X.lazy(()=>Pt.array()),healingAttempts:X.lazy(()=>Pt.array().array()).optional()}),Pt=X.discriminatedUnion("type",[gC,fC,ss,SC,yC,bC,wC]),ls=ir.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),cs=Bc.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var zc=vC.object({results:Pt.array().describe("main results"),beforeResults:Pt.array().optional(),afterResults:Pt.array().optional()}),ds=zc.partial();import{z as W}from"zod";import{z as Re}from"zod";var xC=Re.object({type:Re.literal("FAILURE_RECOVERY"),thoughts:Re.string()}),TC=Re.object({type:Re.literal("DESCRIPTION_UPDATE"),thoughts:Re.string()}),ps=Re.discriminatedUnion("type",[TC,xC]),us=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(us||{}),EC=Re.object({testId:Re.string(),name:Re.string(),orgId:Re.string(),runId:Re.string(),purpose:Re.nativeEnum(us).catch("AUTO_HEALING"),steps:Ie.array(),details:ps.or(ps.array()).optional()}),CU=EC.pick({name:!0,orgId:!0}),Hc=Re.object({id:Re.string(),name:Re.string().nullish(),createdAt:Re.string().pipe(Re.coerce.date()).or(Re.date()),organizationId:Re.string(),schemaVersion:Re.string(),purpose:Re.nativeEnum(us).catch("AUTO_HEALING"),runId:Re.string().nullish(),details:ps.or(ps.array()).nullish(),applied:Re.boolean().nullish(),appliedAt:Re.coerce.date().nullish()}),jm=Hc.extend({steps:Ie.array()});import{isValidCron as CC}from"cron-validator";import{z as oe}from"zod";import{z as jc}from"zod";var jn=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r))(jn||{});var ms=jc.object({width:jc.number().min(200).max(1e4),height:jc.number().min(200).max(1e4)}),$m={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},IU=Object.keys($m);var Vt=$m["Desktop Large"],Lo="en-us",Oo="America/Los_Angeles";var Mo={latitude:37.7749,longitude:-122.4194};var Gm=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var Wm=2e3,hs=Mr.extend({browserType:oe.nativeEnum(jn).optional(),slowMoMs:oe.number().optional().refine(n=>n===void 0||n<=Wm&&n>=-1,{message:`Slow motion must be between 0 and ${Wm} milliseconds`}),basicAuthorization:oe.object({username:oe.string().optional(),password:oe.string().optional()}).optional(),geolocation:oe.object({latitude:oe.coerce.number().refine(n=>n>=-90&&n<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:oe.coerce.number().refine(n=>n>=-180&&n<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:oe.boolean().optional(),locale:oe.string().optional(),timezone:oe.enum(Gm).optional(),colorScheme:oe.enum(["light","dark"]).optional()}),Vm=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],RC=oe.object({disableAICaching:oe.boolean().optional(),failureRecovery:oe.boolean().optional().describe("undefined means inherit org settings")});var AC=oe.object({viewport:ms.optional()}),No=AC.merge(RC).merge(hs),ko=oe.object({cron:oe.string().refine(n=>CC(n),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:oe.boolean().default(!1),env:oe.string().optional(),timeZone:oe.string().default("America/Los_Angeles"),jobKey:oe.string().optional()}),_o=oe.object({onSuccess:oe.boolean().default(!1),failureMessage:oe.string().optional(),onFailure:oe.boolean().default(!0),successMessage:oe.string().optional()}),IC=oe.object({name:oe.string(),required:oe.boolean().optional(),defaultValue:oe.string().describe("this is not optional because we need a value when the editor is first loaded")}),gs=IC.array(),PC=oe.object({name:oe.string(),value:oe.string()}),qm=PC.array(),fs=oe.object({name:oe.string(),default:oe.boolean().optional(),fixtures:Fm.array().optional()});Ee(W);var qt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},ae=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(ae||{}),Ss=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(Ss||{});var We=W.string().pipe(W.coerce.date()).or(W.date()),qi=W.object({id:W.string(),runKey:W.string(),organizationId:W.string(),createdAt:We,createdBy:W.string(),flake:W.boolean().nullish(),scheduledAt:We.or(W.null()),startedAt:We.or(W.null()),updatedAt:We.nullish(),finishedAt:We.or(W.null()),resolvedBaseUrl:W.string().nullish(),environmentName:W.string().nullish(),labels:W.array(W.string()).optional(),cliVersion:W.string().nullish(),section:W.nativeEnum(Ss).nullish(),status:W.nativeEnum(ae),trigger:W.nativeEnum(qt),attempts:W.number(),runAttempts:W.array(W.object({id:W.string(),status:W.nativeEnum(ae),startedAt:We.or(W.null()),finishedAt:We.or(W.null())})).optional(),videos:W.array(W.string()).optional(),failureReason:W.nativeEnum(pe).nullish(),failureDetails:as.nullish(),testFragments:W.array(Hc).nullish(),localTestId:W.string().nullish(),testId:W.string().nullish(),testName:W.string().nullish(),test:W.object({name:W.string(),id:W.string()}).nullish().default(null),suiteId:W.string().nullish()}).openapi({ref:"RunMetadata"}),LC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},ys=qi.pick({...LC,test:!0}),Km=qi.omit({failureReason:!0,failureDetails:!0,test:!0}),$c=qi.extend({stepsSnapshot:W.array(W.record(W.unknown())).nullish(),resolvedInputs:W.record(W.string(),W.string()).nullish(),test:W.object({name:W.string(),id:W.string(),description:W.string().nullish(),baseUrl:W.string().nullish(),advanced:No.nullish()}).nullish()}).merge(zc),Ym=n=>n.includes("PASSED")&&n.includes("FAILED");var OC=Ki.object({id:Ki.string().uuid(),startedAt:We.or(Ki.null()),finishedAt:We.or(Ki.null()),status:Ki.nativeEnum(ae)}).merge(ds),JU=OC.array();var Yi=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Yi||{});import{z as qe}from"zod";var MC=qe.object({id:qe.string(),status:qe.nativeEnum(ae),trigger:qe.nativeEnum(qt),createdAt:We,startedAt:We.nullish(),finishedAt:We.nullish(),gitCommitSha:qe.string().nullish(),gitCommitShaShort:qe.string().nullish(),gitCommitTimestamp:We.nullish(),gitBranchName:qe.string().nullish(),gitOriginUrl:qe.string().nullish(),gitCommitMessage:qe.string().nullish(),gitCommitAuthorName:qe.string().nullish(),githubRepository:qe.string().nullish(),gitlabProjectPath:qe.string().nullish(),pipelineId:qe.string().nullish(),cliVersion:qe.string().nullish(),suite:qe.object({id:qe.string(),name:qe.string()}).nullish(),runs:qe.object({status:qe.nativeEnum(ae)}).array()}).openapi({ref:"RunGroup"}),Jm=MC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:ys.array()});import{z as Xe}from"zod";var NC=Xe.object({type:Xe.literal("TARGETING"),name:Xe.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:tm.array(),pageState:Xe.string().optional(),targetSource:Xe.nativeEnum(nr).optional(),targetUpdateTime:Xe.string().optional()}),kC=Xe.object({type:Xe.literal("AI_LOCATION"),matched:Xe.boolean(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional(),thoughts:Xe.string().optional()}),_C=Xe.object({type:Xe.literal("ASSERTION"),relevantElementsSerialized:Xe.string().array().optional(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional()}),Xm=Xe.discriminatedUnion("type",[NC,kC,_C]);function bs(){return{details:[]}}import{z as Fe}from"zod";var DC=Fe.object({id:Fe.string(),name:Fe.string()}),dB=DC.merge(Fe.object({createdAt:We,createdBy:Fe.string(),schedule:ko,notification:_o,environment:Fe.object({name:Fe.string()}).nullish(),beforeTests:Fe.object({id:Fe.string()}).array().nullish(),afterTests:Fe.object({id:Fe.string()}).array().nullish()})),Zm=Fe.object({id:Fe.string().uuid(),orgId:Fe.string(),createdAt:We,startedAt:We.or(Fe.null()),finishedAt:We.or(Fe.null()),status:Fe.nativeEnum(ae),trigger:Fe.nativeEnum(qt),suite:Fe.object({id:Fe.string(),name:Fe.string()}).nullish(),runs:qi.array()}),pB=Zm.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),Qm=Zm.extend({runs:ys.array()});import{z as Kt}from"zod";import{cloneDeep as gB}from"lodash-es";import{z as he}from"zod";var wB=he.object({thoughts:he.string(),subGoals:he.object({instruction:he.string()}).array()}),vB=he.object({thoughts:he.string(),newPlanMarkdown:he.string()}),xB=he.object({thoughts:he.string(),correct:he.boolean(),failedActionIndex:he.number().optional()}),FC=he.object({type:he.literal("PLANNING"),beforePlan:he.string(),goalDecision:he.string(),thoughts:he.string()}),UC=he.object({type:he.literal("RUNNING"),stepDisplayName:he.string(),status:he.nativeEnum(Ce),results:Pt.array()}),BC=he.object({type:he.literal("REVISING"),beforePlan:he.string(),afterPlan:he.string(),errString:he.string(),diffs:he.string(),thoughts:he.string()}),zC=he.object({type:he.literal("SYSTEM"),message:he.string()}),HC=he.discriminatedUnion("type",[FC,UC,BC,zC]),eh=HC.array();var AB=Kt.object({id:Kt.string(),scheduledAt:Kt.coerce.date().nullable(),startedAt:Kt.coerce.date().nullable(),finishedAt:Kt.coerce.date().nullable(),status:Kt.nativeEnum(ae),history:eh.nullable(),testPlan:Kt.object({id:Kt.string(),name:Kt.string()}).nullable(),test:Kt.object({id:Kt.string(),name:Kt.string()}).nullable()});var Yt=_.object({disableCache:_.boolean().optional(),loggerTags:_.record(_.string(),_.string()).optional(),langfuseSessionId:_.string().optional(),agentConfigVersion:_.string().optional()}),jC=_.object({screenshotBase64AfterCommand:_.string(),urlAfterCommand:_.string(),serializedCommand:_.string(),elementInteracted:_.string().optional(),thoughts:_.string().optional()}),th=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),source:em.optional().catch(void 0)}),nh=_.object({target:_.string().or(_.number()),browserState:_.string().optional(),screenshot:_.string().optional(),boundingBox:_.object({x:_.number(),y:_.number(),height:_.number(),width:_.number()}).optional()}),rh=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string().optional(),returnSchema:_.string().optional()}),oh=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),url:_.string(),contextChoice:dc.optional()}),ih=_.object({command:xo}),Gc=_.object({goal:_.string(),browserState:_.string(),startingScreenshot:_.string().optional(),screenshot:_.string(),url:_.string(),history:jC.array(),actionHint:_.string().optional(),lastError:_.string().optional()}),ah=_.object({results:cs.array(),errorMessage:_.string(),errorStack:_.string().optional()}),sh=_.object({results:cs.array(),goal:_.string(),errorMessage:_.string()}),lh=_.object({failedResults:cs.array(),nextStepsSerialized:_.string().array(),currentUrl:_.string(),currentPageState:_.string(),currentScreenshot:_.string()}),qB=_.object({description:_.string(),type:_.union([_.literal("locator"),_.literal("assertion"),_.literal("ai-action")]),excerpt:_.string()});import{z as Ji}from"zod";var JB=Ji.object({goal:Ji.string()}),ch=Ji.object({keywords:Ji.array(Ji.string())});import{z as wt}from"zod";var Wc=wt.object({content:wt.string(),ids:wt.string().array(),tokenLength:wt.number()}),$C=wt.object({chunks:Wc.array()}),QB=wt.object({ids:wt.string().array(),score:wt.number(),tokenLength:wt.number()}),e1=$C.extend({description:wt.string().describe("Input to pass to RAG engine"),tokenLimit:wt.number()}),dh=wt.object({ids:wt.number().array()}),ph=wt.object({indices:wt.number().array()});import{z as Vc}from"zod";var qc=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))(qc||{}),r1=Vc.nativeEnum(qc),GC=Vc.enum(["v1","v2"]),o1=GC.or(Vc.string().describe("for people with special configurations"));var uh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as _r}from"zod";var mh=_r.object({id:_r.string().uuid(),skipped:_r.boolean().optional(),envKey:_r.string().optional().describe("key in the environment to save the result of this step to")}),Kc=mh.merge(ja).extend({type:_r.literal("REQUEST")}),Yc=mh.merge($a).extend({type:_r.literal("JAVASCRIPT")}),Jc=_r.discriminatedUnion("type",[Yc,Kc]);import{z as Jt}from"zod";import{z as Dr}from"zod";var WC=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Ne=n=>{let e=n.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ws=Dr.string().min(1).max(255).superRefine((n,e)=>{try{Do(n)}catch(t){return e.addIssue({code:Dr.ZodIssueCode.custom,message:t.message,fatal:!0}),Dr.NEVER}});function Do(n){if(n=n.toLowerCase().trim(),n.length===0||n.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(n))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(n.endsWith("-")||n.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(n.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(n))throw new Error(`"${n}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(n)||/^\s|\s$/.test(n))throw new Error("Name cannot start or end with a space or dot.");if(n.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(n==="none")throw new Error("Name cannot be 'none'.");if(n.match(WC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var vs=Dr.preprocess(n=>n===null?"":n,Dr.union([Dr.string().url(),Dr.literal("")])).optional();var hh=Jt.object({id:Jt.string(),name:ws,description:Jt.string().optional().nullish(),baseUrl:vs.nullish(),schemaVersion:Jt.string(),advanced:Jt.unknown().optional(),retries:Jt.number(),envs:Jt.array(fs).nullish(),parameters:gs.nullish()}),VC=Jt.object({createdAt:Jt.coerce.date(),updatedAt:Jt.coerce.date(),schedule:ko.nullish(),notification:_o.nullish(),createdBy:Jt.string(),organizationId:Jt.string()}),qC=hh.merge(VC),C1=qC.extend({steps:Jc.array()}),R1=hh.extend({steps:Jc.array()});import{z as Lt}from"zod";var gh=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date(),status:Lt.nativeEnum(Ce),message:Lt.string().optional(),data:Lt.unknown().optional()}),YC=gh.merge(Yc).extend({type:Lt.literal("JAVASCRIPT")}),JC=gh.merge(Kc).extend({type:Lt.literal("REQUEST")}),XC=Lt.discriminatedUnion("type",[YC,JC]),fh=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date().nullish(),status:Lt.nativeEnum(ae),results:XC.array(),failureReason:Lt.string().nullish(),failureDetails:as.nullish()});import{z as Ot}from"zod";var ZC=Ot.object({id:Ot.string(),organizationId:Ot.string(),createdAt:Ot.coerce.date(),updatedAt:Ot.coerce.date(),createdBy:Ot.string(),scheduledAt:Ot.coerce.date().nullish(),startedAt:Ot.coerce.date().nullish(),finishedAt:Ot.coerce.date().nullish(),status:Ot.nativeEnum(ae),trigger:Ot.nativeEnum(qt),results:fh.array().nullish(),apiTestName:Ot.string().nullish(),apiTestPath:Ot.string().nullish(),apiTestId:Ot.string().nullish()}),_1=ZC.pick({status:!0,startedAt:!0,finishedAt:!0});var Xi=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Xi||{}),Sh=3;function QC(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function Zi(n){if(!QC(n))switch(n){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Qi(n){switch(n.type){case"AI_EXTRACT":case"AI_ASSERTION":return Sh;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":return n.useSelector||!n.target||n.target.type!=="description"?0:1;case"DRAG":case"MOUSE_DRAG":return n.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var Fo=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function Xc(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as eR,splitCookiesString as tR}from"set-cookie-parser";import{z as ge}from"zod";var Zc=ge.object({name:ge.string(),value:ge.string(),url:ge.string().optional(),domain:ge.string().optional(),path:ge.string().optional(),expires:ge.number().default(Date.now()/1e3+60*60*24*365),httpOnly:ge.boolean().optional(),secure:ge.boolean().default(!0),sameSite:ge.union([ge.literal("Strict"),ge.literal("Lax"),ge.literal("None")]).default("None")});function xs(n,e){let t=[],r=tR(n);for(let o of r){let i=eR(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let d=i.sameSite.trim().toLowerCase();if(d==="strict")a="Strict";else if(d==="lax")a="Lax";else if(d==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${d}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=Zc.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let l=[s.name,...Object.keys(s)].map(d=>d.toLowerCase()),c=o.match(/\b(\S+)=([^;]*)/g);if(c)for(let d of c){let[p,u]=d.split("=");if(!p||!u)throw new Error(`Invalid key-value pair in cookie: ${d}`);l.includes(p.toLowerCase())||t.push({...s,name:p,value:u})}}return t}var nR=ge.object({origin:ge.string(),localStorage:ge.array(ge.object({name:ge.string(),value:ge.string()}))}),rR=ge.object({entries:ge.record(ge.string(),ge.array(ge.tuple([ge.unknown(),ge.unknown()]))),version:ge.number().optional()}),Ts=ge.object({cookies:Zc.array().optional(),origins:nR.array().optional(),idb:ge.record(ge.string(),rR).optional().describe("key is db name")});function Es(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=Zc.safeParse({name:r.key,...r});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var rz=new Set(Object.values(De));var oR={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",SUCCESS:"Done"},oz={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],SUCCESS:[]},iz={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."};import{Faker as lz,en as cz}from"@faker-js/faker";import{z as V}from"zod";var yh=55555,mz=V.object({body:V.string(),to:V.string(),from:V.string()}),hz=V.object({from:V.string().optional(),to:V.string(),timeout:V.number().optional(),beforeDate:V.string().pipe(V.coerce.date()).or(V.date()).optional(),afterDate:V.string().pipe(V.coerce.date()).or(V.date()).optional()}),gz=V.object({to:V.string(),from:V.string(),subject:V.string(),body:V.string()}),fz=V.object({inbox:V.string(),afterDate:V.string().pipe(V.coerce.date()).or(V.date()).optional(),timeout:V.number().optional(),trimWhitespace:V.boolean().optional()}),Sz=V.object({inbox:V.string(),limit:V.number().optional(),afterDate:V.string().pipe(V.coerce.date()).or(V.date()).optional(),trimWhitespace:V.boolean().optional()});var bh=V.object({result:V.unknown(),variableUpdates:V.record(V.string(),V.unknown()).optional(),persistentVariableUpdates:V.record(V.string(),V.unknown()).optional(),error:V.string().optional(),success:V.boolean()}),yz=V.object({id:V.string().optional(),orgId:V.string(),momenticLambdaAuthHash:V.string(),code:V.string(),fragment:V.boolean(),state:Vi,timeoutMs:V.number().optional()}),ar=15e3;import*as ut from"zod";Ee(ut);var iR=ut.object({url:ut.string(),lineNumber:ut.number(),columnNumber:ut.number()}).openapi({ref:"CodeLocation"}),Cs=ut.object({timestamp:ut.number(),text:ut.string(),type:ut.string(),tabIndex:ut.number(),args:ut.unknown().array().optional(),url:ut.string().optional(),location:iR.optional()}).openapi({ref:"ConsoleLog"}),wh=Cs.array(),aR=wh.array();import*as ed from"zod";import{z as I}from"zod";var sR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),lR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),cR=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),xh=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:cR,comment:I.string().optional()}),dR=I.array(xh),pR=I.object({name:I.string(),value:I.string(),path:I.string().optional(),domain:I.string().optional(),expires:I.string().optional(),httpOnly:I.boolean().optional(),secure:I.boolean().optional(),comment:I.string().optional()}),Th=I.array(pR),uR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),Eh=I.array(uR),mR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),hR=I.array(mR),gR=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),fR=I.array(gR),SR=I.object({mimeType:I.string(),params:fR,text:I.string(),comment:I.string().optional()}),yR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:Th,headers:Eh,queryString:hR,postData:SR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),bR=I.object({size:I.number().optional(),compression:I.number().optional(),mimeType:I.string().optional(),text:I.string().optional(),encoding:I.string().optional(),comment:I.string().optional()}),wR=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:Th,headers:Eh,content:bR,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),vh=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),vR=I.object({beforeRequest:vh.optional(),afterRequest:vh.optional(),comment:I.string().optional()}),xR=I.object({blocked:I.number().optional(),dns:I.number().optional(),connect:I.number().optional(),send:I.number(),wait:I.number(),receive:I.number(),ssl:I.number().optional(),comment:I.string().optional()}),Ch=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:yR,response:wR.optional(),cache:vR.optional(),timings:xR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),TR=I.array(Ch),ER=I.object({version:I.string().default("1.1"),creator:sR.optional(),browser:lR.optional(),pages:dR.optional(),entries:TR,comment:I.string().optional()}),CR=I.object({log:ER}),Rh=I.record(I.string(),xh),Ah=I.record(I.string(),Ch);function Qc(n,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(n).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime()),entries:Object.values(e).sort((t,r)=>new Date(t.startedDateTime).getTime()-new Date(r.startedDateTime).getTime())}}}Ee(ed);var RR=ed.object({logsPerPage:Cs.array().array(),harPages:Rh.optional(),harEntries:Ah.optional()}).openapi({ref:"DebugData"});var Fr=class{async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,r,o){}async storeNetworkLogsForRunAttempt(e,t,r,o){}async storeScreenshot(e,t,r){}async storeHtmlSnapshot(e,t,r){}};var Rs=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function Ih(n){for(let e of Object.values(pe))if(n.includes(e))return e}var R=class extends Error{reason;constructor(e,t,r){let o=!1;for(let i of Object.values(pe))if(t.startsWith(i)){o=!0,e=i;break}if(r?.errOptions?.cause)super(o?t:`${e}: ${t}`,r?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,r?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e,Object.defineProperty(this,"lastScreenshotBuffer",{value:r?.lastScreenshotBuffer,enumerable:!1})}getLastScreenshotBuffer(){return"lastScreenshotBuffer"in this?this.lastScreenshotBuffer:void 0}toString(){return this.message}toJSON(){return{message:this.message}}},Cn=class extends Error{decisions;constructor(e,t,r={}){super(e,r),this.decisions=t,this.name="NoElementsFoundError"}toString(){return`${this.message}
|
|
8
8
|
Decisions:
|
|
9
9
|
${this.decisions.map(e=>e.toString()).join(`
|
|
10
|
-
`)}`}};function vh(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator"):!1}function Jc(n){return!(n instanceof Error)||n.message.includes("locator resolved to visible")?!1:!!(n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("body >")||n.message.includes("Element is not attached to the DOM"))}function Zi(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator")&&n.message.includes("data-momentic-id")&&!n.message.includes("locator resolved")&&!n.message.includes("waiting for element to be"):!1}var Dr=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as gR}from"lodash-es";import{z as En}from"zod";var Dt=(m=>(m.AutoExpandIframes="auto_expand_iframes",m.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",m.DisableClickhouseCaches="disable_clickhouse_caches",m.DisableClickHouseLastUpdatedEndpoint="disable_clickhouse_last_updated_endpoint",m.FakerConstantSeed="faker_constant_seed",m.ShowZeroOpacityElements="show_zero_opacity_elements",m.GlobalLocatorRedirect="global_locator_redirect",m.IconKnowledgeBase="icon_knowledge_base",m.MiniModelInitialAssertion="mini_model_initial_assertion",m.MiniModelInitialLocator="mini_model_initial_locator",m.ShowTestPlans="show_test_plans",m.RagV2="rag_v2",m.VisualActions="visual_actions",m))(Dt||{});var Th=En.union([En.string(),En.number(),En.boolean(),En.null(),En.record(En.string(),En.lazy(()=>Th)),En.array(En.lazy(()=>Th))]),Qi=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=gR(this.flags);return Object.entries(e).forEach(([t,r])=>{typeof r=="boolean"&&Object.values(Dt).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},Hz=new Qi({},{});var Xc={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},xh=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],jz=Object.keys(Xc);import*as Eh from"zod";var Wz=Eh.custom().refine(n=>n&&n.length>0).refine(n=>n&&n[0]instanceof File,{message:"Please upload a valid file."});import{z as ir}from"zod";var Kz=ir.object({id:ir.string(),name:ir.string(),createdAt:ir.coerce.date(),createdBy:ir.string(),updatedAt:ir.coerce.date(),updatedBy:ir.string().nullable(),organizationId:ir.string()});import{z as V}from"zod";import{z as Ke}from"zod";var bt=Ke.object({id:Ke.string(),name:hs,baseUrl:gs,description:Ke.string().optional().nullish(),schemaVersion:Ke.string(),advanced:Oo,retries:Ke.number(),envs:Ke.array(ds).nullish(),parameters:cs.nullish(),disabled:Ke.boolean().optional(),labels:Ke.array(Ke.string()).optional().catch([])}),tH=bt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),fR=Ke.object({labels:Ke.array(Ke.string()).optional(),outputs:Bm.nullish()}),Yt=bt.merge(fR),SR=Ke.object({createdAt:Ke.coerce.date(),updatedAt:Ke.coerce.date(),updatedBy:Ke.string().nullable(),schedule:Mo,notification:No,createdBy:Ke.string(),organizationId:Ke.string(),folderId:Ke.string().nullable().optional()}),yR=bt.merge(SR),nH=yR.merge(xo),vs=bt.merge(xo),rH=bt.merge(Ir);var Ch=V.object({platformSep:V.string(),fullPathSegments:V.string().array(),relativePath:V.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:V.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:V.coerce.date(),createdAt:V.coerce.date()}),pH=V.array(Ch.extend({id:V.string(),name:V.string(),description:V.string().optional(),labels:V.string().array().optional()})),uH=V.array(Ch.extend({id:V.string(),name:V.string(),description:V.string().optional(),content:gc})),mH=vs.merge(Yt),Rh=V.object({schemaVersion:V.string(),stepLists:xo}),Ah=Yt.partial().merge(bt.pick({id:!0})),Ih=V.object({name:V.string(),description:V.string().optional(),baseUrl:V.string().url().optional(),environment:V.string().optional(),browserType:V.nativeEnum(zn).optional(),viewport:ss.optional(),folderPath:V.string().optional()}),hH=vs.merge(V.object({relativeFilePath:V.string().describe("relative to project root")})),Ph=V.object({name:V.string()}),gH=V.object({relativeFilePath:V.string()}),Lh=V.object({name:V.string(),description:V.string(),enabled:V.boolean(),steps:V.lazy(()=>Ae.array()),testFilePath:V.string().describe("relative to the project root"),folderPath:V.string().optional().describe("user selected folder path")}),Oh=V.object({description:V.string(),enabled:V.boolean()}).partial();var fH=V.array(Om),Mh=V.object({defaultEnv:V.string().optional().describe("name of the default env, or undefined to unset")}),Nh=V.object({configFilePath:V.string().describe("full path on disk")}),SH=V.string().array(),yH=V.object({message:V.string(),newRelativeTestPath:V.string().optional()});var Ts=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],kh=Ts.map(n=>`**/${n}/**`);import Cn from"chalk";var bR=["app","version","env","namespace","host"];function Ue(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!bR.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var Zc=class n{minLogLevel;logBindings;constructor(e,t){this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...r){if(e<this.minLogLevel)return;let o;Array.isArray(r[0])?(o=r[0],r=r.slice(1)):typeof r[0]=="object"&&!(r[0]instanceof Error)&&Object.entries(r[0]).length&&(o={...r[0],...this.logBindings},r=r.slice(1));let i=[];if(i.push(...r),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,l]of a){let c=l;l instanceof Error?c=l.message:typeof l=="object"&&(c=JSON.stringify(l,void 0,2),c=c.split(`
|
|
10
|
+
`)}`}};function Ph(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator"):!1}function td(n){return!(n instanceof Error)||n.message.includes("locator resolved to visible")?!1:!!(n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("body >")||n.message.includes("Element is not attached to the DOM"))}function ea(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator")&&n.message.includes("data-momentic-id")&&!n.message.includes("locator resolved")&&!n.message.includes("waiting for element to be"):!1}var Ur=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as AR}from"lodash-es";import{z as Rn}from"zod";var Ut=(m=>(m.AutoExpandIframes="auto_expand_iframes",m.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",m.DisableClickhouseCaches="disable_clickhouse_caches",m.DisableClickHouseLastUpdatedEndpoint="disable_clickhouse_last_updated_endpoint",m.FakerConstantSeed="faker_constant_seed",m.ShowZeroOpacityElements="show_zero_opacity_elements",m.GlobalLocatorRedirect="global_locator_redirect",m.IconKnowledgeBase="icon_knowledge_base",m.MiniModelInitialAssertion="mini_model_initial_assertion",m.MiniModelInitialLocator="mini_model_initial_locator",m.ShowTestPlans="show_test_plans",m.RagV2="rag_v2",m.VisualActions="visual_actions",m))(Ut||{});var Lh=Rn.union([Rn.string(),Rn.number(),Rn.boolean(),Rn.null(),Rn.record(Rn.string(),Rn.lazy(()=>Lh)),Rn.array(Rn.lazy(()=>Lh))]),ta=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=AR(this.flags);return Object.entries(e).forEach(([t,r])=>{typeof r=="boolean"&&Object.values(Ut).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},aH=new ta({},{});var nd={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},Oh=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],lH=Object.keys(nd);import*as Mh from"zod";var dH=Mh.custom().refine(n=>n&&n.length>0).refine(n=>n&&n[0]instanceof File,{message:"Please upload a valid file."});import{z as sr}from"zod";var mH=sr.object({id:sr.string(),name:sr.string(),createdAt:sr.coerce.date(),createdBy:sr.string(),updatedAt:sr.coerce.date(),updatedBy:sr.string().nullable(),organizationId:sr.string()});import{z as P}from"zod";import{z as Ke}from"zod";var vt=Ke.object({id:Ke.string(),name:ws,baseUrl:vs,description:Ke.string().optional().nullish(),schemaVersion:Ke.string(),advanced:No,retries:Ke.number(),envs:Ke.array(fs).nullish(),parameters:gs.nullish(),disabled:Ke.boolean().optional(),labels:Ke.array(Ke.string()).optional().catch([])}),wH=vt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),IR=Ke.object({labels:Ke.array(Ke.string()).optional(),outputs:qm.nullish()}),Xt=vt.merge(IR),PR=Ke.object({createdAt:Ke.coerce.date(),updatedAt:Ke.coerce.date(),updatedBy:Ke.string().nullable(),schedule:ko,notification:_o,createdBy:Ke.string(),organizationId:Ke.string(),folderId:Ke.string().nullable().optional()}),LR=vt.merge(PR),vH=LR.merge(Co),As=vt.merge(Co),xH=vt.merge(Lr);var Nh=P.object({platformSep:P.string(),fullPathSegments:P.string().array(),relativePathSegments:P.string().array(),relativePath:P.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:P.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:P.coerce.date(),createdAt:P.coerce.date()}),OR=P.array(Nh.extend({id:P.string(),name:P.string(),description:P.string().optional(),labels:P.string().array().optional()})),MR=P.array(Nh.extend({id:P.string(),name:P.string(),description:P.string().optional(),content:wc})),LH=P.object({tests:OR,modules:MR,labels:P.string().array()}),OH=As.merge(Xt),kh=P.object({schemaVersion:P.string(),stepLists:Co}),_h=Xt.partial().merge(vt.pick({id:!0})),Dh=P.object({name:P.string(),description:P.string().optional(),baseUrl:P.string().url().optional(),environment:P.string().optional(),browserType:P.nativeEnum(jn).optional(),viewport:ms.optional(),pathSegments:P.string().array().optional()}),MH=As.merge(P.object({relativeFilePath:P.string().describe("relative to project root")})),Fh=P.object({name:P.string()}),NH=P.object({relativeFilePath:P.string()}),Uh=P.object({name:P.string(),description:P.string(),enabled:P.boolean(),steps:P.lazy(()=>Ie.array()),testFilePath:P.string().describe("relative to the project root"),folderPath:P.string().optional().describe("user selected folder path")}),Bh=P.object({description:P.string(),enabled:P.boolean()}).partial();var kH=P.array(Bm),zh=P.object({defaultEnv:P.string().optional().describe("name of the default env, or undefined to unset")}),Hh=P.object({configFilePath:P.string().describe("full path on disk")}),_H=P.string().array(),DH=P.object({message:P.string(),newRelativeTestPath:P.string().optional()}),rd=P.object({name:P.string(),absolutePath:P.string(),relativePath:P.string(),pathSegments:P.array(P.string()),isDirectory:P.boolean(),size:P.number(),createdAt:P.coerce.date(),modifiedAt:P.coerce.date(),accessedAt:P.coerce.date()}),jh=P.object({pathSegments:P.array(P.string())}),FH=P.object({absolutePath:P.string(),pathSegments:P.array(P.string()),contents:P.array(rd)}),$h=P.object({pathSegments:P.array(P.string())}),Gh=P.object({pathSegments:P.array(P.string()),newPathSegments:P.array(P.string())}),Wh=P.object({pathSegments:P.array(P.string()),recursive:P.boolean().optional()}),UH=P.object({success:P.boolean(),message:P.string(),pathSegments:P.array(P.string()).optional()});var Is=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],Vh=Is.map(n=>`**/${n}/**`);import An from"chalk";var NR=["app","version","env","namespace","host"];function Ue(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!NR.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var od=class n{minLogLevel;logBindings;constructor(e,t){this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...r){if(e<this.minLogLevel)return;let o;Array.isArray(r[0])?(o=r[0],r=r.slice(1)):typeof r[0]=="object"&&!(r[0]instanceof Error)&&Object.entries(r[0]).length&&(o={...r[0],...this.logBindings},r=r.slice(1));let i=[];if(i.push(...r),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,l]of a){let c=l;l instanceof Error?c=l.message:typeof l=="object"&&(c=JSON.stringify(l,void 0,2),c=c.split(`
|
|
11
11
|
`).map((d,p)=>p>0?` ${d}`:d).join(`
|
|
12
12
|
`)),console.log(t(` ${s}:`,c))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=JSON.stringify(a,void 0,2),s=s.split(`
|
|
13
13
|
`).map((l,c)=>c>0?` ${l}`:l).join(`
|
|
14
|
-
`)),console.log(" ",t(s))}}setMinLevel(e){this.minLogLevel=e}log(...e){this.logWithLevel(1,Cn.reset,...e)}info(...e){this.logWithLevel(1,Cn.white,...e)}debug(...e){this.logWithLevel(0,Cn.dim,...e)}warn(...e){this.logWithLevel(2,Cn.yellow,...e)}error(...e){this.logWithLevel(3,Cn.red,...e)}success(...e){this.logWithLevel(4,Cn.green,...e)}dimmed(...e){this.logWithLevel(1,Cn.dim,...e)}underline(...e){this.logWithLevel(2,Cn.underline,...e)}bold(...e){this.logWithLevel(2,Cn.bold,...e)}grey(...e){this.logWithLevel(0,Cn.grey,...e)}child(e){return new n(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},y=new Zc(1,{}),Fr={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Fr,flush:()=>{},bindings:()=>({})},xs={},Ur=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...a)=>{let s=xs[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},xs[e]=s),s.totalCount++,s.count<t&&(s.count++,n.debug(o,i,...a)),s.timer=setTimeout(()=>{let l=xs[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete xs[e]},r)};import{z as Ze}from"zod";var _h=Ze.object({id:Ze.string(),createdAt:Ze.coerce.date(),createdBy:Ze.string(),organizationId:Ze.string(),name:Ze.string(),description:Ze.string().nullish(),enabled:Ze.boolean(),schemaVersion:Ze.string().describe("Schema version for steps"),parameters:Ze.string().array().nullish().describe("Parameter list"),defaultParameters:Ze.record(Ze.string(),Ze.string()).nullish(),defaultCacheKey:Ze.string().nullish(),defaultCacheTtl:Ze.number().nullish(),defaultCacheAllInvocations:Ze.boolean().nullish(),autoAuth:Ze.boolean().nullish(),advanced:pc.nullish()}),OH=_h.extend({steps:Ze.lazy(()=>ye.array())}),Dh=5*60*1e3,Qc=Ct.merge(_h.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as kH}from"date-fns-tz";import{z as Be}from"zod";var ed=Be.object({failureRecovery:Be.boolean().optional(),aiAction:Be.boolean().optional(),stepLintSuggestions:Be.boolean().optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()}),Fh=Be.object({fakerConstantSeed:Be.boolean().optional()}),UH=Be.object({ai:ed.optional(),githubAppInstallationId:Be.number().nullish(),githubReleaseAppInstallationId:Be.number().nullish(),gitlabAppAccessToken:Be.string().nullish().optional(),gitlabAppBaseUrl:Be.string().nullish().optional(),qaseAccessToken:Be.string().nullish().optional(),browser:Oc.optional()}),BH=Be.object({globalOverrides:Be.record(Be.string()).optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()});import*as E from"zod";var Uh="x-momentic-cli-version",Bh="x-momentic-main-branch-name",zh="x-momentic-branch-name",Hh="x-momentic-commit-timestamp",$h="x-momentic-last-commit-on-main",jh="x-momentic-last-commit-on-main-timestamp",QH=E.object({error:E.boolean(),reason:E.string(),message:E.string()}),e$=qt.merge(Bc),Gh=za,t$=qt.merge(Bc);var n$=qt.merge(Jm).extend({useConsensus:E.boolean().optional(),attemptNumber:E.number().optional()}),td=Au,r$=qt.merge(Xm),Wh=$u,o$=qt.merge(qm),Vh=Hu,i$=qt.merge(Km),qh=zu,a$=qt.merge(Ym);var s$=E.object({testPaths:E.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:E.string().optional(),all:E.boolean().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional(),testInputMatrix:E.record(E.string(),E.string()).array().optional()}),Kh=E.object({queuedTests:E.unknown().array(),runIds:E.string().uuid().array(),runGroupId:E.string().optional()});var l$=E.string().array(),c$=E.union([E.object({paths:E.string().array().describe("run specific test paths (e.g. todo-test)"),all:E.boolean().describe("run all tests").optional()}),E.object({path:E.string().describe("deprecated; present for backcompat")})]),Yh=E.object({tests:E.record(E.string().describe("Test name"),E.string().describe("Test YAML")),modules:E.record(E.string().describe("Module name"),E.string().describe("Module YAML"))}),wR=E.object({test:E.string().describe("test YAML"),modules:E.record(E.string().describe("moduleId"),E.string().describe("module YAML"))}),d$=wR.array(),p$=E.object({testId:E.string(),schemaVersion:E.string()}).merge(Ir),u$=E.object({entries:E.array(yc),testId:E.string()}),m$=E.object({testId:E.string(),uniqueKeys:E.string().array()}),h$=E.object({steps:E.array(E.record(E.unknown())),testId:E.string(),schemaVersion:E.string(),organizationId:E.string()}),Jh=Bu,Xh=E.object({trigger:E.nativeEnum(Wt),status:E.nativeEnum(ie),startedAt:E.coerce.date().optional(),gitCommitSha:E.string().optional(),gitCommitShaShort:E.string().optional(),gitCommitTimestamp:E.coerce.date().optional(),gitBranchName:E.string().optional(),gitOriginUrl:E.string().optional(),gitCommitMessage:E.string().optional(),gitCommitAuthorName:E.string().optional(),githubRepository:E.string().optional(),gitlabProjectPath:E.string().optional(),pipelineId:E.string().optional(),cliVersion:E.string().optional()}),g$=E.object({id:E.string()}),Zh=E.object({status:E.nativeEnum(ie),updatedAt:E.coerce.date().optional(),finishedAt:E.coerce.date().optional()}),Qh=E.object({stepsSnapshot:E.array(E.record(E.unknown())).optional(),runGroupId:E.string().optional(),testId:E.string(),testName:E.string(),resolvedBaseUrl:E.string().optional(),environmentName:E.string().optional(),labels:E.array(E.string()).optional(),cliVersion:E.string().optional(),trigger:E.nativeEnum(Wt),schemaVersion:E.string().optional(),section:E.nativeEnum(ps).optional()}),f$=E.object({id:E.string()}),vR=Uc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),eg=vR.array(),tg=Uc.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),S$=E.object({id:E.string()}),ng=E.object({status:E.nativeEnum(ie),finishedAt:E.coerce.date().optional(),schemaVersion:E.string().optional().default("1.0.19"),results:E.record(E.string(),E.unknown()).array().optional(),beforeResults:E.record(E.string(),E.unknown()).array().optional(),afterResults:E.record(E.string(),E.unknown()).array().optional()}),y$=E.object({screenshot:E.string()}),rg=E.object({key:E.string()}),og=E.object({orgId:E.string(),userId:E.string()}),ig=E.array(Lm),b$=E.record(E.string(),E.union([E.string(),E.boolean()])),w$=E.object({paths:E.string().array(),env:E.string().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional()}),ag=E.object({suiteRunIds:E.string().array(),runGroupIds:E.string().array()}),v$=E.object({suiteRunIds:E.string().array()}),T$=Wm.array(),x$=E.object({runGroupIds:E.string().array()}),ea=E.object({uploadUrl:E.string()}),E$=qt.merge(Zm),C$=qt.merge(eh),R$=qt.merge(Qm),TR=E.object({testId:E.string().optional().default(""),testName:E.string().optional().default(""),suiteId:E.string().optional().default(""),suiteName:E.string().optional().default(""),creditsUsed:E.number().optional(),usedBy:E.string().optional()}),xR=E.object({transactionId:E.string(),timestamp:E.string(),event:E.nativeEnum(Yi),properties:TR}),A$=xR.array(),sg=km.omit({steps:!0}).extend({steps:E.array(E.record(E.string(),E.unknown())).describe("unparsed ResolvedStep[]")}),I$=E.object({limit:E.number().max(10).optional(),afterTime:E.number().optional()}),lg=zm.array(),P$=E.object({applied:E.boolean().optional(),appliedAt:E.coerce.date().optional()}),L$=qt.extend({chunks:zc.array(),description:E.string().describe("Input to pass to AI"),type:E.union([E.literal("locator"),E.literal("assertion"),E.literal("ai-action")]),softTokenLimit:E.number(),hardTokenLimit:E.number()}),cg=ea.extend({id:E.string()}),dg=E.object({runGroupId:E.string()});import{z as Ie}from"zod";var pg=Ie.object({orgId:Ie.string(),cacheKeys:Ie.string().array()}),N$=Ie.object({keyParams:pg,clientMetadata:Ie.string(),lockAcquisitionTimeoutMs:Ie.number().optional()}),ug=Ie.object({acquired:Ie.boolean(),acquiredByMetadata:Ie.string(),keyPrefix:Ie.string()}),k$=Ie.object({keyPrefix:Ie.string(),result:Ie.string(),ttlMs:Ie.number()}),_$=Ie.union([Ie.object({keyPrefix:Ie.string()}),pg]),ER=Ie.object({remainingTtlMs:Ie.number(),value:Ie.string().nullish()}),D$=Ie.object({results:Ie.record(Ie.string(),ER),activeLocks:Ie.string().array()}),mg=0,hg=5*60*1e3;import{z as cn}from"zod";var gg="test",fg="module",Lt=(t=>(t.TEST=`${gg}.yaml`,t.MODULE=`${fg}.yaml`,t))(Lt||{}),Ce=(t=>(t.TEST=`momentic/${gg}`,t.MODULE=`momentic/${fg}`,t))(Ce||{}),j$=bt.merge(Ir),nd=Ct.extend({steps:cn.array(cn.record(cn.string(),cn.unknown())),schemaVersion:cn.string()}),G$=nd.extend({fileType:cn.literal(Ce.MODULE)}),W$=cn.object({test:cn.string().describe("YAML for the test, including metadata and steps"),modules:cn.record(cn.string(),cn.string()).describe("Map of module name to YAML for the module")});import{z as it}from"zod";var CR=it.object({version:it.string(),json:it.record(it.unknown()),hash:it.string()}),Sg=it.record(it.unknown()),Y$=it.object({newSvgs:it.array(CR),metadata:Sg.optional()}),RR=it.object({version:it.string(),json:it.record(it.unknown()).nullish(),hash:it.string(),description:it.string().nullish(),metadata:Sg.nullish()}),yg=it.record(it.string().describe("icon hash"),RR);import{validator as ej}from"@exodus/schemasafe";var bg=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as uj}from"zod";import{z as Ye}from"zod";var gj=Ye.object({repositoriesIndexed:Ye.boolean(),indexingInProgress:Ye.boolean(),indexesOutdated:Ye.boolean()}),wg=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(wg||{}),vg=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(vg||{}),fj=Ye.object({name:Ye.string(),status:Ye.nativeEnum(wg),conclusion:Ye.nativeEnum(vg).nullable()}),rd=Ye.object({sha:Ye.string(),message:Ye.string(),author:Ye.object({name:Ye.string().optional(),email:Ye.string().optional(),date:Ye.coerce.date().optional()}),committer:Ye.object({name:Ye.string().optional(),email:Ye.string().optional(),date:Ye.coerce.date().optional()})});import{z as Ne}from"zod";var od=Ne.object({assertion:Ne.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),AR=Ne.object({instruction:Ne.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:od.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),Tg=AR.extend({subSteps:Ne.lazy(()=>Tg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),xg=Ne.object({name:Ne.string().describe("Short name describing the test plan"),description:Ne.string().nullish().transform(n=>n??void 0).describe("Longer form description of the high level goal of the test plan")}),Eg=xg.extend({id:Ne.string(),createdAt:Ne.coerce.date(),updatedAt:Ne.coerce.date(),updatedBy:Ne.string(),createdBy:Ne.string(),test:Ne.object({id:Ne.string(),name:Ne.string()}).nullish().transform(n=>n??void 0)}),wj=Eg.extend({testGenRuns:Ne.tuple([]).or(Ne.tuple([Ne.object({id:Ne.string(),startedAt:Ne.coerce.date(),status:Ne.nativeEnum(ie)})]))}),Cg=Ne.object({preConditions:od.array().nullish().transform(n=>n??[]),postConditions:od.array().nullish().transform(n=>n??[]),steps:Tg.array().nullish().transform(n=>n??[])}),vj=Eg.extend({plan:Cg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),IR=xg.extend({plan:Cg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),Tj=IR.array().nullish().transform(n=>n??[]);var Aj=90*24*60*60*1e3,Ij=14*24*60*60*1e3,Pj=7*24*60*60*1e3;import{z as ke}from"zod";var PR=ke.object({step:Ae,status:ke.nativeEnum(xe),startedAt:ke.coerce.date(),finishedAt:ke.coerce.date().optional(),healMetadata:ke.object({healType:ke.nativeEnum(Hi).or(ke.literal("AI")),healedAt:ke.coerce.date()}).optional(),beforeSnapshotId:ke.string().uuid().optional(),afterSnapshotId:ke.string().uuid().optional(),message:ke.string().optional()}),Dj=PR.extend({finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)}),LR=ke.object({startedAt:ke.coerce.date()}).merge(ng).merge(os),Fj=LR.extend({finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)}),OR=tg.merge(Qh).extend({status:ke.nativeEnum(ie),startedAt:ke.coerce.date(),attempts:ke.number()}),Uj=OR.extend({finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)}),MR=Xh.merge(Zh).extend({startedAt:ke.coerce.date(),cliVersion:ke.string()}),id=MR.extend({updatedAt:ke.coerce.date().optional().transform(n=>n??new Date),finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)});import NR from"semver";import{z as kR}from"zod";var $j=kR.string().refine(n=>NR.valid(n),{message:"must be a valid semver string"});var Es=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};function ad(n){let e={parentChain:[]};return Cs(n,e),e}function Cs(n,e){let{onPresetAction:t,onSimpleStepContainer:r,onConditional:o,earlyStop:i}=n;for(let a of n.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 l of a.blocks)if(t(l.assertion,e)&&i||Cs({...n,steps:l.steps},e)&&i)return!0;if(Cs({...n,steps:a.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"IFRAME":case"SECTION":case"AI_ACTION":if(r?.(a,e)&&i)return!0;if(a.steps){if(e.parentChain.push(a),Cs({...n,steps:a.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(r?.(a,e)&&i)return!0;break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(a)}}function Rg(n,e,t,r){let o=Array.from(e),i=Array.from(r);for(let s=0;s<o.length;s++){if(o[s]!==i[s])return!1;i.shift()}return!!_R([n],t,i).result}function _R(n,e,t=[]){let r,o=[],i=(a,s)=>{let l=JSON.stringify(s.parentChain.map(d=>d.id)),c=t.length===0?!0:JSON.stringify(t)===l;return a.id===e&&c?(r=a,o=s.parentChain,!0):!1};return ad({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function Ag(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?Rs(r,e):typeof r=="object"&&Ag(r,e))}}function Rs(n,e){for(let t of n)t&&(Array.isArray(t)?Rs(t,e):typeof t=="object"&&Ag(t,e))}import{cloneDeep as Ig}from"lodash-es";import{v4 as sd}from"uuid";async function Jt(n){let e=new Map,t=new Set,r=Ig(n.stepLists.steps),o=await Br({...n,steps:r,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),i={stepsToSave:{steps:o.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates};for(let a of["beforeSteps","afterSteps"]){let s=Ig(n.stepLists[a]);if(!s)continue;let l=await Br({...n,steps:s,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});i.cachesToSave.push(...l.cachesToSave),i.moduleUpdates.push(...l.moduleUpdates),i.stepsToSave[a]=l.stepsToSave}return i}async function Br({steps:n,...e}){let{seenModules:t,cacheCreationParams:r,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:l}=e,c={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let d of n)switch(delete d.index,delete d.aiSuggested,d.id=l?sd():d.id,d.type){case"PRESET_ACTION":{let u=d.command;u.id=l?sd():u.id,Lg(u),"cache"in u&&u.cache&&(r&&(c.cachesToSave=c.cachesToSave.concat(Pg({id:u.id,orgId:r.orgId,testId:r.testId,value:Cr.parse(u),moduleIdParents:o,moduleStepParents:i,skipIntermediateEntries:e.skipCacheIntermediateEntries}))),delete u.cache),u.thoughts&&delete u.thoughts,c.stepsToSave.push({...d,command:u});break}case"RESOLVED_MODULE":{let u=l?sd():d.id,m=d.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(d),a.set(d.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await Br({...e,steps:d.steps,cacheCreationParams:r?{...r}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,u],moduleIdParents:[...o,m],skipCacheIntermediateEntries:l});c.moduleUpdates=c.moduleUpdates.concat(f),c.cachesToSave=c.cachesToSave.concat(h),t.has(m)||(t.add(m),c.moduleUpdates.push({...Ct.parse(d),steps:ye.array().parse(g),moduleId:m}));let S={type:"MODULE",moduleId:m,inputs:d.inputs,id:u,skipped:d.skipped,cacheConfig:d.cacheConfig,envKey:d.envKey};c.stepsToSave.push(S);break}case"AI_ACTION":{if(!d.steps){c.stepsToSave.push(d);break}let{stepsToSave:u,cachesToSave:m}=await Br({...e,steps:d.steps});try{d.steps=Et.array().parse(u)}catch(h){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${h}`)}c.stepsToSave.push(d),c.cachesToSave=c.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{c.stepsToSave.push(d);break}case"CONDITIONAL":{let u=[];for(let h of d.blocks){let{stepsToSave:g,cachesToSave:f,moduleUpdates:S}=await Br({...e,steps:h.steps});u.push({...h,steps:g}),c.cachesToSave=c.cachesToSave.concat(f),c.moduleUpdates=c.moduleUpdates.concat(S)}let m={...d,elseSteps:void 0,blocks:u};if(d.elseSteps){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Br({...e,steps:d.elseSteps});m.elseSteps=h,c.cachesToSave=c.cachesToSave.concat(g),c.moduleUpdates=c.moduleUpdates.concat(f)}c.stepsToSave.push(m);break}case"IFRAME":case"SECTION":{let{stepsToSave:u,cachesToSave:m,moduleUpdates:h}=await Br({...e,steps:d.steps}),g={...d,steps:u};c.moduleUpdates=c.moduleUpdates.concat(h),c.stepsToSave.push(g),c.cachesToSave=c.cachesToSave.concat(m);break}default:return(u=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(d)}return c}function Do({steps:n,topLevel:e=!0,...t}){let{stepCacheEntries:r,logger:o,keyPrefix:i}=t,a=[],s=[],l=[],c=0,d=(u,m)=>{try{let h=Cr.parse(m.value);if(h.type!==u.type){o.warn({parsedCacheEntry:h,command:u},"Not using step cache due to type mismatch"),s.push(m.key);return}u.cache=h.cache,a.push(m.key),l.push(m.uniqueKey)}catch(h){s.push(m.key),o.error({err:h,cacheEntry:m},"Not using step cache due to parsing error")}},p=(u,m)=>{let h=FR(u.id,m),g=h.find(f=>!!r[f]);g?d(u,r[g]):s.push(h[0])};for(let u of n)switch(u.type){case"RESOLVED_MODULE":{c+=u.steps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Do({...t,steps:u.steps,keyPrefix:i?`${i}:${u.id}`:u.id,topLevel:!1});a.push(...h),s.push(...g),l.push(...f);break}case"IFRAME":case"SECTION":case"AI_ACTION":{if(c+=u.steps?.length??0,!u.steps?.length)break;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Do({...t,steps:u.steps,topLevel:!1});a.push(...h),s.push(...g),l.push(...f);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!sc.includes(u.command.type)||(u.command.type==="TYPE"||u.command.type==="MOUSE_DRAG"||u.command.type==="VISUAL_DIFF"||u.command.type==="SCROLL_DOWN"||u.command.type==="SCROLL_UP"||u.command.type==="SCROLL_LEFT"||u.command.type==="SCROLL_RIGHT")&&!u.command.target||u.command.type==="ELEMENT_CHECK"&&u.command.assertion.type==="ELEMENT_EXISTENCE"&&u.command.assertion.negated||"cache"in u.command&&u.command.cache)continue;c++,p(u.command,i);break}case"CONDITIONAL":{for(let h of u.blocks){c++,p(h.assertion.command,i),c+=h.steps.length;let{cacheKeysHit:g,cacheKeysMissed:f,uniqueKeysHit:S}=Do({...t,steps:h.steps,topLevel:!1});a.push(...g),s.push(...f),l.push(...S)}if(u.elseSteps){c+=u.elseSteps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Do({...t,steps:u.elseSteps,topLevel:!1});a.push(...h),s.push(...g),l.push(...f)}break}default:return(h=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(u)}return e&&c&&s.length>0&&o.warn({totalSteps:c,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:l,cacheEntries:r.length},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:l}}function Og(n,e){return e?`${e}:${n}`:n}function FR(n,e){let t=[],r=e?.split(":")??[];for(let o=r.length;o>=0;o--){let i=[...r.slice(o),n];t.push(i.join(":"))}return t.reverse(),t}function Pg(n){let{moduleStepParents:e=[],moduleIdParents:t=[]}=n;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
|
|
15
|
-
${JSON.stringify(t)}`);let r=[];if(!n.skipIntermediateEntries)for(let o=e.length;o>0;o--){let i=t[o-1],a=e.slice(o,e.length).join(":");r.push({key:Og(n.id,a),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:Og(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function Lg(n){switch(n.type){case"DRAG":{if(n.fromTarget.type==="coordinates"||n.toTarget.type==="coordinates"||!n.fromTarget?.a11yData||!n.toTarget?.a11yData)return;n.cache={fromTarget:n.fromTarget.a11yData,toTarget:n.toTarget.a11yData},delete n.fromTarget.a11yData,delete n.toTarget.a11yData;return}case"MOUSE_DRAG":case"HOVER":case"SCROLL_UP":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SELECT_OPTION":case"TYPE":case"VISUAL_DIFF":case"CLICK":case"FOCUS":case"ELEMENT_CHECK":case"BLUR":{if(n.target?.type==="coordinates"||!n.target?.a11yData)return;n.cache={target:n.target.a11yData},delete n.target.a11yData;return}default:return}}function Mg(n){let e=new Set;return Rs(n,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let r=t.moduleId;typeof r=="string"&&!e.has(r)&&e.add(r)}}),e}function Ng(n,e,t){e.length&&(n.type==="DRAG"?e.length!==2||!e.every(r=>r.cache)?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):n.fromTarget.type==="description"&&n.toTarget.type==="description"&&(n.cache={fromTarget:e[0].cache,toTarget:e[1].cache}):e.length!==1||!e[0]?.cache?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):"target"in n&&n.target&&n.target.type==="description"&&(n.cache={target:e[0].cache}))}async function As({logger:n,cacheStorage:e,orgId:t,testId:r,originalSteps:o,updatedSteps:i}){let a=DR(o,i);if(Object.keys(a).length>0){n.info({changes:a},"Updating steps caches post-run success");try{let{cachesToSave:s}=await Jt({stepLists:i,cacheCreationParams:{testId:r,orgId:t}});await e.saveStepCacheEntries(s,r,n)}catch(s){n.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}function ze(n,e,t=!1){return n.length<e?n:n.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var ar={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},sr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},ld={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},cd={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function UR(n){switch(n.type){case"ELEMENT_CONTENT":return`${n.negated?sr[n.operation]:ar[n.operation]} '${n.value}'`;case"ELEMENT_ATTRIBUTE":{let t=n.negated?sr[n.operation]:ar[n.operation];return n.operation==="EXISTS"?`attribute '${n.attr}' ${t}`:`attribute '${n.attr}' ${t} '${n.value}'`}case"ELEMENT_EXISTENCE":return n.negated?cd[n.condition]:ld[n.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var WW={CONTENT:"The page"};function BR(n){switch(n.type){case"VALUE":return`the option with value ${n.value}`;case"LABEL":return`the option with label ${n.label}`;case"INDEX":return`the option at index ${n.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function dd(n){switch(n.type){case"SUBSTRING":return`match substring '${n.url}'`;case"REGEX":return`match regex '${n.regex}'`;case"GLOB":return`match glob '${n.glob}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function zR(n){switch(n.type){case"CONTENT":return`${n.negated?sr.CONTAINS:ar.CONTAINS} '${n.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.type)}}function zr(n){switch(n.type){case"SUCCESS":return n.condition?.assertion?`Check success condition: ${n.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${n.goal}`;case"NAVIGATE":return`Go to URL: ${ze(n.url,30)}`;case"DIALOG":return`Automatically ${n.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 ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${dt(n.target)}`:""}`;case"WAIT":return`Wait for ${n.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(n.target?.type==="coordinates")return`Click at coordinates: ${dt(n.target)}`;let t="";return n.target?.elementDescriptor.length?t=` on element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` on element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Click${t}`}case"FOCUS":return`Focus ${dt(n.target)}`;case"BLUR":return`Focus ${dt(n.target)}`;case"DRAG":return`Drag ${dt(n.fromTarget)} onto ${dt(n.toTarget)}`;case"MOUSE_DRAG":return n.target?.type==="description"&&n.target.elementDescriptor?`Click and drag ${dt(n.target)} by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`:`Click and drag mouse by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`;case"TYPE":{let t="";return n.target?.type==="coordinates"?t=` in element at coordinates: ${dt(n.target)}`:n.target?.elementDescriptor.length?t=` in element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` in element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Type '${n.value}'${t||""}`}case"HOVER":{let t="";return n.target.type==="coordinates"?t=` over coordinates: ${dt(n.target)}`:n.target.elementDescriptor.length>0?t=` over element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` over element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Hover${t}`}case"PRESS":return`Press ${n.value}`;case"SELECT_OPTION":{let t="",r=BR(n.choice);return n.target.type==="coordinates"?t=` from element at coordinates: ${dt(n.target)}`:n.target.elementDescriptor.length>0?t=` from: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` from: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${r}'${t}`}case"TAB":switch(n.action.type){case"SUBSTRING":return`Switch to tab with substring: ${n.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${n.action.pattern}`;case"INDEX":return`Switch to tab at index: ${n.action.index}`;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${n.url}`;case"REQUEST":return`Send ${n.method} request to ${n.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${n.url}`;case"COOKIE":return`Set cookie: ${n.value}`;case"LOCAL_STORAGE":return`Set local storage: ${n.key}: ${n.value}`;case"JAVASCRIPT":return`Run JavaScript: ${ze(n.code,30)}`;case"AI_ASSERTION":return`Assertion: '${n.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${n.target?`for element: ${dt(n.target)}`:"for entire page"}`;case"FILE_UPLOAD":return n.fileSource.type==="URL"?`Upload file: ${n.fileSource.url}`:`Upload file: ${n.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${dt(n.target)} ${UR(n.assertion)}`;case"PAGE_CHECK":return`Check the page ${zR(n.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${dd(n.matcher)}`;case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return n.pattern?`Register a listener for network requests that match ${n.pattern}`:"Register a listener for network requests";case"AWAIT_LISTENER":return n.key?`Wait for the listener ${n.key} to resolve`:"Wait for a listener to resolve";case"RECORD_REQUESTS":return n.pattern?`Start recording requests that match ${n.pattern}`:"Start recording network requests";case"GET_RECORDED_REQUESTS":return n.key?`Get the requests that were recorded for ${n.key}`:"Get the requests that were recorded";case"SET_HEADER":return n.name?n.urlPattern?`Set a ${n.name} header for requests that match ${n.urlPattern}`:`Set a ${n.name} header for all requests`:"Set a header";default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function kg(n){let e=[];for(let t of n){t.sort((a,s)=>a.timestamp-s.timestamp);let r=[],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)`:r.push(o)),o=a,i=1);o&&r.push(o),e.push(r)}return e}import{cloneDeep as HR}from"lodash-es";import{cloneDeep as YW,unset as JW}from"lodash-es";function dn(n){switch(n.type){case"AI_ACTION":return`AI action: ${ze(n.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${ze(n.text,100)}`;case"PRESET_ACTION":return zr(n.command);case"MODULE":return`Module: ${n.id}`;case"RESOLVED_MODULE":return`Module: ${n.name}`;case"CONDITIONAL":return"Conditional step";case"IFRAME":return"Frame step";case"SECTION":return`Section${n.description?`with goal: ${ze(n.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(n)}}var _g=1e3,Dg=3e6,$R="[FAILED]";async function Fg(n,e,t,r){if(t)if(t.startsWith("http")){let i=await(await fetch(t)).arrayBuffer();return`data:image/jpeg;base64,${Buffer.from(i).toString("base64")}`}else return t.startsWith("data:")?t:`data:image/jpeg;base64,${t}`;else if(r){let o=await e.getScreenshot(n,r);if(o)return`data:image/jpeg;base64,${Buffer.from(o).toString("base64")}`}}async function Is(n,e,t,{numScreenshots:r=1,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,recursive:s=!0}){let l=[],c;for(let d=0;d<t.length;d++){let p=t[d],u=s?Hr(p):dn(p),m={description:`Step ${d}: ${u}`,startedAt:p.startedAt,finishedAt:p.finishedAt,beforeUrl:p.beforeUrl,afterUrl:p.afterUrl,message:p.message!=="Successfully executed preset action."?p.message:void 0,index:o?d:void 0};if(p.status==="FAILED"){m.description=`${$R} ${m.description}`,o&&(c=d);try{let h=jm.array().parse(p.details);for(let g of h)"pageState"in g&&a&&(m.pageState=g.pageState)}catch{}}r>0&&d>=t.length-r&&(m.afterScreenshot=await Fg(n,e,p.afterScreenshot,p.afterSnapshot),i&&(m.beforeScreenshot=await Fg(n,e,p.beforeScreenshot,p.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function Hr(n){let e=dn(n);switch(n.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
|
|
14
|
+
`)),console.log(" ",t(s))}}setMinLevel(e){this.minLogLevel=e}log(...e){this.logWithLevel(1,An.reset,...e)}info(...e){this.logWithLevel(1,An.white,...e)}debug(...e){this.logWithLevel(0,An.dim,...e)}warn(...e){this.logWithLevel(2,An.yellow,...e)}error(...e){this.logWithLevel(3,An.red,...e)}success(...e){this.logWithLevel(4,An.green,...e)}dimmed(...e){this.logWithLevel(1,An.dim,...e)}underline(...e){this.logWithLevel(2,An.underline,...e)}bold(...e){this.logWithLevel(2,An.bold,...e)}grey(...e){this.logWithLevel(0,An.grey,...e)}child(e){return new n(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},y=new od(1,{}),Br={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Br,flush:()=>{},bindings:()=>({})},Ps={},zr=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...a)=>{let s=Ps[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},Ps[e]=s),s.totalCount++,s.count<t&&(s.count++,n.debug(o,i,...a)),s.timer=setTimeout(()=>{let l=Ps[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete Ps[e]},r)};import{z as Ze}from"zod";var qh=Ze.object({id:Ze.string(),createdAt:Ze.coerce.date(),createdBy:Ze.string(),organizationId:Ze.string(),name:Ze.string(),description:Ze.string().nullish(),enabled:Ze.boolean(),schemaVersion:Ze.string().describe("Schema version for steps"),parameters:Ze.string().array().nullish().describe("Parameter list"),defaultParameters:Ze.record(Ze.string(),Ze.string()).nullish(),defaultCacheKey:Ze.string().nullish(),defaultCacheTtl:Ze.number().nullish(),defaultCacheAllInvocations:Ze.boolean().nullish(),autoAuth:Ze.boolean().nullish(),advanced:fc.nullish()}),XH=qh.extend({steps:Ze.lazy(()=>be.array())}),Kh=5*60*1e3,id=At.merge(qh.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as ej}from"date-fns-tz";import{z as Be}from"zod";var ad=Be.object({failureRecovery:Be.boolean().optional(),aiAction:Be.boolean().optional(),stepLintSuggestions:Be.boolean().optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()}),Yh=Be.object({fakerConstantSeed:Be.boolean().optional()}),oj=Be.object({ai:ad.optional(),githubAppInstallationId:Be.number().nullish(),githubReleaseAppInstallationId:Be.number().nullish(),gitlabAppAccessToken:Be.string().nullish().optional(),gitlabAppBaseUrl:Be.string().nullish().optional(),qaseAccessToken:Be.string().nullish().optional(),browser:Dc.optional()}),ij=Be.object({globalOverrides:Be.record(Be.string()).optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()});import*as E from"zod";var Jh="x-momentic-cli-version",Xh="x-momentic-main-branch-name",Zh="x-momentic-branch-name",Qh="x-momentic-commit-timestamp",eg="x-momentic-last-commit-on-main",tg="x-momentic-last-commit-on-main-timestamp",bj=E.object({error:E.boolean(),reason:E.string(),message:E.string()}),wj=Yt.merge(Gc),ng=Va,vj=Yt.merge(Gc);var xj=Yt.merge(oh).extend({useConsensus:E.boolean().optional(),attemptNumber:E.number().optional()}),sd=_u,Tj=Yt.merge(ih),rg=Ju,Ej=Yt.merge(th),og=Yu,Cj=Yt.merge(nh),ig=Ku,Rj=Yt.merge(rh);var Aj=E.object({testPaths:E.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:E.string().optional(),all:E.boolean().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional(),testInputMatrix:E.record(E.string(),E.string()).array().optional()}),ag=E.object({queuedTests:E.unknown().array(),runIds:E.string().uuid().array(),runGroupId:E.string().optional()});var Ij=E.string().array(),Pj=E.union([E.object({paths:E.string().array().describe("run specific test paths (e.g. todo-test)"),all:E.boolean().describe("run all tests").optional()}),E.object({path:E.string().describe("deprecated; present for backcompat")})]),sg=E.object({tests:E.record(E.string().describe("Test name"),E.string().describe("Test YAML")),modules:E.record(E.string().describe("Module name"),E.string().describe("Module YAML"))}),kR=E.object({test:E.string().describe("test YAML"),modules:E.record(E.string().describe("moduleId"),E.string().describe("module YAML"))}),Lj=kR.array(),Oj=E.object({testId:E.string(),schemaVersion:E.string()}).merge(Lr),Mj=E.object({entries:E.array(Tc),testId:E.string()}),Nj=E.object({testId:E.string(),uniqueKeys:E.string().array()}),kj=E.object({steps:E.array(E.record(E.unknown())),testId:E.string(),schemaVersion:E.string(),organizationId:E.string()}),lg=qu,cg=E.object({trigger:E.nativeEnum(qt),status:E.nativeEnum(ae),startedAt:E.coerce.date().optional(),gitCommitSha:E.string().optional(),gitCommitShaShort:E.string().optional(),gitCommitTimestamp:E.coerce.date().optional(),gitBranchName:E.string().optional(),gitOriginUrl:E.string().optional(),gitCommitMessage:E.string().optional(),gitCommitAuthorName:E.string().optional(),githubRepository:E.string().optional(),gitlabProjectPath:E.string().optional(),pipelineId:E.string().optional(),cliVersion:E.string().optional()}),_j=E.object({id:E.string()}),dg=E.object({status:E.nativeEnum(ae),updatedAt:E.coerce.date().optional(),finishedAt:E.coerce.date().optional()}),pg=E.object({stepsSnapshot:E.array(E.record(E.unknown())).optional(),runGroupId:E.string().optional(),testId:E.string(),testName:E.string(),resolvedBaseUrl:E.string().optional(),environmentName:E.string().optional(),labels:E.array(E.string()).optional(),cliVersion:E.string().optional(),trigger:E.nativeEnum(qt),schemaVersion:E.string().optional(),section:E.nativeEnum(Ss).optional()}),Dj=E.object({id:E.string()}),_R=$c.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),ug=_R.array(),mg=$c.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),Fj=E.object({id:E.string()}),hg=E.object({status:E.nativeEnum(ae),finishedAt:E.coerce.date().optional(),schemaVersion:E.string().optional().default("1.0.19"),results:E.record(E.string(),E.unknown()).array().optional(),beforeResults:E.record(E.string(),E.unknown()).array().optional(),afterResults:E.record(E.string(),E.unknown()).array().optional()}),Uj=E.object({screenshot:E.string()}),gg=E.object({key:E.string()}),fg=E.object({orgId:E.string(),userId:E.string()}),Sg=E.array(Um),Bj=E.record(E.string(),E.union([E.string(),E.boolean()])),zj=E.object({paths:E.string().array(),env:E.string().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional()}),yg=E.object({suiteRunIds:E.string().array(),runGroupIds:E.string().array()}),Hj=E.object({suiteRunIds:E.string().array()}),jj=Qm.array(),$j=E.object({runGroupIds:E.string().array()}),na=E.object({uploadUrl:E.string()}),Gj=Yt.merge(ah),Wj=Yt.merge(lh),Vj=Yt.merge(sh),DR=E.object({testId:E.string().optional().default(""),testName:E.string().optional().default(""),suiteId:E.string().optional().default(""),suiteName:E.string().optional().default(""),creditsUsed:E.number().optional(),usedBy:E.string().optional()}),FR=E.object({transactionId:E.string(),timestamp:E.string(),event:E.nativeEnum(Xi),properties:DR}),qj=FR.array(),bg=jm.omit({steps:!0}).extend({steps:E.array(E.record(E.string(),E.unknown())).describe("unparsed ResolvedStep[]")}),Kj=E.object({limit:E.number().max(10).optional(),afterTime:E.number().optional()}),wg=Km.array(),Yj=E.object({applied:E.boolean().optional(),appliedAt:E.coerce.date().optional()}),Jj=Yt.extend({chunks:Wc.array(),description:E.string().describe("Input to pass to AI"),type:E.union([E.literal("locator"),E.literal("assertion"),E.literal("ai-action")]),softTokenLimit:E.number(),hardTokenLimit:E.number()}),vg=na.extend({id:E.string()}),Xj=E.object({runGroupId:E.string().uuid().optional()}),xg=E.object({runGroupId:E.string().uuid()});import{z as Pe}from"zod";var Tg=Pe.object({orgId:Pe.string(),cacheKeys:Pe.string().array()}),e$=Pe.object({keyParams:Tg,clientMetadata:Pe.string(),lockAcquisitionTimeoutMs:Pe.number().optional()}),Eg=Pe.object({acquired:Pe.boolean(),acquiredByMetadata:Pe.string(),keyPrefix:Pe.string()}),t$=Pe.object({keyPrefix:Pe.string(),result:Pe.string(),ttlMs:Pe.number()}),n$=Pe.union([Pe.object({keyPrefix:Pe.string()}),Tg]),UR=Pe.object({remainingTtlMs:Pe.number(),value:Pe.string().nullish()}),r$=Pe.object({results:Pe.record(Pe.string(),UR),activeLocks:Pe.string().array()}),Cg=0,Rg=5*60*1e3;import{z as pn}from"zod";var Ag="test",Ig="module",Mt=(t=>(t.TEST=`${Ag}.yaml`,t.MODULE=`${Ig}.yaml`,t))(Mt||{}),Ae=(t=>(t.TEST=`momentic/${Ag}`,t.MODULE=`momentic/${Ig}`,t))(Ae||{}),d$=vt.merge(Lr),ld=At.extend({steps:pn.array(pn.record(pn.string(),pn.unknown())),schemaVersion:pn.string()}),p$=ld.extend({fileType:pn.literal(Ae.MODULE)}),u$=pn.object({test:pn.string().describe("YAML for the test, including metadata and steps"),modules:pn.record(pn.string(),pn.string()).describe("Map of module name to YAML for the module")});import{z as at}from"zod";var BR=at.object({version:at.string(),json:at.record(at.unknown()),hash:at.string()}),Pg=at.record(at.unknown()),f$=at.object({newSvgs:at.array(BR),metadata:Pg.optional()}),zR=at.object({version:at.string(),json:at.record(at.unknown()).nullish(),hash:at.string(),description:at.string().nullish(),metadata:Pg.nullish()}),Lg=at.record(at.string().describe("icon hash"),zR);import{validator as v$}from"@exodus/schemasafe";var Og=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as N$}from"zod";import{z as Ye}from"zod";var D$=Ye.object({repositoriesIndexed:Ye.boolean(),indexingInProgress:Ye.boolean(),indexesOutdated:Ye.boolean()}),Mg=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(Mg||{}),Ng=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(Ng||{}),F$=Ye.object({name:Ye.string(),status:Ye.nativeEnum(Mg),conclusion:Ye.nativeEnum(Ng).nullable()}),cd=Ye.object({sha:Ye.string(),message:Ye.string(),author:Ye.object({name:Ye.string().optional(),email:Ye.string().optional(),date:Ye.coerce.date().optional()}),committer:Ye.object({name:Ye.string().optional(),email:Ye.string().optional(),date:Ye.coerce.date().optional()})});import{z as ke}from"zod";var dd=ke.object({assertion:ke.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),HR=ke.object({instruction:ke.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:dd.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),kg=HR.extend({subSteps:ke.lazy(()=>kg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),_g=ke.object({name:ke.string().describe("Short name describing the test plan"),description:ke.string().nullish().transform(n=>n??void 0).describe("Longer form description of the high level goal of the test plan")}),Dg=_g.extend({id:ke.string(),createdAt:ke.coerce.date(),updatedAt:ke.coerce.date(),updatedBy:ke.string(),createdBy:ke.string(),test:ke.object({id:ke.string(),name:ke.string()}).nullish().transform(n=>n??void 0)}),H$=Dg.extend({testGenRuns:ke.tuple([]).or(ke.tuple([ke.object({id:ke.string(),startedAt:ke.coerce.date(),status:ke.nativeEnum(ae)})]))}),Fg=ke.object({preConditions:dd.array().nullish().transform(n=>n??[]),postConditions:dd.array().nullish().transform(n=>n??[]),steps:kg.array().nullish().transform(n=>n??[])}),j$=Dg.extend({plan:Fg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),jR=_g.extend({plan:Fg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),$$=jR.array().nullish().transform(n=>n??[]);var K$=90*24*60*60*1e3,Y$=14*24*60*60*1e3,J$=7*24*60*60*1e3;import{z as Le}from"zod";var $R=Le.object({step:Ie,status:Le.nativeEnum(Ce),startedAt:Le.coerce.date(),finishedAt:Le.coerce.date().optional(),healMetadata:Le.object({healType:Le.nativeEnum($i).or(Le.literal("AI")),healedAt:Le.coerce.date()}).optional(),beforeSnapshotId:Le.string().uuid().optional(),afterSnapshotId:Le.string().uuid().optional(),message:Le.string().optional()}),rG=$R.extend({finishedAt:Le.coerce.date().optional().transform(n=>n??new Date)}),GR=Le.object({startedAt:Le.coerce.date()}).merge(hg).merge(ds),oG=GR.extend({finishedAt:Le.coerce.date().optional().transform(n=>n??new Date)}),WR=mg.merge(pg).extend({status:Le.nativeEnum(ae),startedAt:Le.coerce.date(),attempts:Le.number()}),iG=WR.extend({finishedAt:Le.coerce.date().optional().transform(n=>n??new Date)}),VR=cg.merge(dg).extend({id:Le.string().uuid().optional(),startedAt:Le.coerce.date(),cliVersion:Le.string()}),ra=VR.extend({updatedAt:Le.coerce.date().optional().transform(n=>n??new Date),finishedAt:Le.coerce.date().optional().transform(n=>n??new Date)});import qR from"semver";import{z as KR}from"zod";var cG=KR.string().refine(n=>qR.valid(n),{message:"must be a valid semver string"});var Ls=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};function pd(n){let e={parentChain:[]};return Os(n,e),e}function Os(n,e){let{onPresetAction:t,onSimpleStepContainer:r,onConditional:o,earlyStop:i}=n;for(let a of n.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 l of a.blocks)if(t(l.assertion,e)&&i||Os({...n,steps:l.steps},e)&&i)return!0;if(Os({...n,steps:a.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"IFRAME":case"SECTION":case"AI_ACTION":if(r?.(a,e)&&i)return!0;if(a.steps){if(e.parentChain.push(a),Os({...n,steps:a.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(r?.(a,e)&&i)return!0;break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(a)}}function Ug(n,e,t,r){let o=Array.from(e),i=Array.from(r);for(let s=0;s<o.length;s++){if(o[s]!==i[s])return!1;i.shift()}return!!YR([n],t,i).result}function YR(n,e,t=[]){let r,o=[],i=(a,s)=>{let l=JSON.stringify(s.parentChain.map(d=>d.id)),c=t.length===0?!0:JSON.stringify(t)===l;return a.id===e&&c?(r=a,o=s.parentChain,!0):!1};return pd({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function Bg(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?Ms(r,e):typeof r=="object"&&Bg(r,e))}}function Ms(n,e){for(let t of n)t&&(Array.isArray(t)?Ms(t,e):typeof t=="object"&&Bg(t,e))}import{cloneDeep as zg}from"lodash-es";import{v4 as ud}from"uuid";async function Zt(n){let e=new Map,t=new Set,r=zg(n.stepLists.steps),o=await Hr({...n,steps:r,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),i={stepsToSave:{steps:o.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates};for(let a of["beforeSteps","afterSteps"]){let s=zg(n.stepLists[a]);if(!s)continue;let l=await Hr({...n,steps:s,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});i.cachesToSave.push(...l.cachesToSave),i.moduleUpdates.push(...l.moduleUpdates),i.stepsToSave[a]=l.stepsToSave}return i}async function Hr({steps:n,...e}){let{seenModules:t,cacheCreationParams:r,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:l}=e,c={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let d of n)switch(delete d.index,delete d.aiSuggested,d.id=l?ud():d.id,d.type){case"PRESET_ACTION":{let u=d.command;u.id=l?ud():u.id,jg(u),"cache"in u&&u.cache&&(r&&(c.cachesToSave=c.cachesToSave.concat(Hg({id:u.id,orgId:r.orgId,testId:r.testId,value:Ar.parse(u),moduleIdParents:o,moduleStepParents:i,skipIntermediateEntries:e.skipCacheIntermediateEntries}))),delete u.cache),u.thoughts&&delete u.thoughts,c.stepsToSave.push({...d,command:u});break}case"RESOLVED_MODULE":{let u=l?ud():d.id,m=d.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(d),a.set(d.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await Hr({...e,steps:d.steps,cacheCreationParams:r?{...r}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,u],moduleIdParents:[...o,m],skipCacheIntermediateEntries:l});c.moduleUpdates=c.moduleUpdates.concat(f),c.cachesToSave=c.cachesToSave.concat(h),t.has(m)||(t.add(m),c.moduleUpdates.push({...At.parse(d),steps:be.array().parse(g),moduleId:m}));let S={type:"MODULE",moduleId:m,inputs:d.inputs,id:u,skipped:d.skipped,cacheConfig:d.cacheConfig,envKey:d.envKey};c.stepsToSave.push(S);break}case"AI_ACTION":{if(!d.steps){c.stepsToSave.push(d);break}let{stepsToSave:u,cachesToSave:m}=await Hr({...e,steps:d.steps});try{d.steps=Rt.array().parse(u)}catch(h){throw new Error(`Only preset actions are allowed in AI actions at the moment: ${h}`)}c.stepsToSave.push(d),c.cachesToSave=c.cachesToSave.concat(m);break}case"AI_ACTION_DYNAMIC":{c.stepsToSave.push(d);break}case"CONDITIONAL":{let u=[];for(let h of d.blocks){let{stepsToSave:g,cachesToSave:f,moduleUpdates:S}=await Hr({...e,steps:h.steps});u.push({...h,steps:g}),c.cachesToSave=c.cachesToSave.concat(f),c.moduleUpdates=c.moduleUpdates.concat(S)}let m={...d,elseSteps:void 0,blocks:u};if(d.elseSteps){let{stepsToSave:h,cachesToSave:g,moduleUpdates:f}=await Hr({...e,steps:d.elseSteps});m.elseSteps=h,c.cachesToSave=c.cachesToSave.concat(g),c.moduleUpdates=c.moduleUpdates.concat(f)}c.stepsToSave.push(m);break}case"IFRAME":case"SECTION":{let{stepsToSave:u,cachesToSave:m,moduleUpdates:h}=await Hr({...e,steps:d.steps}),g={...d,steps:u};c.moduleUpdates=c.moduleUpdates.concat(h),c.stepsToSave.push(g),c.cachesToSave=c.cachesToSave.concat(m);break}default:return(u=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(d)}return c}function Uo({steps:n,topLevel:e=!0,...t}){let{stepCacheEntries:r,logger:o,keyPrefix:i}=t,a=[],s=[],l=[],c=0,d=(u,m)=>{try{let h=Ar.parse(m.value);if(h.type!==u.type){o.warn({parsedCacheEntry:h,command:u},"Not using step cache due to type mismatch"),s.push(m.key);return}u.cache=h.cache,a.push(m.key),l.push(m.uniqueKey)}catch(h){s.push(m.key),o.error({err:h,cacheEntry:m},"Not using step cache due to parsing error")}},p=(u,m)=>{let h=XR(u.id,m),g=h.find(f=>!!r[f]);g?d(u,r[g]):s.push(h[0])};for(let u of n)switch(u.type){case"RESOLVED_MODULE":{c+=u.steps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Uo({...t,steps:u.steps,keyPrefix:i?`${i}:${u.id}`:u.id,topLevel:!1});a.push(...h),s.push(...g),l.push(...f);break}case"IFRAME":case"SECTION":case"AI_ACTION":{if(c+=u.steps?.length??0,!u.steps?.length)break;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Uo({...t,steps:u.steps,topLevel:!1});a.push(...h),s.push(...g),l.push(...f);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!uc.includes(u.command.type)||(u.command.type==="TYPE"||u.command.type==="MOUSE_DRAG"||u.command.type==="VISUAL_DIFF"||u.command.type==="SCROLL_DOWN"||u.command.type==="SCROLL_UP"||u.command.type==="SCROLL_LEFT"||u.command.type==="SCROLL_RIGHT")&&!u.command.target||u.command.type==="ELEMENT_CHECK"&&u.command.assertion.type==="ELEMENT_EXISTENCE"&&u.command.assertion.negated||"cache"in u.command&&u.command.cache)continue;c++,p(u.command,i);break}case"CONDITIONAL":{for(let h of u.blocks){c++,p(h.assertion.command,i),c+=h.steps.length;let{cacheKeysHit:g,cacheKeysMissed:f,uniqueKeysHit:S}=Uo({...t,steps:h.steps,topLevel:!1});a.push(...g),s.push(...f),l.push(...S)}if(u.elseSteps){c+=u.elseSteps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Uo({...t,steps:u.elseSteps,topLevel:!1});a.push(...h),s.push(...g),l.push(...f)}break}default:return(h=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(u)}return e&&c&&s.length>0&&o.warn({totalSteps:c,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:l,cacheEntries:r.length},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:l}}function $g(n,e){return e?`${e}:${n}`:n}function XR(n,e){let t=[],r=e?.split(":")??[];for(let o=r.length;o>=0;o--){let i=[...r.slice(o),n];t.push(i.join(":"))}return t.reverse(),t}function Hg(n){let{moduleStepParents:e=[],moduleIdParents:t=[]}=n;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
|
|
15
|
+
${JSON.stringify(t)}`);let r=[];if(!n.skipIntermediateEntries)for(let o=e.length;o>0;o--){let i=t[o-1],a=e.slice(o,e.length).join(":");r.push({key:$g(n.id,a),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:$g(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function jg(n){switch(n.type){case"DRAG":{if(n.fromTarget.type==="coordinates"||n.toTarget.type==="coordinates"||!n.fromTarget?.a11yData||!n.toTarget?.a11yData)return;n.cache={fromTarget:n.fromTarget.a11yData,toTarget:n.toTarget.a11yData},delete n.fromTarget.a11yData,delete n.toTarget.a11yData;return}case"MOUSE_DRAG":case"HOVER":case"SCROLL_UP":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SELECT_OPTION":case"TYPE":case"VISUAL_DIFF":case"CLICK":case"FOCUS":case"ELEMENT_CHECK":case"BLUR":{if(n.target?.type==="coordinates"||!n.target?.a11yData)return;n.cache={target:n.target.a11yData},delete n.target.a11yData;return}default:return}}function Gg(n){let e=new Set;return Ms(n,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let r=t.moduleId;typeof r=="string"&&!e.has(r)&&e.add(r)}}),e}function Wg(n,e,t){e.length&&(n.type==="DRAG"?e.length!==2||!e.every(r=>r.cache)?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):n.fromTarget.type==="description"&&n.toTarget.type==="description"&&(n.cache={fromTarget:e[0].cache,toTarget:e[1].cache}):e.length!==1||!e[0]?.cache?t.warn({newTargets:e,cmd:n},"New targets for step are incorrect"):"target"in n&&n.target&&n.target.type==="description"&&(n.cache={target:e[0].cache}))}async function Ns({logger:n,cacheStorage:e,orgId:t,testId:r,originalSteps:o,updatedSteps:i}){let a=JR(o,i);if(Object.keys(a).length>0){n.info({changes:a},"Updating steps caches post-run success");try{let{cachesToSave:s}=await Zt({stepLists:i,cacheCreationParams:{testId:r,orgId:t}});await e.saveStepCacheEntries(s,r,n)}catch(s){n.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}function ze(n,e,t=!1){return n.length<e?n:n.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var lr={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},cr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},md={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},hd={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function ZR(n){switch(n.type){case"ELEMENT_CONTENT":return`${n.negated?cr[n.operation]:lr[n.operation]} '${n.value}'`;case"ELEMENT_ATTRIBUTE":{let t=n.negated?cr[n.operation]:lr[n.operation];return n.operation==="EXISTS"?`attribute '${n.attr}' ${t}`:`attribute '${n.attr}' ${t} '${n.value}'`}case"ELEMENT_EXISTENCE":return n.negated?hd[n.condition]:md[n.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var uV={CONTENT:"The page"};function QR(n){switch(n.type){case"VALUE":return`the option with value ${n.value}`;case"LABEL":return`the option with label ${n.label}`;case"INDEX":return`the option at index ${n.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function gd(n){switch(n.type){case"SUBSTRING":return`match substring '${n.url}'`;case"REGEX":return`match regex '${n.regex}'`;case"GLOB":return`match glob '${n.glob}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function eA(n){switch(n.type){case"CONTENT":return`${n.negated?cr.CONTAINS:lr.CONTAINS} '${n.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.type)}}function jr(n){switch(n.type){case"SUCCESS":return n.condition?.assertion?`Check success condition: ${n.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${n.goal}`;case"NAVIGATE":return`Go to URL: ${ze(n.url,30)}`;case"DIALOG":return`Automatically ${n.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 ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${pt(n.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${pt(n.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${pt(n.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${pt(n.target)}`:""}`;case"WAIT":return`Wait for ${n.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(n.target?.type==="coordinates")return`Click at coordinates: ${pt(n.target)}`;let t="";return n.target?.elementDescriptor.length?t=` on element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` on element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Click${t}`}case"FOCUS":return`Focus ${pt(n.target)}`;case"BLUR":return`Focus ${pt(n.target)}`;case"DRAG":return`Drag ${pt(n.fromTarget)} onto ${pt(n.toTarget)}`;case"MOUSE_DRAG":return n.target?.type==="description"&&n.target.elementDescriptor?`Click and drag ${pt(n.target)} by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`:`Click and drag mouse by ${n.deltaX}px horizontally, ${n.deltaY}px vertically`;case"TYPE":{let t="";return n.target?.type==="coordinates"?t=` in element at coordinates: ${pt(n.target)}`:n.target?.elementDescriptor.length?t=` in element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` in element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Type '${n.value}'${t||""}`}case"HOVER":{let t="";return n.target.type==="coordinates"?t=` over coordinates: ${pt(n.target)}`:n.target.elementDescriptor.length>0?t=` over element: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` over element: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Hover${t}`}case"PRESS":return`Press ${n.value}`;case"SELECT_OPTION":{let t="",r=QR(n.choice);return n.target.type==="coordinates"?t=` from element at coordinates: ${pt(n.target)}`:n.target.elementDescriptor.length>0?t=` from: '${n.target.elementDescriptor}'`:n.cache?.target.nodeOnlySerializedHtml&&(t=` from: '${n.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${r}'${t}`}case"TAB":switch(n.action.type){case"SUBSTRING":return`Switch to tab with substring: ${n.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${n.action.pattern}`;case"INDEX":return`Switch to tab at index: ${n.action.index}`;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${n.url}`;case"REQUEST":return`Send ${n.method} request to ${n.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${n.url}`;case"COOKIE":return`Set cookie: ${n.value}`;case"LOCAL_STORAGE":return`Set local storage: ${n.key}: ${n.value}`;case"JAVASCRIPT":return`Run JavaScript: ${ze(n.code,30)}`;case"AI_ASSERTION":return`Assertion: '${n.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${n.target?`for element: ${pt(n.target)}`:"for entire page"}`;case"FILE_UPLOAD":return n.fileSource.type==="URL"?`Upload file: ${n.fileSource.url}`:`Upload file: ${n.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${pt(n.target)} ${ZR(n.assertion)}`;case"PAGE_CHECK":return`Check the page ${eA(n.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${gd(n.matcher)}`;case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return n.pattern?`Register a listener for network requests that match ${n.pattern}`:"Register a listener for network requests";case"AWAIT_LISTENER":return n.key?`Wait for the listener ${n.key} to resolve`:"Wait for a listener to resolve";case"RECORD_REQUESTS":return n.pattern?`Start recording requests that match ${n.pattern}`:"Start recording network requests";case"GET_RECORDED_REQUESTS":return n.key?`Get the requests that were recorded for ${n.key}`:"Get the requests that were recorded";case"SET_HEADER":return n.name?n.urlPattern?`Set a ${n.name} header for requests that match ${n.urlPattern}`:`Set a ${n.name} header for all requests`:"Set a header";default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function Vg(n){let e=[];for(let t of n){t.sort((a,s)=>a.timestamp-s.timestamp);let r=[],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)`:r.push(o)),o=a,i=1);o&&r.push(o),e.push(r)}return e}import{cloneDeep as tA}from"lodash-es";import{cloneDeep as fV,unset as SV}from"lodash-es";function un(n){switch(n.type){case"AI_ACTION":return`AI action: ${ze(n.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${ze(n.text,100)}`;case"PRESET_ACTION":return jr(n.command);case"MODULE":return`Module: ${n.id}`;case"RESOLVED_MODULE":return`Module: ${n.name}`;case"CONDITIONAL":return"Conditional step";case"IFRAME":return"Frame step";case"SECTION":return`Section${n.description?`with goal: ${ze(n.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(n)}}var qg=1e3,Kg=3e6,nA="[FAILED]";async function Yg(n,e,t,r){if(t)if(t.startsWith("http")){let i=await(await fetch(t)).arrayBuffer();return`data:image/jpeg;base64,${Buffer.from(i).toString("base64")}`}else return t.startsWith("data:")?t:`data:image/jpeg;base64,${t}`;else if(r){let o=await e.getScreenshot(n,r);if(o)return`data:image/jpeg;base64,${Buffer.from(o).toString("base64")}`}}async function ks(n,e,t,{numScreenshots:r=1,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:a=!1,recursive:s=!0}){let l=[],c;for(let d=0;d<t.length;d++){let p=t[d],u=s?$r(p):un(p),m={description:`Step ${d}: ${u}`,startedAt:p.startedAt,finishedAt:p.finishedAt,beforeUrl:p.beforeUrl,afterUrl:p.afterUrl,message:p.message!=="Successfully executed preset action."?p.message:void 0,index:o?d:void 0};if(p.status==="FAILED"){m.description=`${nA} ${m.description}`,o&&(c=d);try{let h=Xm.array().parse(p.details);for(let g of h)"pageState"in g&&a&&(m.pageState=g.pageState)}catch{}}r>0&&d>=t.length-r&&(m.afterScreenshot=await Yg(n,e,p.afterScreenshot,p.afterSnapshot),i&&(m.beforeScreenshot=await Yg(n,e,p.beforeScreenshot,p.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function $r(n){let e=un(n);switch(n.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
|
|
16
16
|
`;for(let t=0;t<n.results.length;t++)e+=Je(`Sub-step ${t} in AI action:
|
|
17
|
-
`,2),e+=`${Je(
|
|
17
|
+
`,2),e+=`${Je($r(n.results[t]),2)}
|
|
18
18
|
`,e+=Je(`${"=".repeat(10)}
|
|
19
19
|
`,2);return e;case"PRESET_ACTION":return e;case"MODULE":{e+=`
|
|
20
20
|
`;for(let t=0;t<n.results.length;t++)e+=Je(`Sub-step ${t} in module:
|
|
21
|
-
`,2),e+=`${Je(
|
|
21
|
+
`,2),e+=`${Je($r(n.results[t]),2)}
|
|
22
22
|
`,e+=Je(`${"=".repeat(10)}
|
|
23
23
|
`,2);return e}case"CONDITIONAL":{e+=`
|
|
24
24
|
`,n.assertion&&(e+=Je(`Conditional check:
|
|
25
|
-
`,2),e+=`${Je(
|
|
25
|
+
`,2),e+=`${Je($r(n.assertion),2)}
|
|
26
26
|
`,e+=Je(`${"=".repeat(10)}
|
|
27
27
|
`,2)),e+=Je(`${n.assertion?"Branch steps":"Else branch steps"}
|
|
28
28
|
`,2);for(let t=0;t<n.results.length;t++)e+=Je(`Sub-step ${t} in conditional branch:
|
|
29
|
-
`,2),e+=`${Je(
|
|
29
|
+
`,2),e+=`${Je($r(n.results[t]),2)}
|
|
30
30
|
`,e+=Je(`${"=".repeat(10)}
|
|
31
31
|
`,2);return e}case"IFRAME":{e+=`
|
|
32
32
|
`;for(let t=0;t<n.results.length;t++)e+=Je(`Sub-step ${t} in frame step:
|
|
33
|
-
`,2),e+=`${Je(
|
|
33
|
+
`,2),e+=`${Je($r(n.results[t]),2)}
|
|
34
34
|
`,e+=Je(`${"=".repeat(10)}
|
|
35
35
|
`,2);return e}case"SECTION":{e+=`
|
|
36
36
|
`;for(let t=0;t<n.results.length;t++)e+=Je(`Sub-step ${t} in section:
|
|
37
|
-
`,2),e+=`${Je(
|
|
37
|
+
`,2),e+=`${Je($r(n.results[t]),2)}
|
|
38
38
|
`,e+=Je(`${"=".repeat(10)}
|
|
39
39
|
`,2);return e}default:return(r=>{throw new Error("You missed a case in the switch above")})(n)}}function Je(n,e){return n.split(`
|
|
40
40
|
`).map(t=>" ".repeat(e)+t).join(`
|
|
41
|
-
`)}function zg(n,e){try{if(!n)return n;if(typeof n=="string")return ze(n,3e4);if(typeof n=="object"){let{jsonString:t}=Co(JSON.stringify(n,(r,o)=>e?.includes(r)||typeof o=="string"&&o.length>3e4?"REDACTED":o),2e4);return JSON.parse(t)}return n}catch{return n}}function pd(n,e){for(let t=0;t<n.length;t++){let r=n[t];try{if(r.data){let{jsonString:o}=Co(JSON.stringify(r.data),1e3);r.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),r.data=`Result output data could not be serialized: ${o}`}switch(r.details&&(r.details=void 0),r.type){case"PRESET_ACTION":Ug(r);break;case"CONDITIONAL":r.assertion&&Ug(r.assertion),pd(r.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"IFRAME":case"MODULE":case"SECTION":{pd(r.results,e);break}default:return(i=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}}function Ug(n){let e=n.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Bg(n,e){let t=JSON.stringify(n),r=t.replaceAll("\\u0000","");if(t.length!==r.length){let o=t.indexOf("\\u0000");e.warn({input:t.slice(Math.max(0,o-500),Math.min(t.length,o+500))},"Database content violation: stripped unicode character from input")}return r}function Ps(n,e){let t=HR(n);if(pd(t,e),t.length>_g)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,_g);let r=Bg(t,e);if(r.length>Dg)for(e.error({serializedLength:r.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");r.length>Dg;)t.pop(),r=Bg(t,e);try{return At.array().parse(JSON.parse(r))}catch(o){throw e.error({serialized:r,err:o},"Could not parse serialized results into JSON structure after processing"),o}}import{cloneDeep as gV}from"lodash-es";var jR=/^(?!.*\S+\s+\S+).*$/,GR=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,WR=/style="([^"]*)/g,VR=/data-[\w-]+/g,qR=n=>{switch(n.type){case"AI_ASSERTION":return{type:n.type,assertion:n.assertion};case"DRAG":if(n.fromTarget.type==="description")return{type:n.type,description:n.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(n.target?.type==="description")return{type:n.type,description:n.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function Hg(n){let e=qR(n),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:jR.test(t)&&GR.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:WR.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"}:VR.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 $g(n,e){if(!(!n.envs||!n.envs.length)){for(let t of n.envs){let r=t;e in t&&(r[e]&&(t.default=!0),delete r.defaultOnCloud,delete r.defaultOnLocal)}n.envs.some(t=>t.default)||(n.envs[0].default=!0)}}import{cloneDeep as gf}from"lodash-es";import ZR from"diff-lines";import Os,{gte as QR}from"semver";var jg={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async n=>(n=n.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),n=n.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),n)};var Gg={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 n=>n.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,r=t[t.length-1];return r&&r.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var KR=["target","fromTarget","toTarget"];function Wg(n){for(let e of KR){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var Vg={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":return Wg(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])Wg(r);return e}default:return e}})};import{v4 as YR}from"uuid";var qg={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=YR()),e;default:return e}})};import{v4 as Kg}from"uuid";var Yg={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??Kg(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??Kg()}})),delete e.commands),e;default:return e}})};var Jg={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 n=>n.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 JR}from"uuid";var Xg={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 n=>n.map(e=>("id"in e&&typeof e.id=="string"||(e.id=JR()),e))};import{v4 as Zg}from"uuid";var Qg={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 n=>n.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=Zg())}return e.id=Zg(),e})};var ef={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 n=>n.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 XR}from"uuid";var tf={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=XR()),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 nf={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.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 rf={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&of(t),e})};function of(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){of(n[e]);return}if(typeof n[e]!="string")return;let t=n[e];e==="code"?n[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(n[e]=t.replace(/inputs\./g,"env."))})}var af={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.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 sf={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async n=>n.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 lf={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 n=>n.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 cf={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 n=>n.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 df={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async n=>n.map(e=>{if(e.type!=="AI_ASSERTION")return e;let r={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...r};return delete o.text,o}),stopOnFailure:!0};var Ls=new Set(["CLICK","TYPE","SELECT_OPTION"]),pf={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type,o=t?.elementDescriptor;return(o!==void 0||Ls.has(r))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,l=a?.type;(s!==void 0||Ls.has(l))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,l=s?.elementDescriptor,c=s?.type;(l!==void 0||Ls.has(c))&&(s.target={elementDescriptor:l??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(p=>{let u=p?.elementDescriptor,m=p?.type;(u!==void 0||Ls.has(m))&&(p.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var uf={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(r=>{if(r&&typeof r=="object"){let o=r;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var mf={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type;return r?.startsWith("PRESET_")&&(t.type=r.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(c=>{let d=c.type;d?.startsWith("PRESET_")&&(c.type=d.slice(7))})}),e}),stopOnFailure:!0};var $r=[df,uf,mf,pf,jg,Gg,Vg,qg,Yg,Jg,Xg,Qg,ef,tf,nf,rf,af,sf,lf,cf];if(_e!==$r[$r.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");$r.forEach((n,e)=>{if(!Os.valid(n.toVersion)||!Os.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Os.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if($r[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function eA(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var ta=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:a}=n,s=$r.findIndex(d=>Os.gt(d.toVersion,i));if(s===-1)return{steps:o,newVersion:i};let l=i;for(let d=s;d<$r.length;d++){if(r&&QR(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let p=$r[d],u={id:a,migration:p.name,toVersion:p.toVersion};try{o=await hf(o,p),l=p.toVersion}catch(m){throw t.error({err:m,...u},"Migration failed"),new Error(`Step migration ${p.name} failed: ${m}`)}}let c=ZR(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return c.trim()&&t.debug({diffs:c,id:a},"Migration diffs"),{newVersion:l,steps:o}};async function hf(n,e){let t=await e.execute(n);for(let r of t)for(let o of Object.keys(r)){if(!e.recursiveKeys.has(o))continue;let i=r[o];!i||!Array.isArray(i)||eA(i)&&(r[o]=await hf(i,e))}return t}async function ff({rawSteps:n,metadata:e,logger:t,callbacks:r}){$g(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await Ms({rawSteps:n.steps,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o}),s={...e,steps:i,schemaVersion:a};for(let l of["beforeSteps","afterSteps"]){let c=n[l];if(!c)continue;let{resolvedSteps:d}=await Ms({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});s[l]=d}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function jr(n,e,t){let{newVersion:r,steps:o}=await ta({metadata:n,steps:e,logger:t});try{return{steps:ye.array().parse(o),newVersion:r}}catch(i){throw t.error({type:"zod",err:i,newVersion:r,id:n.id,steps:o},"Failed to parse test steps while migrating test"),new ws(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function Ms({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await jr(e,n,t),s=[];for(let l of a)s.push(await na({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function na({step:n,callbacks:e,logger:t,resolvedModuleCache:r}){switch(n.type){case"AI_ACTION":return n;case"AI_ACTION_DYNAMIC":return n;case"PRESET_ACTION":return n;case"MODULE":{let l=n.moduleId,c=r[l];if(c)return{...gf(c),...n,type:"RESOLVED_MODULE"};let d=await e.onFetchModule({id:l,logger:t});if(!d)throw new Error(`Could not find module with id ${l}`);let{newVersion:p,steps:u}=await ta({metadata:{id:l,schemaVersion:d.schemaVersion},steps:d.steps,logger:t}),m;try{m=ye.array().parse(u)}catch(f){throw t.error({type:"zod",err:f,steps:u,newVersion:p,id:l},"Module failed to parse"),f}let h;try{h=await Promise.all(m.map(f=>na({step:f,callbacks:e,logger:t,resolvedModuleCache:r})))}catch(f){throw t.error({err:f,...n},`Failed to recursively resolve module '${d.name}': ${f}`),f}let g={...d,steps:h};return r[l]=gf(g),{...g,...n,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let l of n.blocks){let c=[];for(let d of l.steps)c.push(await na({step:d,callbacks:e,logger:t,resolvedModuleCache:r}));o.push({...l,steps:c})}let i;if(n.elseSteps){i=[];for(let l of n.elseSteps)i.push(await na({step:l,callbacks:e,logger:t,resolvedModuleCache:r}))}return{...n,blocks:o,elseSteps:i};case"SECTION":case"IFRAME":let a=[];for(let l of n.steps)a.push(await na({step:l,callbacks:e,logger:t,resolvedModuleCache:r}));return{...n,steps:a};default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function tA(n){return typeof n=="object"&&n!==null}function Hn(n){if(Array.isArray(n))return n.map(Hn);if(tA(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=Hn(r))}),e}return n}import{cloneDeep as nA}from"lodash-es";import{stringify as Sf}from"yaml";async function yf({test:n,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let r={id:n.id,name:n.name,description:n.description,baseUrl:n.baseUrl,schemaVersion:n.schemaVersion,advanced:n.advanced,retries:n.retries,envs:n.envs,disabled:n.disabled,labels:n.labels},o={},i=await rA({originalStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:Ce.TEST,...r,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:Sf(a),modules:o}}async function rA({originalStepLists:n,modules:e,processedModuleNames:t,createNewCacheIds:r}){let o=nA(n);Object.values(o).forEach(s=>{oA(s??[])});let{stepsToSave:i,moduleUpdates:a}=await Jt({stepLists:o,createNewCacheIds:r});for(let s of a)t.has(s.name)||(e[s.name]=iA(s),t.add(s.name));return i}function oA(n){ad({steps:n,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 iA(n){let e=Ct.parse(n),t={fileType:Ce.MODULE,...e,schemaVersion:_e,steps:n.steps};return Sf(t)}async function te(n,e){return new Promise((t,r)=>{if(e?.aborted){r(e.reason);return}e?.addEventListener("abort",i);let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n);function i(){clearTimeout(o),e?.removeEventListener("abort",i),r(e?.reason)}})}async function ra({promiseGenerator:n,signal:e,codePath:t,logger:r}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}r?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,l)=>{function c(){clearInterval(a),e?.removeEventListener("abort",c),l(e?.reason)}if(e?.aborted){l(e?.reason),clearInterval(a);return}e?.addEventListener("abort",c),(async()=>{try{s(await n())}catch(d){l(d)}finally{clearInterval(a),e?.removeEventListener("abort",c)}})()})}async function Gr({promiseGenerator:n,timeoutMs:e,codePath:t,logger:r,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},l=setTimeout(()=>{i||a.abort()},e);o?.addEventListener("abort",s);try{return await ra({promiseGenerator:n,signal:a.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(l)}}function Ns(n){let e=[];for(let t of n)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let r={...t,type:"MODULE"};e.push(Bn.parse(r));break}case"IFRAME":case"SECTION":{let r={...t,steps:Ns(t.steps)};e.push(ye.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Ns(o.steps)})),elseSteps:t.elseSteps?Ns(t.elseSteps):void 0};e.push(Ar.parse(r));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 ks(n){return Ns([n])[0]}import aA from"picomatch";var bf=(n,e,t)=>{t?.caseInsensitive&&(n=n.toLowerCase());let r;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;r=n.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;r=n===e.glob||aA(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r},_s=(n,e)=>{try{let{hostname:t,pathname:r}=new URL(n),{hostname:o,pathname:i}=new URL(e);return t!==o||r!==i}catch{return!1}},Fo=n=>{try{return new URL(n),!0}catch{return!1}},wf=n=>!n.toLowerCase().startsWith("http"),Uo=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function Wr(n,e){try{return!!new URL(n).origin.trim()}catch(t){return e?.error({url:n,err:t},"Invalid URL in check"),!1}}import Bo from"yaml";import{z as Ef}from"zod";import{execSync as sA}from"child_process";function Vr(n,e){let t=e.hooks?.postSave;if(!t)return;let r;t.includes("$1")?r=t.replaceAll("$1",n):r=`${t} ${n}`,y.debug({postSaveCommand:r},"Executing post-save hook command");try{sA(r,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")}}import{diff as vf}from"deep-object-diff";import lr from"fs";import{cloneDeep as lA}from"lodash-es";import ud from"path";import{v4 as cA}from"uuid";import oa from"yaml";function qr({content:n,schemaVersion:e,momenticFiles:t,project:r,forceSaveOnNoDiffs:o}){let i=t.modules[n.moduleId]?.fullFilePath;if(!i||!lr.existsSync(i))throw new Error(`Tried to update module ${n.moduleId} that could not be found on disk`);let a=lr.readFileSync(i,"utf-8"),s=oa.parse(a),l;if(n.name&&n.name!==s.name){let m=`${Me(n.name)}.${Lt.MODULE}`;if(l=ud.join(ud.dirname(i),m),lr.existsSync(l))throw new Error(`Test with name '${n.name}' already exists at path '${l}'`)}let c={...n,schemaVersion:e},d=Hn({fileType:Ce.MODULE,...Qc.parse(c),steps:ye.array().parse(n.steps)}),p=vf(d,s);if(p&&Object.keys(p).length===0&&!o){y.debug(`Skipping save for module ${n.moduleId} since there are no changes`);return}let u=oa.stringify(d);lr.writeFileSync(i,u,"utf-8"),l&&lr.renameSync(i,l),Vr(l||i,r.config)}function Tf({moduleId:n,content:e,momenticFiles:t,project:r,logger:o}){let i=t.modules[n]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${n} that could not be found on disk`);let a=$n(i,o),s={...a,...e},l=Hn({fileType:Ce.MODULE,...Qc.parse(s),steps:a.steps}),c=vf(l,a);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let d=oa.stringify(l);lr.writeFileSync(i,d,"utf-8"),Vr(i,r.config)}async function xf({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let a=Me(n),s=ud.join(o,`${a}.module.yaml`),l=cA(),{stepsToSave:c}=await Jt({stepLists:{steps:r}}),d={fileType:Ce.MODULE,schemaVersion:_e,moduleId:l,name:n,description:e,enabled:t,steps:c.steps},p=oa.stringify(d);return lr.writeFileSync(s,p,"utf-8"),Vr(s,i.config),{moduleId:l,name:n,description:e,enabled:t,steps:r}}function $n(n,e){let t=lr.readFileSync(n,"utf-8"),r=oa.parse(t);try{return nd.parse(r)}catch(o){throw e.error({err:o,moduleFilePath:n,moduleContents:t},`${n} does not parse as a valid Momentic module`),o}}async function md(n,e,t,r){let o=$n(n.fullFilePath,t),{resolvedSteps:i}=await Ms({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:r,logger:t,callbacks:{onFetchModule:async({id:s})=>{let l=e.modules[s]?.fullFilePath;if(l)return $n(l,t)}}}),a={...o,steps:i};return r&&(r[n.id]=lA(a)),a}async function Ds(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await md(r,n,e,t)})),Array.from(Object.values(t))}async function Cf({test:n,name:e,folder:t}){let r=await yf({test:n});if(Object.keys(r.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Me(e)}.${Lt.TEST}`,a=Kr.join(t,i);return pn.writeFileSync(a,r.test,"utf-8"),a}function hd(n,e,t){let r=Kr.join(t.rootDir,n);if(!pn.existsSync(r))throw new Error(`Test not found at path '${n}' in project '${t.rootDir}'`);let o=pn.readFileSync(r,"utf-8"),i=Bo.parse(o),a,s;if(e.name&&e.name!==i.name){let u=`${Me(e.name)}.${Lt.TEST}`;if(a=Kr.join(Kr.dirname(n),u),s=Kr.join(t.rootDir,a),pn.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let l={...i,...e},c=Yt.parse(l),d={fileType:Ce.TEST,...Yt.parse(c),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},p=Bo.stringify(d);return pn.writeFileSync(r,p,"utf-8"),s&&pn.renameSync(r,s),Vr(r,t.config),{newRelativeTestPath:a}}function jn({relativeTestPath:n,steps:e,schemaVersion:t,project:r,forceSaveOnNoDiffs:o}){let i=Kr.join(r.rootDir,n);if(!pn.existsSync(i))throw new Error(`Test not found at path '${n}' in project '${r.rootDir}'`);let a=pn.readFileSync(i,"utf-8"),s=Bo.parse(a),l=Yt.parse({...s,schemaVersion:t}),c=Hn({fileType:Ce.TEST,...l,beforeSteps:ye.array().or(Ef.undefined()).parse(e.beforeSteps),steps:ye.array().parse(e.steps),afterSteps:ye.array().or(Ef.undefined()).parse(e.afterSteps)}),d=dA(c,s);if(d&&Object.keys(d).length===0&&!o){y.debug(`Skipping save for test ${l.name} since there are no changes`);return}let p=Bo.stringify(c);pn.writeFileSync(i,p,"utf-8"),y.debug(`Saving test ${l.name} to ${i}`),Vr(i,r.config)}function Fs(n,e){let t=Kr.join(e.rootDir,n);if(!t)throw new Error(`Could not find test with path ${n} in Momentic project (${e.rootDir})`);let r;try{r=pn.readFileSync(t,"utf8"),r=r.replace(/\r\n|\r/g,`
|
|
42
|
-
`)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Bo.parse(r)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return bt.parse(o)}function Yr(n,e,t){let r=t.project.rootDir,o;try{o=pn.readFileSync(n,"utf-8")}catch(a){throw e.error({err:a,projectRoot:r},a.message),new Error(a.message)}let i=Bo.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${n} is missing steps`);return i}async function ia(n,e,t){let r=Yr(n,e,t),o;try{o=Yt.parse(r)}catch(a){throw new Error(`Test ${n} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await ff({rawSteps:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let l=t.modules[a]?.fullFilePath;if(l)return $n(l,s)}}});return i}import pA from"@dotenvx/dotenvx";import uA from"fs";import Rf from"path";function If(n,e){return(n.config.environments??[]).map(t=>aa(t.name,n,e))}function Af(n){return n.includes("${")?n.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[r,o]=t.split(/:-|-/,2),i=process.env[r];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):n}function aa(n,e,t){let r=(e.config.environments??[]).find(a=>a.name===n);if(!r)throw new Error(`Environment ${n} not found in local project configuration file`);let o={[Ge]:Af(r.baseUrl)};if(r.envVariables){let a={};for(let[s,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=Af(l);c&&(a[s]=c)}else{let c=l.fromFile,d;try{d=uA.readFileSync(Rf.resolve(e.rootDir,c),"utf-8")}catch(p){throw new Error(`Failed to read environment variable '${s}' from file '${c}': ${p}`)}if(l.json)try{a[s]=JSON.parse(d)}catch(p){throw new Error(`Failed to parse environment variable '${s}' from file '${c}' as JSON: ${p}`)}else a[s]=d}Object.keys(a).length>0&&y.debug(a,"Set environment variables with interpolation from project configuration"),Object.assign(o,a)}if(r.envFile){let a={},s=pA.config({path:Rf.resolve(e.rootDir,r.envFile),processEnv:a,logLevel:"error",quiet:!0});if(s.error)throw new Error(`Failed to load .env file: ${s.error.message}`);t.debug(a,"Set environment variables from .env file"),Object.assign(o,a)}return r.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:n,variables:o,browser:r.browser}}import{existsSync as jI,readFileSync as GI,readdirSync as WI,writeFileSync as VI}from"fs";var Yf=xT(Hf(),1);var la=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var wA={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},ca=n=>n.replace(/[[\]\\-]/g,"\\$&"),vA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),$f=n=>n.join(""),jf=(n,e)=>{let t=e;if(n.charAt(t)!=="[")throw new Error("not in a brace expression");let r=[],o=[],i=t+1,a=!1,s=!1,l=!1,c=!1,d=t,p="";e:for(;i<n.length;){let g=n.charAt(i);if((g==="!"||g==="^")&&i===t+1){c=!0,i++;continue}if(g==="]"&&a&&!l){d=i+1;break}if(a=!0,g==="\\"&&!l){l=!0,i++;continue}if(g==="["&&!l){for(let[f,[S,w,v]]of Object.entries(wA))if(n.startsWith(f,i)){if(p)return["$.",!1,n.length-t,!0];i+=f.length,v?o.push(S):r.push(S),s=s||w;continue e}}if(l=!1,p){g>p?r.push(ca(p)+"-"+ca(g)):g===p&&r.push(ca(g)),p="",i++;continue}if(n.startsWith("-]",i+1)){r.push(ca(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){p=g,i+=2;continue}r.push(ca(g)),i++}if(d<i)return["",!1,0,!1];if(!r.length&&!o.length)return["$.",!1,n.length-t,!0];if(o.length===0&&r.length===1&&/^\\?.$/.test(r[0])&&!c){let g=r[0].length===2?r[0].slice(-1):r[0];return[vA(g),!1,d-t,!1]}let u="["+(c?"^":"")+$f(r)+"]",m="["+(c?"":"^")+$f(o)+"]";return[r.length&&o.length?"("+u+"|"+m+")":r.length?u:m,s,d-t,!0]};var un=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/\[([^\/\\])\]/g,"$1"):n.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var TA=new Set(["!","?","+","*","@"]),Gf=n=>TA.has(n),xA="(?!(?:^|/)\\.\\.?(?:$|/))",Us="(?!\\.)",EA=new Set(["[","."]),CA=new Set(["..","."]),RA=new Set("().*{}+?[]^$\\!"),AA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Sd="[^/]",Wf=Sd+"*?",Vf=Sd+"+?",zo=class n{type;#e;#t;#i=!1;#r=[];#a;#w;#c;#p=!1;#s;#l;#o=!1;constructor(e,t,r={}){this.type=e,e&&(this.#t=!0),this.#a=t,this.#e=this.#a?this.#a.#e:this,this.#s=this.#e===this?r:this.#e.#s,this.#c=this.#e===this?[]:this.#e.#c,e==="!"&&!this.#e.#p&&this.#c.push(this),this.#w=this.#a?this.#a.#r.length:0}get hasMagic(){if(this.#t!==void 0)return this.#t;for(let e of this.#r)if(typeof e!="string"&&(e.type||e.hasMagic))return this.#t=!0;return this.#t}toString(){return this.#l!==void 0?this.#l:this.type?this.#l=this.type+"("+this.#r.map(e=>String(e)).join("|")+")":this.#l=this.#r.map(e=>String(e)).join("")}#f(){if(this!==this.#e)throw new Error("should only call on root");if(this.#p)return this;this.toString(),this.#p=!0;let e;for(;e=this.#c.pop();){if(e.type!=="!")continue;let t=e,r=t.#a;for(;r;){for(let o=t.#w+1;!r.type&&o<r.#r.length;o++)for(let i of e.#r){if(typeof i=="string")throw new Error("string part in extglob AST??");i.copyIn(r.#r[o])}t=r,r=t.#a}}return this}push(...e){for(let t of e)if(t!==""){if(typeof t!="string"&&!(t instanceof n&&t.#a===this))throw new Error("invalid part: "+t);this.#r.push(t)}}toJSON(){let e=this.type===null?this.#r.slice().map(t=>typeof t=="string"?t:t.toJSON()):[this.type,...this.#r.map(t=>t.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#e||this.#e.#p&&this.#a?.type==="!")&&e.push({}),e}isStart(){if(this.#e===this)return!0;if(!this.#a?.isStart())return!1;if(this.#w===0)return!0;let e=this.#a;for(let t=0;t<this.#w;t++){let r=e.#r[t];if(!(r instanceof n&&r.type==="!"))return!1}return!0}isEnd(){if(this.#e===this||this.#a?.type==="!")return!0;if(!this.#a?.isEnd())return!1;if(!this.type)return this.#a?.isEnd();let e=this.#a?this.#a.#r.length:0;return this.#w===e-1}copyIn(e){typeof e=="string"?this.push(e):this.push(e.clone(this))}clone(e){let t=new n(this.type,e);for(let r of this.#r)t.copyIn(r);return t}static#S(e,t,r,o){let i=!1,a=!1,s=-1,l=!1;if(t.type===null){let m=r,h="";for(;m<e.length;){let g=e.charAt(m++);if(i||g==="\\"){i=!i,h+=g;continue}if(a){m===s+1?(g==="^"||g==="!")&&(l=!0):g==="]"&&!(m===s+2&&l)&&(a=!1),h+=g;continue}else if(g==="["){a=!0,s=m,l=!1,h+=g;continue}if(!o.noext&&Gf(g)&&e.charAt(m)==="("){t.push(h),h="";let f=new n(g,t);m=n.#S(e,f,m,o),t.push(f);continue}h+=g}return t.push(h),m}let c=r+1,d=new n(null,t),p=[],u="";for(;c<e.length;){let m=e.charAt(c++);if(i||m==="\\"){i=!i,u+=m;continue}if(a){c===s+1?(m==="^"||m==="!")&&(l=!0):m==="]"&&!(c===s+2&&l)&&(a=!1),u+=m;continue}else if(m==="["){a=!0,s=c,l=!1,u+=m;continue}if(Gf(m)&&e.charAt(c)==="("){d.push(u),u="";let h=new n(m,d);d.push(h),c=n.#S(e,h,c,o);continue}if(m==="|"){d.push(u),u="",p.push(d),d=new n(null,t);continue}if(m===")")return u===""&&t.#r.length===0&&(t.#o=!0),d.push(u),u="",t.push(...p,d),c;u+=m}return t.type=null,t.#t=void 0,t.#r=[e.substring(r-1)],c}static fromGlob(e,t={}){let r=new n(null,void 0,t);return n.#S(e,r,0,t),r}toMMPattern(){if(this!==this.#e)return this.#e.toMMPattern();let e=this.toString(),[t,r,o,i]=this.toRegExpSource();if(!(o||this.#t||this.#s.nocase&&!this.#s.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return r;let s=(this.#s.nocase?"i":"")+(i?"u":"");return Object.assign(new RegExp(`^${t}$`,s),{_src:t,_glob:e})}get options(){return this.#s}toRegExpSource(e){let t=e??!!this.#s.dot;if(this.#e===this&&this.#f(),!this.type){let l=this.isStart()&&this.isEnd(),c=this.#r.map(m=>{let[h,g,f,S]=typeof m=="string"?n.#u(m,this.#t,l):m.toRegExpSource(e);return this.#t=this.#t||f,this.#i=this.#i||S,h}).join(""),d="";if(this.isStart()&&typeof this.#r[0]=="string"&&!(this.#r.length===1&&CA.has(this.#r[0]))){let h=EA,g=t&&h.has(c.charAt(0))||c.startsWith("\\.")&&h.has(c.charAt(2))||c.startsWith("\\.\\.")&&h.has(c.charAt(4)),f=!t&&!e&&h.has(c.charAt(0));d=g?xA:f?Us:""}let p="";return this.isEnd()&&this.#e.#p&&this.#a?.type==="!"&&(p="(?:$|\\/)"),[d+c+p,un(c),this.#t=!!this.#t,this.#i]}let r=this.type==="*"||this.type==="+",o=this.type==="!"?"(?:(?!(?:":"(?:",i=this.#m(t);if(this.isStart()&&this.isEnd()&&!i&&this.type!=="!"){let l=this.toString();return this.#r=[l],this.type=null,this.#t=void 0,[l,un(this.toString()),!1,!1]}let a=!r||e||t||!Us?"":this.#m(!0);a===i&&(a=""),a&&(i=`(?:${i})(?:${a})*?`);let s="";if(this.type==="!"&&this.#o)s=(this.isStart()&&!t?Us:"")+Vf;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?Us:"")+Wf+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&a?")":this.type==="*"&&a?")?":`)${this.type}`;s=o+i+l}return[s,un(i),this.#t=!!this.#t,this.#i]}#m(e){return this.#r.map(t=>{if(typeof t=="string")throw new Error("string type in extglob ast??");let[r,o,i,a]=t.toRegExpSource(e);return this.#i=this.#i||a,r}).filter(t=>!(this.isStart()&&this.isEnd())||!!t).join("|")}static#u(e,t,r=!1){let o=!1,i="",a=!1;for(let s=0;s<e.length;s++){let l=e.charAt(s);if(o){o=!1,i+=(RA.has(l)?"\\":"")+l;continue}if(l==="\\"){s===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,d,p,u]=jf(e,s);if(p){i+=c,a=a||d,s+=p-1,t=t||u;continue}}if(l==="*"){r&&e==="*"?i+=Vf:i+=Wf,t=!0;continue}if(l==="?"){i+=Sd,t=!0;continue}i+=AA(l)}return[i,un(e),!!t,a]}};var Ho=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/[?*()[\]]/g,"[$&]"):n.replace(/[?*()[\]\\]/g,"\\$&");var wt=(n,e,t={})=>(la(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Ft(e,t).match(n)),IA=/^\*+([^+@!?\*\[\(]*)$/,PA=n=>e=>!e.startsWith(".")&&e.endsWith(n),LA=n=>e=>e.endsWith(n),OA=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),MA=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),NA=/^\*+\.\*+$/,kA=n=>!n.startsWith(".")&&n.includes("."),_A=n=>n!=="."&&n!==".."&&n.includes("."),DA=/^\.\*+$/,FA=n=>n!=="."&&n!==".."&&n.startsWith("."),UA=/^\*+$/,BA=n=>n.length!==0&&!n.startsWith("."),zA=n=>n.length!==0&&n!=="."&&n!=="..",HA=/^\?+([^+@!?\*\[\(]*)?$/,$A=([n,e=""])=>{let t=Jf([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},jA=([n,e=""])=>{let t=Xf([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},GA=([n,e=""])=>{let t=Xf([n]);return e?r=>t(r)&&r.endsWith(e):t},WA=([n,e=""])=>{let t=Jf([n]);return e?r=>t(r)&&r.endsWith(e):t},Jf=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},Xf=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},Zf=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",qf={win32:{sep:"\\"},posix:{sep:"/"}},VA=Zf==="win32"?qf.win32.sep:qf.posix.sep;wt.sep=VA;var at=Symbol("globstar **");wt.GLOBSTAR=at;var qA="[^/]",KA=qA+"*?",YA="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",JA="(?:(?!(?:\\/|^)\\.).)*?",XA=(n,e={})=>t=>wt(t,n,e);wt.filter=XA;var Xt=(n,e={})=>Object.assign({},n,e),ZA=n=>{if(!n||typeof n!="object"||!Object.keys(n).length)return wt;let e=wt;return Object.assign((r,o,i={})=>e(r,o,Xt(n,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,Xt(n,i))}static defaults(o){return e.defaults(Xt(n,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,a={}){super(o,i,Xt(n,a))}static fromGlob(o,i={}){return e.AST.fromGlob(o,Xt(n,i))}},unescape:(r,o={})=>e.unescape(r,Xt(n,o)),escape:(r,o={})=>e.escape(r,Xt(n,o)),filter:(r,o={})=>e.filter(r,Xt(n,o)),defaults:r=>e.defaults(Xt(n,r)),makeRe:(r,o={})=>e.makeRe(r,Xt(n,o)),braceExpand:(r,o={})=>e.braceExpand(r,Xt(n,o)),match:(r,o,i={})=>e.match(r,o,Xt(n,i)),sep:e.sep,GLOBSTAR:at})};wt.defaults=ZA;var Qf=(n,e={})=>(la(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,Yf.default)(n));wt.braceExpand=Qf;var QA=(n,e={})=>new Ft(n,e).makeRe();wt.makeRe=QA;var eI=(n,e,t={})=>{let r=new Ft(e,t);return n=n.filter(o=>r.match(o)),r.options.nonull&&!n.length&&n.push(e),n};wt.match=eI;var Kf=/[?*]|[+@!]\(.*?\)|\[|\]/,tI=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Ft=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,t={}){la(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||Zf,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!t.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!t.nonegate,this.comment=!1,this.empty=!1,this.partial=!!t.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=t.windowsNoMagicRoot!==void 0?t.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let t of e)if(typeof t!="string")return!0;return!1}debug(...e){}make(){let e=this.pattern,t=this.options;if(!t.nocomment&&e.charAt(0)==="#"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],t.debug&&(this.debug=(...i)=>console.error(...i)),this.debug(this.pattern,this.globSet);let r=this.globSet.map(i=>this.slashSplit(i));this.globParts=this.preprocess(r),this.debug(this.pattern,this.globParts);let o=this.globParts.map((i,a,s)=>{if(this.isWindows&&this.windowsNoMagicRoot){let l=i[0]===""&&i[1]===""&&(i[2]==="?"||!Kf.test(i[2]))&&!Kf.test(i[3]),c=/^[a-z]:/i.test(i[0]);if(l)return[...i.slice(0,4),...i.slice(4).map(d=>this.parse(d))];if(c)return[i[0],...i.slice(1).map(d=>this.parse(d))]}return i.map(l=>this.parse(l))});if(this.debug(this.pattern,o),this.set=o.filter(i=>i.indexOf(!1)===-1),this.isWindows)for(let i=0;i<this.set.length;i++){let a=this.set[i];a[0]===""&&a[1]===""&&this.globParts[i][2]==="?"&&typeof a[3]=="string"&&/^[a-z]:$/i.test(a[3])&&(a[2]="?")}this.debug(this.pattern,this.set)}preprocess(e){if(this.options.noglobstar)for(let r=0;r<e.length;r++)for(let o=0;o<e[r].length;o++)e[r][o]==="**"&&(e[r][o]="*");let{optimizationLevel:t=1}=this.options;return t>=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):t>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(t=>{let r=-1;for(;(r=t.indexOf("**",r+1))!==-1;){let o=r;for(;t[o+1]==="**";)o++;o!==r&&t.splice(r,o-r)}return t})}levelOneOptimize(e){return e.map(t=>(t=t.reduce((r,o)=>{let i=r[r.length-1];return o==="**"&&i==="**"?r:o===".."&&i&&i!==".."&&i!=="."&&i!=="**"?(r.pop(),r):(r.push(o),r)},[]),t.length===0?[""]:t))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let t=!1;do{if(t=!1,!this.preserveMultipleSlashes){for(let o=1;o<e.length-1;o++){let i=e[o];o===1&&i===""&&e[0]===""||(i==="."||i==="")&&(t=!0,e.splice(o,1),o--)}e[0]==="."&&e.length===2&&(e[1]==="."||e[1]==="")&&(t=!0,e.pop())}let r=0;for(;(r=e.indexOf("..",r+1))!==-1;){let o=e[r-1];o&&o!=="."&&o!==".."&&o!=="**"&&(t=!0,e.splice(r-1,2),r-=2)}}while(t);return e.length===0?[""]:e}firstPhasePreProcess(e){let t=!1;do{t=!1;for(let r of e){let o=-1;for(;(o=r.indexOf("**",o+1))!==-1;){let a=o;for(;r[a+1]==="**";)a++;a>o&&r.splice(o+1,a-o);let s=r[o+1],l=r[o+2],c=r[o+3];if(s!==".."||!l||l==="."||l===".."||!c||c==="."||c==="..")continue;t=!0,r.splice(o,1);let d=r.slice(0);d[o]="**",e.push(d),o--}if(!this.preserveMultipleSlashes){for(let a=1;a<r.length-1;a++){let s=r[a];a===1&&s===""&&r[0]===""||(s==="."||s==="")&&(t=!0,r.splice(a,1),a--)}r[0]==="."&&r.length===2&&(r[1]==="."||r[1]==="")&&(t=!0,r.pop())}let i=0;for(;(i=r.indexOf("..",i+1))!==-1;){let a=r[i-1];if(a&&a!=="."&&a!==".."&&a!=="**"){t=!0;let l=i===1&&r[i+1]==="**"?["."]:[];r.splice(i-1,2,...l),r.length===0&&r.push(""),i-=2}}}}while(t);return e}secondPhasePreProcess(e){for(let t=0;t<e.length-1;t++)for(let r=t+1;r<e.length;r++){let o=this.partsMatch(e[t],e[r],!this.preserveMultipleSlashes);if(o){e[t]=[],e[r]=o;break}}return e.filter(t=>t.length)}partsMatch(e,t,r=!1){let o=0,i=0,a=[],s="";for(;o<e.length&&i<t.length;)if(e[o]===t[i])a.push(s==="b"?t[i]:e[o]),o++,i++;else if(r&&e[o]==="**"&&t[i]===e[o+1])a.push(e[o]),o++;else if(r&&t[i]==="**"&&e[o]===t[i+1])a.push(t[i]),i++;else if(e[o]==="*"&&t[i]&&(this.options.dot||!t[i].startsWith("."))&&t[i]!=="**"){if(s==="b")return!1;s="a",a.push(e[o]),o++,i++}else if(t[i]==="*"&&e[o]&&(this.options.dot||!e[o].startsWith("."))&&e[o]!=="**"){if(s==="a")return!1;s="b",a.push(t[i]),o++,i++}else return!1;return e.length===t.length&&a}parseNegate(){if(this.nonegate)return;let e=this.pattern,t=!1,r=0;for(let o=0;o<e.length&&e.charAt(o)==="!";o++)t=!t,r++;r&&(this.pattern=e.slice(r)),this.negate=t}matchOne(e,t,r=!1){let o=this.options;if(this.isWindows){let g=typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0]),f=!g&&e[0]===""&&e[1]===""&&e[2]==="?"&&/^[a-z]:$/i.test(e[3]),S=typeof t[0]=="string"&&/^[a-z]:$/i.test(t[0]),w=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),v=f?3:g?0:void 0,b=w?3:S?0:void 0;if(typeof v=="number"&&typeof b=="number"){let[x,C]=[e[v],t[b]];x.toLowerCase()===C.toLowerCase()&&(t[b]=x,b>v?t=t.slice(b):v>b&&(e=e.slice(v)))}}let{optimizationLevel:i=1}=this.options;i>=2&&(e=this.levelTwoFileOptimize(e)),this.debug("matchOne",this,{file:e,pattern:t}),this.debug("matchOne",e.length,t.length);for(var a=0,s=0,l=e.length,c=t.length;a<l&&s<c;a++,s++){this.debug("matchOne loop");var d=t[s],p=e[a];if(this.debug(t,d,p),d===!1)return!1;if(d===at){this.debug("GLOBSTAR",[t,d,p]);var u=a,m=s+1;if(m===c){for(this.debug("** at the end");a<l;a++)if(e[a]==="."||e[a]===".."||!o.dot&&e[a].charAt(0)===".")return!1;return!0}for(;u<l;){var h=e[u];if(this.debug(`
|
|
41
|
+
`)}function Zg(n,e){try{if(!n)return n;if(typeof n=="string")return ze(n,3e4);if(typeof n=="object"){let{jsonString:t}=Ao(JSON.stringify(n,(r,o)=>e?.includes(r)||typeof o=="string"&&o.length>3e4?"REDACTED":o),2e4);return JSON.parse(t)}return n}catch{return n}}function fd(n,e){for(let t=0;t<n.length;t++){let r=n[t];try{if(r.data){let{jsonString:o}=Ao(JSON.stringify(r.data),1e3);r.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),r.data=`Result output data could not be serialized: ${o}`}switch(r.details&&(r.details=void 0),r.type){case"PRESET_ACTION":Jg(r);break;case"CONDITIONAL":r.assertion&&Jg(r.assertion),fd(r.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"IFRAME":case"MODULE":case"SECTION":{fd(r.results,e);break}default:return(i=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}}function Jg(n){let e=n.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Xg(n,e){let t=JSON.stringify(n),r=t.replaceAll("\\u0000","");if(t.length!==r.length){let o=t.indexOf("\\u0000");e.warn({input:t.slice(Math.max(0,o-500),Math.min(t.length,o+500))},"Database content violation: stripped unicode character from input")}return r}function _s(n,e){let t=tA(n);if(fd(t,e),t.length>qg)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,qg);let r=Xg(t,e);if(r.length>Kg)for(e.error({serializedLength:r.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");r.length>Kg;)t.pop(),r=Xg(t,e);try{return Pt.array().parse(JSON.parse(r))}catch(o){throw e.error({serialized:r,err:o},"Could not parse serialized results into JSON structure after processing"),o}}import{cloneDeep as DV}from"lodash-es";var rA=/^(?!.*\S+\s+\S+).*$/,oA=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,iA=/style="([^"]*)/g,aA=/data-[\w-]+/g,sA=n=>{switch(n.type){case"AI_ASSERTION":return{type:n.type,assertion:n.assertion};case"DRAG":if(n.fromTarget.type==="description")return{type:n.type,description:n.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(n.target?.type==="description")return{type:n.type,description:n.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function Qg(n){let e=sA(n),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:rA.test(t)&&oA.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:iA.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"}:aA.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 ef(n,e){if(!(!n.envs||!n.envs.length)){for(let t of n.envs){let r=t;e in t&&(r[e]&&(t.default=!0),delete r.defaultOnCloud,delete r.defaultOnLocal)}n.envs.some(t=>t.default)||(n.envs[0].default=!0)}}import{cloneDeep as Af}from"lodash-es";import uA from"diff-lines";import Fs,{gte as mA}from"semver";var tf={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async n=>(n=n.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),n=n.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),n)};var nf={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 n=>n.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,r=t[t.length-1];return r&&r.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var lA=["target","fromTarget","toTarget"];function rf(n){for(let e of lA){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var of={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":return rf(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])rf(r);return e}default:return e}})};import{v4 as cA}from"uuid";var af={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=cA()),e;default:return e}})};import{v4 as sf}from"uuid";var lf={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??sf(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??sf()}})),delete e.commands),e;default:return e}})};var cf={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 n=>n.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 dA}from"uuid";var df={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 n=>n.map(e=>("id"in e&&typeof e.id=="string"||(e.id=dA()),e))};import{v4 as pf}from"uuid";var uf={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 n=>n.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=pf())}return e.id=pf(),e})};var mf={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 n=>n.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 pA}from"uuid";var hf={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=pA()),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 gf={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.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 ff={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Sf(t),e})};function Sf(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){Sf(n[e]);return}if(typeof n[e]!="string")return;let t=n[e];e==="code"?n[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(n[e]=t.replace(/inputs\./g,"env."))})}var yf={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.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 bf={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async n=>n.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 wf={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 n=>n.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 vf={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 n=>n.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 xf={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async n=>n.map(e=>{if(e.type!=="AI_ASSERTION")return e;let r={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...r};return delete o.text,o}),stopOnFailure:!0};var Ds=new Set(["CLICK","TYPE","SELECT_OPTION"]),Tf={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type,o=t?.elementDescriptor;return(o!==void 0||Ds.has(r))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,l=a?.type;(s!==void 0||Ds.has(l))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,l=s?.elementDescriptor,c=s?.type;(l!==void 0||Ds.has(c))&&(s.target={elementDescriptor:l??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(p=>{let u=p?.elementDescriptor,m=p?.type;(u!==void 0||Ds.has(m))&&(p.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var Ef={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(r=>{if(r&&typeof r=="object"){let o=r;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var Cf={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async n=>n.map(e=>{let t=e.command,r=t?.type;return r?.startsWith("PRESET_")&&(t.type=r.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(c=>{let d=c.type;d?.startsWith("PRESET_")&&(c.type=d.slice(7))})}),e}),stopOnFailure:!0};var Gr=[xf,Ef,Cf,Tf,tf,nf,of,af,lf,cf,df,uf,mf,hf,gf,ff,yf,bf,wf,vf];if(_e!==Gr[Gr.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Gr.forEach((n,e)=>{if(!Fs.valid(n.toVersion)||!Fs.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Fs.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if(Gr[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function hA(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var oa=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:a}=n,s=Gr.findIndex(d=>Fs.gt(d.toVersion,i));if(s===-1)return{steps:o,newVersion:i};let l=i;for(let d=s;d<Gr.length;d++){if(r&&mA(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let p=Gr[d],u={id:a,migration:p.name,toVersion:p.toVersion};try{o=await Rf(o,p),l=p.toVersion}catch(m){throw t.error({err:m,...u},"Migration failed"),new Error(`Step migration ${p.name} failed: ${m}`)}}let c=uA(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return c.trim()&&t.debug({diffs:c,id:a},"Migration diffs"),{newVersion:l,steps:o}};async function Rf(n,e){let t=await e.execute(n);for(let r of t)for(let o of Object.keys(r)){if(!e.recursiveKeys.has(o))continue;let i=r[o];!i||!Array.isArray(i)||hA(i)&&(r[o]=await Rf(i,e))}return t}async function If({rawSteps:n,metadata:e,logger:t,callbacks:r}){ef(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await Us({rawSteps:n.steps,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o}),s={...e,steps:i,schemaVersion:a};for(let l of["beforeSteps","afterSteps"]){let c=n[l];if(!c)continue;let{resolvedSteps:d}=await Us({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});s[l]=d}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function Wr(n,e,t){let{newVersion:r,steps:o}=await oa({metadata:n,steps:e,logger:t});try{return{steps:be.array().parse(o),newVersion:r}}catch(i){throw t.error({type:"zod",err:i,newVersion:r,id:n.id,steps:o},"Failed to parse test steps while migrating test"),new Rs(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function Us({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await Wr(e,n,t),s=[];for(let l of a)s.push(await ia({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function ia({step:n,callbacks:e,logger:t,resolvedModuleCache:r}){switch(n.type){case"AI_ACTION":return n;case"AI_ACTION_DYNAMIC":return n;case"PRESET_ACTION":return n;case"MODULE":{let l=n.moduleId,c=r[l];if(c)return{...Af(c),...n,type:"RESOLVED_MODULE"};let d=await e.onFetchModule({id:l,logger:t});if(!d)throw new Error(`Could not find module with id ${l}`);let{newVersion:p,steps:u}=await oa({metadata:{id:l,schemaVersion:d.schemaVersion},steps:d.steps,logger:t}),m;try{m=be.array().parse(u)}catch(f){throw t.error({type:"zod",err:f,steps:u,newVersion:p,id:l},"Module failed to parse"),f}let h;try{h=await Promise.all(m.map(f=>ia({step:f,callbacks:e,logger:t,resolvedModuleCache:r})))}catch(f){throw t.error({err:f,...n},`Failed to recursively resolve module '${d.name}': ${f}`),f}let g={...d,steps:h};return r[l]=Af(g),{...g,...n,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let l of n.blocks){let c=[];for(let d of l.steps)c.push(await ia({step:d,callbacks:e,logger:t,resolvedModuleCache:r}));o.push({...l,steps:c})}let i;if(n.elseSteps){i=[];for(let l of n.elseSteps)i.push(await ia({step:l,callbacks:e,logger:t,resolvedModuleCache:r}))}return{...n,blocks:o,elseSteps:i};case"SECTION":case"IFRAME":let a=[];for(let l of n.steps)a.push(await ia({step:l,callbacks:e,logger:t,resolvedModuleCache:r}));return{...n,steps:a};default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function gA(n){return typeof n=="object"&&n!==null}function $n(n){if(Array.isArray(n))return n.map($n);if(gA(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=$n(r))}),e}return n}import{cloneDeep as fA}from"lodash-es";import{stringify as Pf}from"yaml";async function Lf({test:n,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let r={id:n.id,name:n.name,description:n.description,baseUrl:n.baseUrl,schemaVersion:n.schemaVersion,advanced:n.advanced,retries:n.retries,envs:n.envs,disabled:n.disabled,labels:n.labels},o={},i=await SA({originalStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:Ae.TEST,...r,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:Pf(a),modules:o}}async function SA({originalStepLists:n,modules:e,processedModuleNames:t,createNewCacheIds:r}){let o=fA(n);Object.values(o).forEach(s=>{yA(s??[])});let{stepsToSave:i,moduleUpdates:a}=await Zt({stepLists:o,createNewCacheIds:r});for(let s of a)t.has(s.name)||(e[s.name]=bA(s),t.add(s.name));return i}function yA(n){pd({steps:n,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 bA(n){let e=At.parse(n),t={fileType:Ae.MODULE,...e,schemaVersion:_e,steps:n.steps};return Pf(t)}async function ne(n,e){return new Promise((t,r)=>{if(e?.aborted){r(e.reason);return}e?.addEventListener("abort",i);let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n);function i(){clearTimeout(o),e?.removeEventListener("abort",i),r(e?.reason)}})}async function aa({promiseGenerator:n,signal:e,codePath:t,logger:r}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}r?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,l)=>{function c(){clearInterval(a),e?.removeEventListener("abort",c),l(e?.reason)}if(e?.aborted){l(e?.reason),clearInterval(a);return}e?.addEventListener("abort",c),(async()=>{try{s(await n())}catch(d){l(d)}finally{clearInterval(a),e?.removeEventListener("abort",c)}})()})}async function Vr({promiseGenerator:n,timeoutMs:e,codePath:t,logger:r,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},l=setTimeout(()=>{i||a.abort()},e);o?.addEventListener("abort",s);try{return await aa({promiseGenerator:n,signal:a.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(l)}}function Bs(n){let e=[];for(let t of n)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let r={...t,type:"MODULE"};e.push(Hn.parse(r));break}case"IFRAME":case"SECTION":{let r={...t,steps:Bs(t.steps)};e.push(be.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:Bs(o.steps)})),elseSteps:t.elseSteps?Bs(t.elseSteps):void 0};e.push(Pr.parse(r));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 zs(n){return Bs([n])[0]}import wA from"picomatch";var Of=(n,e,t)=>{t?.caseInsensitive&&(n=n.toLowerCase());let r;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;r=n.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;r=n===e.glob||wA(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r},Hs=(n,e)=>{try{let{hostname:t,pathname:r}=new URL(n),{hostname:o,pathname:i}=new URL(e);return t!==o||r!==i}catch{return!1}},Bo=n=>{try{return new URL(n),!0}catch{return!1}},Mf=n=>!n.toLowerCase().startsWith("http"),zo=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function qr(n,e){try{return!!new URL(n).origin.trim()}catch(t){return e?.error({url:n,err:t},"Invalid URL in check"),!1}}import Ho from"yaml";import{z as Df}from"zod";import{execSync as vA}from"child_process";function Kr(n,e){let t=e.hooks?.postSave;if(!t)return;let r;t.includes("$1")?r=t.replaceAll("$1",n):r=`${t} ${n}`,y.debug({postSaveCommand:r},"Executing post-save hook command");try{vA(r,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")}}import{diff as Nf}from"deep-object-diff";import dr from"fs";import{cloneDeep as xA}from"lodash-es";import Sd from"path";import{v4 as TA}from"uuid";import sa from"yaml";function Yr({content:n,schemaVersion:e,momenticFiles:t,project:r,forceSaveOnNoDiffs:o}){let i=t.modules[n.moduleId]?.fullFilePath;if(!i||!dr.existsSync(i))throw new Error(`Tried to update module ${n.moduleId} that could not be found on disk`);let a=dr.readFileSync(i,"utf-8"),s=sa.parse(a),l;if(n.name&&n.name!==s.name){let m=`${Ne(n.name)}.${Mt.MODULE}`;if(l=Sd.join(Sd.dirname(i),m),dr.existsSync(l))throw new Error(`Test with name '${n.name}' already exists at path '${l}'`)}let c={...n,schemaVersion:e},d=$n({fileType:Ae.MODULE,...id.parse(c),steps:be.array().parse(n.steps)}),p=Nf(d,s);if(p&&Object.keys(p).length===0&&!o){y.debug(`Skipping save for module ${n.moduleId} since there are no changes`);return}let u=sa.stringify(d);dr.writeFileSync(i,u,"utf-8"),l&&dr.renameSync(i,l),Kr(l||i,r.config)}function kf({moduleId:n,content:e,momenticFiles:t,project:r,logger:o}){let i=t.modules[n]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${n} that could not be found on disk`);let a=Gn(i,o),s={...a,...e},l=$n({fileType:Ae.MODULE,...id.parse(s),steps:a.steps}),c=Nf(l,a);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let d=sa.stringify(l);dr.writeFileSync(i,d,"utf-8"),Kr(i,r.config)}async function _f({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let a=Ne(n),s=Sd.join(o,`${a}.module.yaml`),l=TA(),{stepsToSave:c}=await Zt({stepLists:{steps:r}}),d={fileType:Ae.MODULE,schemaVersion:_e,moduleId:l,name:n,description:e,enabled:t,steps:c.steps},p=sa.stringify(d);return dr.writeFileSync(s,p,"utf-8"),Kr(s,i.config),{moduleId:l,name:n,description:e,enabled:t,steps:r}}function Gn(n,e){let t=dr.readFileSync(n,"utf-8"),r=sa.parse(t);try{return ld.parse(r)}catch(o){throw e.error({err:o,moduleFilePath:n,moduleContents:t},`${n} does not parse as a valid Momentic module`),o}}async function yd(n,e,t,r){let o=Gn(n.fullFilePath,t),{resolvedSteps:i}=await Us({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:r,logger:t,callbacks:{onFetchModule:async({id:s})=>{let l=e.modules[s]?.fullFilePath;if(l)return Gn(l,t)}}}),a={...o,steps:i};return r&&(r[n.id]=xA(a)),a}async function js(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await yd(r,n,e,t)})),Array.from(Object.values(t))}async function Ff({test:n,name:e,folder:t}){let r=await Lf({test:n});if(Object.keys(r.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Ne(e)}.${Mt.TEST}`,a=Jr.join(t,i);return mn.writeFileSync(a,r.test,"utf-8"),a}function bd(n,e,t){let r=Jr.join(t.rootDir,n);if(!mn.existsSync(r))throw new Error(`Test not found at path '${n}' in project '${t.rootDir}'`);let o=mn.readFileSync(r,"utf-8"),i=Ho.parse(o),a,s;if(e.name&&e.name!==i.name){let u=`${Ne(e.name)}.${Mt.TEST}`;if(a=Jr.join(Jr.dirname(n),u),s=Jr.join(t.rootDir,a),mn.existsSync(s))throw new Error(`Test with name '${e.name}' already exists at path '${s}'`)}let l={...i,...e},c=Xt.parse(l),d={fileType:Ae.TEST,...Xt.parse(c),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},p=Ho.stringify(d);return mn.writeFileSync(r,p,"utf-8"),s&&mn.renameSync(r,s),Kr(r,t.config),{newRelativeTestPath:a}}function Wn({relativeTestPath:n,steps:e,schemaVersion:t,project:r,forceSaveOnNoDiffs:o}){let i=Jr.join(r.rootDir,n);if(!mn.existsSync(i))throw new Error(`Test not found at path '${n}' in project '${r.rootDir}'`);let a=mn.readFileSync(i,"utf-8"),s=Ho.parse(a),l=Xt.parse({...s,schemaVersion:t}),c=$n({fileType:Ae.TEST,...l,beforeSteps:be.array().or(Df.undefined()).parse(e.beforeSteps),steps:be.array().parse(e.steps),afterSteps:be.array().or(Df.undefined()).parse(e.afterSteps)}),d=EA(c,s);if(d&&Object.keys(d).length===0&&!o){y.debug(`Skipping save for test ${l.name} since there are no changes`);return}let p=Ho.stringify(c);mn.writeFileSync(i,p,"utf-8"),y.debug(`Saving test ${l.name} to ${i}`),Kr(i,r.config)}function $s(n,e){let t=Jr.join(e.rootDir,n);if(!t)throw new Error(`Could not find test with path ${n} in Momentic project (${e.rootDir})`);let r;try{r=mn.readFileSync(t,"utf8"),r=r.replace(/\r\n|\r/g,`
|
|
42
|
+
`)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=Ho.parse(r)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return vt.parse(o)}function Xr(n,e,t){let r=t.project.rootDir,o;try{o=mn.readFileSync(n,"utf-8")}catch(a){throw e.error({err:a,projectRoot:r},a.message),new Error(a.message)}let i=Ho.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${n} is missing steps`);return i}async function la(n,e,t){let r=Xr(n,e,t),o;try{o=Xt.parse(r)}catch(a){throw new Error(`Test ${n} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await If({rawSteps:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let l=t.modules[a]?.fullFilePath;if(l)return Gn(l,s)}}});return i}import CA from"@dotenvx/dotenvx";import RA from"fs";import Uf from"path";function zf(n,e){return(n.config.environments??[]).map(t=>ca(t.name,n,e))}function Bf(n){return n.includes("${")?n.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[r,o]=t.split(/:-|-/,2),i=process.env[r];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):n}function ca(n,e,t){let r=(e.config.environments??[]).find(a=>a.name===n);if(!r)throw new Error(`Environment ${n} not found in local project configuration file`);let o={[Ge]:Bf(r.baseUrl)};if(r.envVariables){let a={};for(let[s,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=Bf(l);c&&(a[s]=c)}else{let c=l.fromFile,d;try{d=RA.readFileSync(Uf.resolve(e.rootDir,c),"utf-8")}catch(p){throw new Error(`Failed to read environment variable '${s}' from file '${c}': ${p}`)}if(l.json)try{a[s]=JSON.parse(d)}catch(p){throw new Error(`Failed to parse environment variable '${s}' from file '${c}' as JSON: ${p}`)}else a[s]=d}Object.keys(a).length>0&&y.debug(a,"Set environment variables with interpolation from project configuration"),Object.assign(o,a)}if(r.envFile){let a={},s=CA.config({path:Uf.resolve(e.rootDir,r.envFile),processEnv:a,logLevel:"error",quiet:!0});if(s.error)throw new Error(`Failed to load .env file: ${s.error.message}`);t.debug(a,"Set environment variables from .env file"),Object.assign(o,a)}return r.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:n,variables:o,browser:r.browser}}import{existsSync as rP,readFileSync as oP,readdirSync as iP,writeFileSync as aP}from"fs";var sS=_x(Qf(),1);var pa=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var kA={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},ua=n=>n.replace(/[[\]\\-]/g,"\\$&"),_A=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),eS=n=>n.join(""),tS=(n,e)=>{let t=e;if(n.charAt(t)!=="[")throw new Error("not in a brace expression");let r=[],o=[],i=t+1,a=!1,s=!1,l=!1,c=!1,d=t,p="";e:for(;i<n.length;){let g=n.charAt(i);if((g==="!"||g==="^")&&i===t+1){c=!0,i++;continue}if(g==="]"&&a&&!l){d=i+1;break}if(a=!0,g==="\\"&&!l){l=!0,i++;continue}if(g==="["&&!l){for(let[f,[S,w,v]]of Object.entries(kA))if(n.startsWith(f,i)){if(p)return["$.",!1,n.length-t,!0];i+=f.length,v?o.push(S):r.push(S),s=s||w;continue e}}if(l=!1,p){g>p?r.push(ua(p)+"-"+ua(g)):g===p&&r.push(ua(g)),p="",i++;continue}if(n.startsWith("-]",i+1)){r.push(ua(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){p=g,i+=2;continue}r.push(ua(g)),i++}if(d<i)return["",!1,0,!1];if(!r.length&&!o.length)return["$.",!1,n.length-t,!0];if(o.length===0&&r.length===1&&/^\\?.$/.test(r[0])&&!c){let g=r[0].length===2?r[0].slice(-1):r[0];return[_A(g),!1,d-t,!1]}let u="["+(c?"^":"")+eS(r)+"]",m="["+(c?"":"^")+eS(o)+"]";return[r.length&&o.length?"("+u+"|"+m+")":r.length?u:m,s,d-t,!0]};var hn=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/\[([^\/\\])\]/g,"$1"):n.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var DA=new Set(["!","?","+","*","@"]),nS=n=>DA.has(n),FA="(?!(?:^|/)\\.\\.?(?:$|/))",Gs="(?!\\.)",UA=new Set(["[","."]),BA=new Set(["..","."]),zA=new Set("().*{}+?[]^$\\!"),HA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),xd="[^/]",rS=xd+"*?",oS=xd+"+?",jo=class n{type;#e;#t;#i=!1;#r=[];#a;#w;#c;#p=!1;#s;#l;#o=!1;constructor(e,t,r={}){this.type=e,e&&(this.#t=!0),this.#a=t,this.#e=this.#a?this.#a.#e:this,this.#s=this.#e===this?r:this.#e.#s,this.#c=this.#e===this?[]:this.#e.#c,e==="!"&&!this.#e.#p&&this.#c.push(this),this.#w=this.#a?this.#a.#r.length:0}get hasMagic(){if(this.#t!==void 0)return this.#t;for(let e of this.#r)if(typeof e!="string"&&(e.type||e.hasMagic))return this.#t=!0;return this.#t}toString(){return this.#l!==void 0?this.#l:this.type?this.#l=this.type+"("+this.#r.map(e=>String(e)).join("|")+")":this.#l=this.#r.map(e=>String(e)).join("")}#f(){if(this!==this.#e)throw new Error("should only call on root");if(this.#p)return this;this.toString(),this.#p=!0;let e;for(;e=this.#c.pop();){if(e.type!=="!")continue;let t=e,r=t.#a;for(;r;){for(let o=t.#w+1;!r.type&&o<r.#r.length;o++)for(let i of e.#r){if(typeof i=="string")throw new Error("string part in extglob AST??");i.copyIn(r.#r[o])}t=r,r=t.#a}}return this}push(...e){for(let t of e)if(t!==""){if(typeof t!="string"&&!(t instanceof n&&t.#a===this))throw new Error("invalid part: "+t);this.#r.push(t)}}toJSON(){let e=this.type===null?this.#r.slice().map(t=>typeof t=="string"?t:t.toJSON()):[this.type,...this.#r.map(t=>t.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#e||this.#e.#p&&this.#a?.type==="!")&&e.push({}),e}isStart(){if(this.#e===this)return!0;if(!this.#a?.isStart())return!1;if(this.#w===0)return!0;let e=this.#a;for(let t=0;t<this.#w;t++){let r=e.#r[t];if(!(r instanceof n&&r.type==="!"))return!1}return!0}isEnd(){if(this.#e===this||this.#a?.type==="!")return!0;if(!this.#a?.isEnd())return!1;if(!this.type)return this.#a?.isEnd();let e=this.#a?this.#a.#r.length:0;return this.#w===e-1}copyIn(e){typeof e=="string"?this.push(e):this.push(e.clone(this))}clone(e){let t=new n(this.type,e);for(let r of this.#r)t.copyIn(r);return t}static#S(e,t,r,o){let i=!1,a=!1,s=-1,l=!1;if(t.type===null){let m=r,h="";for(;m<e.length;){let g=e.charAt(m++);if(i||g==="\\"){i=!i,h+=g;continue}if(a){m===s+1?(g==="^"||g==="!")&&(l=!0):g==="]"&&!(m===s+2&&l)&&(a=!1),h+=g;continue}else if(g==="["){a=!0,s=m,l=!1,h+=g;continue}if(!o.noext&&nS(g)&&e.charAt(m)==="("){t.push(h),h="";let f=new n(g,t);m=n.#S(e,f,m,o),t.push(f);continue}h+=g}return t.push(h),m}let c=r+1,d=new n(null,t),p=[],u="";for(;c<e.length;){let m=e.charAt(c++);if(i||m==="\\"){i=!i,u+=m;continue}if(a){c===s+1?(m==="^"||m==="!")&&(l=!0):m==="]"&&!(c===s+2&&l)&&(a=!1),u+=m;continue}else if(m==="["){a=!0,s=c,l=!1,u+=m;continue}if(nS(m)&&e.charAt(c)==="("){d.push(u),u="";let h=new n(m,d);d.push(h),c=n.#S(e,h,c,o);continue}if(m==="|"){d.push(u),u="",p.push(d),d=new n(null,t);continue}if(m===")")return u===""&&t.#r.length===0&&(t.#o=!0),d.push(u),u="",t.push(...p,d),c;u+=m}return t.type=null,t.#t=void 0,t.#r=[e.substring(r-1)],c}static fromGlob(e,t={}){let r=new n(null,void 0,t);return n.#S(e,r,0,t),r}toMMPattern(){if(this!==this.#e)return this.#e.toMMPattern();let e=this.toString(),[t,r,o,i]=this.toRegExpSource();if(!(o||this.#t||this.#s.nocase&&!this.#s.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return r;let s=(this.#s.nocase?"i":"")+(i?"u":"");return Object.assign(new RegExp(`^${t}$`,s),{_src:t,_glob:e})}get options(){return this.#s}toRegExpSource(e){let t=e??!!this.#s.dot;if(this.#e===this&&this.#f(),!this.type){let l=this.isStart()&&this.isEnd(),c=this.#r.map(m=>{let[h,g,f,S]=typeof m=="string"?n.#u(m,this.#t,l):m.toRegExpSource(e);return this.#t=this.#t||f,this.#i=this.#i||S,h}).join(""),d="";if(this.isStart()&&typeof this.#r[0]=="string"&&!(this.#r.length===1&&BA.has(this.#r[0]))){let h=UA,g=t&&h.has(c.charAt(0))||c.startsWith("\\.")&&h.has(c.charAt(2))||c.startsWith("\\.\\.")&&h.has(c.charAt(4)),f=!t&&!e&&h.has(c.charAt(0));d=g?FA:f?Gs:""}let p="";return this.isEnd()&&this.#e.#p&&this.#a?.type==="!"&&(p="(?:$|\\/)"),[d+c+p,hn(c),this.#t=!!this.#t,this.#i]}let r=this.type==="*"||this.type==="+",o=this.type==="!"?"(?:(?!(?:":"(?:",i=this.#m(t);if(this.isStart()&&this.isEnd()&&!i&&this.type!=="!"){let l=this.toString();return this.#r=[l],this.type=null,this.#t=void 0,[l,hn(this.toString()),!1,!1]}let a=!r||e||t||!Gs?"":this.#m(!0);a===i&&(a=""),a&&(i=`(?:${i})(?:${a})*?`);let s="";if(this.type==="!"&&this.#o)s=(this.isStart()&&!t?Gs:"")+oS;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?Gs:"")+rS+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&a?")":this.type==="*"&&a?")?":`)${this.type}`;s=o+i+l}return[s,hn(i),this.#t=!!this.#t,this.#i]}#m(e){return this.#r.map(t=>{if(typeof t=="string")throw new Error("string type in extglob ast??");let[r,o,i,a]=t.toRegExpSource(e);return this.#i=this.#i||a,r}).filter(t=>!(this.isStart()&&this.isEnd())||!!t).join("|")}static#u(e,t,r=!1){let o=!1,i="",a=!1;for(let s=0;s<e.length;s++){let l=e.charAt(s);if(o){o=!1,i+=(zA.has(l)?"\\":"")+l;continue}if(l==="\\"){s===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,d,p,u]=tS(e,s);if(p){i+=c,a=a||d,s+=p-1,t=t||u;continue}}if(l==="*"){r&&e==="*"?i+=oS:i+=rS,t=!0;continue}if(l==="?"){i+=xd,t=!0;continue}i+=HA(l)}return[i,hn(e),!!t,a]}};var $o=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/[?*()[\]]/g,"[$&]"):n.replace(/[?*()[\]\\]/g,"\\$&");var xt=(n,e,t={})=>(pa(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Bt(e,t).match(n)),jA=/^\*+([^+@!?\*\[\(]*)$/,$A=n=>e=>!e.startsWith(".")&&e.endsWith(n),GA=n=>e=>e.endsWith(n),WA=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),VA=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),qA=/^\*+\.\*+$/,KA=n=>!n.startsWith(".")&&n.includes("."),YA=n=>n!=="."&&n!==".."&&n.includes("."),JA=/^\.\*+$/,XA=n=>n!=="."&&n!==".."&&n.startsWith("."),ZA=/^\*+$/,QA=n=>n.length!==0&&!n.startsWith("."),eI=n=>n.length!==0&&n!=="."&&n!=="..",tI=/^\?+([^+@!?\*\[\(]*)?$/,nI=([n,e=""])=>{let t=lS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},rI=([n,e=""])=>{let t=cS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},oI=([n,e=""])=>{let t=cS([n]);return e?r=>t(r)&&r.endsWith(e):t},iI=([n,e=""])=>{let t=lS([n]);return e?r=>t(r)&&r.endsWith(e):t},lS=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},cS=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},dS=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",iS={win32:{sep:"\\"},posix:{sep:"/"}},aI=dS==="win32"?iS.win32.sep:iS.posix.sep;xt.sep=aI;var st=Symbol("globstar **");xt.GLOBSTAR=st;var sI="[^/]",lI=sI+"*?",cI="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",dI="(?:(?!(?:\\/|^)\\.).)*?",pI=(n,e={})=>t=>xt(t,n,e);xt.filter=pI;var Qt=(n,e={})=>Object.assign({},n,e),uI=n=>{if(!n||typeof n!="object"||!Object.keys(n).length)return xt;let e=xt;return Object.assign((r,o,i={})=>e(r,o,Qt(n,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,Qt(n,i))}static defaults(o){return e.defaults(Qt(n,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,a={}){super(o,i,Qt(n,a))}static fromGlob(o,i={}){return e.AST.fromGlob(o,Qt(n,i))}},unescape:(r,o={})=>e.unescape(r,Qt(n,o)),escape:(r,o={})=>e.escape(r,Qt(n,o)),filter:(r,o={})=>e.filter(r,Qt(n,o)),defaults:r=>e.defaults(Qt(n,r)),makeRe:(r,o={})=>e.makeRe(r,Qt(n,o)),braceExpand:(r,o={})=>e.braceExpand(r,Qt(n,o)),match:(r,o,i={})=>e.match(r,o,Qt(n,i)),sep:e.sep,GLOBSTAR:st})};xt.defaults=uI;var pS=(n,e={})=>(pa(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,sS.default)(n));xt.braceExpand=pS;var mI=(n,e={})=>new Bt(n,e).makeRe();xt.makeRe=mI;var hI=(n,e,t={})=>{let r=new Bt(e,t);return n=n.filter(o=>r.match(o)),r.options.nonull&&!n.length&&n.push(e),n};xt.match=hI;var aS=/[?*]|[+@!]\(.*?\)|\[|\]/,gI=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Bt=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,t={}){pa(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||dS,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!t.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!t.nonegate,this.comment=!1,this.empty=!1,this.partial=!!t.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=t.windowsNoMagicRoot!==void 0?t.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let t of e)if(typeof t!="string")return!0;return!1}debug(...e){}make(){let e=this.pattern,t=this.options;if(!t.nocomment&&e.charAt(0)==="#"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],t.debug&&(this.debug=(...i)=>console.error(...i)),this.debug(this.pattern,this.globSet);let r=this.globSet.map(i=>this.slashSplit(i));this.globParts=this.preprocess(r),this.debug(this.pattern,this.globParts);let o=this.globParts.map((i,a,s)=>{if(this.isWindows&&this.windowsNoMagicRoot){let l=i[0]===""&&i[1]===""&&(i[2]==="?"||!aS.test(i[2]))&&!aS.test(i[3]),c=/^[a-z]:/i.test(i[0]);if(l)return[...i.slice(0,4),...i.slice(4).map(d=>this.parse(d))];if(c)return[i[0],...i.slice(1).map(d=>this.parse(d))]}return i.map(l=>this.parse(l))});if(this.debug(this.pattern,o),this.set=o.filter(i=>i.indexOf(!1)===-1),this.isWindows)for(let i=0;i<this.set.length;i++){let a=this.set[i];a[0]===""&&a[1]===""&&this.globParts[i][2]==="?"&&typeof a[3]=="string"&&/^[a-z]:$/i.test(a[3])&&(a[2]="?")}this.debug(this.pattern,this.set)}preprocess(e){if(this.options.noglobstar)for(let r=0;r<e.length;r++)for(let o=0;o<e[r].length;o++)e[r][o]==="**"&&(e[r][o]="*");let{optimizationLevel:t=1}=this.options;return t>=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):t>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(t=>{let r=-1;for(;(r=t.indexOf("**",r+1))!==-1;){let o=r;for(;t[o+1]==="**";)o++;o!==r&&t.splice(r,o-r)}return t})}levelOneOptimize(e){return e.map(t=>(t=t.reduce((r,o)=>{let i=r[r.length-1];return o==="**"&&i==="**"?r:o===".."&&i&&i!==".."&&i!=="."&&i!=="**"?(r.pop(),r):(r.push(o),r)},[]),t.length===0?[""]:t))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let t=!1;do{if(t=!1,!this.preserveMultipleSlashes){for(let o=1;o<e.length-1;o++){let i=e[o];o===1&&i===""&&e[0]===""||(i==="."||i==="")&&(t=!0,e.splice(o,1),o--)}e[0]==="."&&e.length===2&&(e[1]==="."||e[1]==="")&&(t=!0,e.pop())}let r=0;for(;(r=e.indexOf("..",r+1))!==-1;){let o=e[r-1];o&&o!=="."&&o!==".."&&o!=="**"&&(t=!0,e.splice(r-1,2),r-=2)}}while(t);return e.length===0?[""]:e}firstPhasePreProcess(e){let t=!1;do{t=!1;for(let r of e){let o=-1;for(;(o=r.indexOf("**",o+1))!==-1;){let a=o;for(;r[a+1]==="**";)a++;a>o&&r.splice(o+1,a-o);let s=r[o+1],l=r[o+2],c=r[o+3];if(s!==".."||!l||l==="."||l===".."||!c||c==="."||c==="..")continue;t=!0,r.splice(o,1);let d=r.slice(0);d[o]="**",e.push(d),o--}if(!this.preserveMultipleSlashes){for(let a=1;a<r.length-1;a++){let s=r[a];a===1&&s===""&&r[0]===""||(s==="."||s==="")&&(t=!0,r.splice(a,1),a--)}r[0]==="."&&r.length===2&&(r[1]==="."||r[1]==="")&&(t=!0,r.pop())}let i=0;for(;(i=r.indexOf("..",i+1))!==-1;){let a=r[i-1];if(a&&a!=="."&&a!==".."&&a!=="**"){t=!0;let l=i===1&&r[i+1]==="**"?["."]:[];r.splice(i-1,2,...l),r.length===0&&r.push(""),i-=2}}}}while(t);return e}secondPhasePreProcess(e){for(let t=0;t<e.length-1;t++)for(let r=t+1;r<e.length;r++){let o=this.partsMatch(e[t],e[r],!this.preserveMultipleSlashes);if(o){e[t]=[],e[r]=o;break}}return e.filter(t=>t.length)}partsMatch(e,t,r=!1){let o=0,i=0,a=[],s="";for(;o<e.length&&i<t.length;)if(e[o]===t[i])a.push(s==="b"?t[i]:e[o]),o++,i++;else if(r&&e[o]==="**"&&t[i]===e[o+1])a.push(e[o]),o++;else if(r&&t[i]==="**"&&e[o]===t[i+1])a.push(t[i]),i++;else if(e[o]==="*"&&t[i]&&(this.options.dot||!t[i].startsWith("."))&&t[i]!=="**"){if(s==="b")return!1;s="a",a.push(e[o]),o++,i++}else if(t[i]==="*"&&e[o]&&(this.options.dot||!e[o].startsWith("."))&&e[o]!=="**"){if(s==="a")return!1;s="b",a.push(t[i]),o++,i++}else return!1;return e.length===t.length&&a}parseNegate(){if(this.nonegate)return;let e=this.pattern,t=!1,r=0;for(let o=0;o<e.length&&e.charAt(o)==="!";o++)t=!t,r++;r&&(this.pattern=e.slice(r)),this.negate=t}matchOne(e,t,r=!1){let o=this.options;if(this.isWindows){let g=typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0]),f=!g&&e[0]===""&&e[1]===""&&e[2]==="?"&&/^[a-z]:$/i.test(e[3]),S=typeof t[0]=="string"&&/^[a-z]:$/i.test(t[0]),w=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),v=f?3:g?0:void 0,b=w?3:S?0:void 0;if(typeof v=="number"&&typeof b=="number"){let[T,C]=[e[v],t[b]];T.toLowerCase()===C.toLowerCase()&&(t[b]=T,b>v?t=t.slice(b):v>b&&(e=e.slice(v)))}}let{optimizationLevel:i=1}=this.options;i>=2&&(e=this.levelTwoFileOptimize(e)),this.debug("matchOne",this,{file:e,pattern:t}),this.debug("matchOne",e.length,t.length);for(var a=0,s=0,l=e.length,c=t.length;a<l&&s<c;a++,s++){this.debug("matchOne loop");var d=t[s],p=e[a];if(this.debug(t,d,p),d===!1)return!1;if(d===st){this.debug("GLOBSTAR",[t,d,p]);var u=a,m=s+1;if(m===c){for(this.debug("** at the end");a<l;a++)if(e[a]==="."||e[a]===".."||!o.dot&&e[a].charAt(0)===".")return!1;return!0}for(;u<l;){var h=e[u];if(this.debug(`
|
|
43
43
|
globstar while`,e,u,t,m,h),this.matchOne(e.slice(u),t.slice(m),r))return this.debug("globstar found match!",u,l,h),!0;if(h==="."||h===".."||!o.dot&&h.charAt(0)==="."){this.debug("dot detected!",e,u,t,m);break}this.debug("globstar swallow a segment, and continue"),u++}return!!(r&&(this.debug(`
|
|
44
|
-
>>> no match, partial?`,e,u,t,m),u===l))}let g;if(typeof d=="string"?(g=p===d,this.debug("string match",d,p,g)):(g=d.test(p),this.debug("pattern match",d,p,g)),!g)return!1}if(a===l&&s===c)return!0;if(a===l)return r;if(s===c)return a===l-1&&e[a]==="";throw new Error("wtf?")}braceExpand(){return Qf(this.pattern,this.options)}parse(e){la(e);let t=this.options;if(e==="**")return at;if(e==="")return"";let r,o=null;(r=e.match(UA))?o=t.dot?zA:BA:(r=e.match(IA))?o=(t.nocase?t.dot?MA:OA:t.dot?LA:PA)(r[1]):(r=e.match(HA))?o=(t.nocase?t.dot?jA:$A:t.dot?GA:WA)(r):(r=e.match(NA))?o=t.dot?_A:kA:(r=e.match(DA))&&(o=FA);let i=zo.fromGlob(e,this.options).toMMPattern();return o&&typeof i=="object"&&Reflect.defineProperty(i,"test",{value:o}),i}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let t=this.options,r=t.noglobstar?KA:t.dot?YA:JA,o=new Set(t.nocase?["i"]:[]),i=e.map(l=>{let c=l.map(d=>{if(d instanceof RegExp)for(let p of d.flags.split(""))o.add(p);return typeof d=="string"?tI(d):d===at?at:d._src});return c.forEach((d,p)=>{let u=c[p+1],m=c[p-1];d!==at||m===at||(m===void 0?u!==void 0&&u!==at?c[p+1]="(?:\\/|"+r+"\\/)?"+u:c[p]=r:u===void 0?c[p-1]=m+"(?:\\/|"+r+")?":u!==at&&(c[p-1]=m+"(?:\\/|\\/"+r+"\\/)"+u,c[p+1]=at))}),c.filter(d=>d!==at).join("/")}).join("|"),[a,s]=e.length>1?["(?:",")"]:["",""];i="^"+a+i+s+"$",this.negate&&(i="^(?!"+i+").+$");try{this.regexp=new RegExp(i,[...o].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,t=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&t)return!0;let r=this.options;this.isWindows&&(e=e.split("\\").join("/"));let o=this.slashSplit(e);this.debug(this.pattern,"split",o);let i=this.set;this.debug(this.pattern,"set",i);let a=o[o.length-1];if(!a)for(let s=o.length-2;!a&&s>=0;s--)a=o[s];for(let s=0;s<i.length;s++){let l=i[s],c=o;if(r.matchBase&&l.length===1&&(c=[a]),this.matchOne(c,l,t))return r.flipNegate?!0:!this.negate}return r.flipNegate?!1:this.negate}static defaults(e){return wt.defaults(e).Minimatch}};wt.AST=zo;wt.Minimatch=Ft;wt.escape=Ho;wt.unescape=un;import{fileURLToPath as NI}from"node:url";var $o=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,tS=new Set,yd=typeof process=="object"&&process?process:{},nS=(n,e,t,r)=>{typeof yd.emitWarning=="function"?yd.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},Bs=globalThis.AbortController,eS=globalThis.AbortSignal;if(typeof Bs>"u"){eS=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},Bs=class{constructor(){e()}signal=new eS;abort(r){if(!this.signal.aborted){this.signal.reason=r,this.signal.aborted=!0;for(let o of this.signal._onabort)o(r);this.signal.onabort?.(r)}}};let n=yd.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{n&&(n=!1,nS("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e))}}var nI=n=>!tS.has(n),jK=Symbol("type"),cr=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),rS=n=>cr(n)?n<=Math.pow(2,8)?Uint8Array:n<=Math.pow(2,16)?Uint16Array:n<=Math.pow(2,32)?Uint32Array:n<=Number.MAX_SAFE_INTEGER?jo:null:null,jo=class extends Array{constructor(e){super(e),this.fill(0)}},bd=class n{heap;length;static#e=!1;static create(e){let t=rS(e);if(!t)return[];n.#e=!0;let r=new n(e,t);return n.#e=!1,r}constructor(e,t){if(!n.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},da=class n{#e;#t;#i;#r;#a;#w;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#c;#p;#s;#l;#o;#f;#S;#m;#u;#x;#g;#E;#C;#b;#v;#T;#h;static unsafeExposeInternals(e){return{starts:e.#C,ttls:e.#b,sizes:e.#E,keyMap:e.#s,keyList:e.#l,valList:e.#o,next:e.#f,prev:e.#S,get head(){return e.#m},get tail(){return e.#u},free:e.#x,isBackgroundFetch:t=>e.#d(t),backgroundFetch:(t,r,o,i)=>e.#U(t,r,o,i),moveToTail:t=>e.#z(t),indexes:t=>e.#A(t),rindexes:t=>e.#I(t),isStale:t=>e.#y(t)}}get max(){return this.#e}get maxSize(){return this.#t}get calculatedSize(){return this.#p}get size(){return this.#c}get fetchMethod(){return this.#a}get memoMethod(){return this.#w}get dispose(){return this.#i}get disposeAfter(){return this.#r}constructor(e){let{max:t=0,ttl:r,ttlResolution:o=1,ttlAutopurge:i,updateAgeOnGet:a,updateAgeOnHas:s,allowStale:l,dispose:c,disposeAfter:d,noDisposeOnSet:p,noUpdateTTL:u,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:g,fetchMethod:f,memoMethod:S,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:v,allowStaleOnFetchRejection:b,allowStaleOnFetchAbort:x,ignoreFetchAbort:C}=e;if(t!==0&&!cr(t))throw new TypeError("max option must be a nonnegative integer");let A=t?rS(t):Array;if(!A)throw new Error("invalid max value: "+t);if(this.#e=t,this.#t=m,this.maxEntrySize=h||this.#t,this.sizeCalculation=g,this.sizeCalculation){if(!this.#t&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#w=S,f!==void 0&&typeof f!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#a=f,this.#T=!!f,this.#s=new Map,this.#l=new Array(t).fill(void 0),this.#o=new Array(t).fill(void 0),this.#f=new A(t),this.#S=new A(t),this.#m=0,this.#u=0,this.#x=bd.create(t),this.#c=0,this.#p=0,typeof c=="function"&&(this.#i=c),typeof d=="function"?(this.#r=d,this.#g=[]):(this.#r=void 0,this.#g=void 0),this.#v=!!this.#i,this.#h=!!this.#r,this.noDisposeOnSet=!!p,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!b,this.allowStaleOnFetchAbort=!!x,this.ignoreFetchAbort=!!C,this.maxEntrySize!==0){if(this.#t!==0&&!cr(this.#t))throw new TypeError("maxSize must be a positive integer if specified");if(!cr(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#L()}if(this.allowStale=!!l,this.noDeleteOnStaleGet=!!v,this.updateAgeOnGet=!!a,this.updateAgeOnHas=!!s,this.ttlResolution=cr(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=r||0,this.ttl){if(!cr(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#P()}if(this.#e===0&&this.ttl===0&&this.#t===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#e&&!this.#t){let N="LRU_CACHE_UNBOUNDED";nI(N)&&(tS.add(N),nS("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",N,n))}}getRemainingTTL(e){return this.#s.has(e)?1/0:0}#P(){let e=new jo(this.#e),t=new jo(this.#e);this.#b=e,this.#C=t,this.#M=(i,a,s=$o.now())=>{if(t[i]=a!==0?s:0,e[i]=a,a!==0&&this.ttlAutopurge){let l=setTimeout(()=>{this.#y(i)&&this.#O(this.#l[i],"expire")},a+1);l.unref&&l.unref()}},this.#R=i=>{t[i]=e[i]!==0?$o.now():0},this.#n=(i,a)=>{if(e[a]){let s=e[a],l=t[a];if(!s||!l)return;i.ttl=s,i.start=l,i.now=r||o();let c=i.now-l;i.remainingTTL=s-c}};let r=0,o=()=>{let i=$o.now();if(this.ttlResolution>0){r=i;let a=setTimeout(()=>r=0,this.ttlResolution);a.unref&&a.unref()}return i};this.getRemainingTTL=i=>{let a=this.#s.get(i);if(a===void 0)return 0;let s=e[a],l=t[a];if(!s||!l)return 1/0;let c=(r||o())-l;return s-c},this.#y=i=>{let a=t[i],s=e[i];return!!s&&!!a&&(r||o())-a>s}}#R=()=>{};#n=()=>{};#M=()=>{};#y=()=>!1;#L(){let e=new jo(this.#e);this.#p=0,this.#E=e,this.#N=t=>{this.#p-=e[t],e[t]=0},this.#_=(t,r,o,i)=>{if(this.#d(r))return 0;if(!cr(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(r,t),!cr(o))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return o},this.#k=(t,r,o)=>{if(e[t]=r,this.#t){let i=this.#t-e[t];for(;this.#p>i;)this.#F(!0)}this.#p+=e[t],o&&(o.entrySize=r,o.totalCalculatedSize=this.#p)}}#N=e=>{};#k=(e,t,r)=>{};#_=(e,t,r,o)=>{if(r||o)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#u;!(!this.#D(t)||((e||!this.#y(t))&&(yield t),t===this.#m));)t=this.#S[t]}*#I({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#m;!(!this.#D(t)||((e||!this.#y(t))&&(yield t),t===this.#u));)t=this.#f[t]}#D(e){return e!==void 0&&this.#s.get(this.#l[e])===e}*entries(){for(let e of this.#A())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*rentries(){for(let e of this.#I())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*keys(){for(let e of this.#A()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*rkeys(){for(let e of this.#I()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*values(){for(let e of this.#A())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}*rvalues(){for(let e of this.#I())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;if(i!==void 0&&e(i,this.#l[r],this))return this.get(this.#l[r],t)}}forEach(e,t=this){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}rforEach(e,t=this){for(let r of this.#I()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}purgeStale(){let e=!1;for(let t of this.#I({allowStale:!0}))this.#y(t)&&(this.#O(this.#l[t],"expire"),e=!0);return e}info(e){let t=this.#s.get(e);if(t===void 0)return;let r=this.#o[t],o=this.#d(r)?r.__staleWhileFetching:r;if(o===void 0)return;let i={value:o};if(this.#b&&this.#C){let a=this.#b[t],s=this.#C[t];if(a&&s){let l=a-($o.now()-s);i.ttl=l,i.start=Date.now()}}return this.#E&&(i.size=this.#E[t]),i}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let r=this.#l[t],o=this.#o[t],i=this.#d(o)?o.__staleWhileFetching:o;if(i===void 0||r===void 0)continue;let a={value:i};if(this.#b&&this.#C){a.ttl=this.#b[t];let s=$o.now()-this.#C[t];a.start=Math.floor(Date.now()-s)}this.#E&&(a.size=this.#E[t]),e.unshift([r,a])}return e}load(e){this.clear();for(let[t,r]of e){if(r.start){let o=Date.now()-r.start;r.start=$o.now()-o}this.set(t,r.value,r)}}set(e,t,r={}){if(t===void 0)return this.delete(e),this;let{ttl:o=this.ttl,start:i,noDisposeOnSet:a=this.noDisposeOnSet,sizeCalculation:s=this.sizeCalculation,status:l}=r,{noUpdateTTL:c=this.noUpdateTTL}=r,d=this.#_(e,t,r.size||0,s);if(this.maxEntrySize&&d>this.maxEntrySize)return l&&(l.set="miss",l.maxEntrySizeExceeded=!0),this.#O(e,"set"),this;let p=this.#c===0?void 0:this.#s.get(e);if(p===void 0)p=this.#c===0?this.#u:this.#x.length!==0?this.#x.pop():this.#c===this.#e?this.#F(!1):this.#c,this.#l[p]=e,this.#o[p]=t,this.#s.set(e,p),this.#f[this.#u]=p,this.#S[p]=this.#u,this.#u=p,this.#c++,this.#k(p,d,l),l&&(l.set="add"),c=!1;else{this.#z(p);let u=this.#o[p];if(t!==u){if(this.#T&&this.#d(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:m}=u;m!==void 0&&!a&&(this.#v&&this.#i?.(m,e,"set"),this.#h&&this.#g?.push([m,e,"set"]))}else a||(this.#v&&this.#i?.(u,e,"set"),this.#h&&this.#g?.push([u,e,"set"]));if(this.#N(p),this.#k(p,d,l),this.#o[p]=t,l){l.set="replace";let m=u&&this.#d(u)?u.__staleWhileFetching:u;m!==void 0&&(l.oldValue=m)}}else l&&(l.set="update")}if(o!==0&&!this.#b&&this.#P(),this.#b&&(c||this.#M(p,o,i),l&&this.#n(l,p)),!a&&this.#h&&this.#g){let u=this.#g,m;for(;m=u?.shift();)this.#r?.(...m)}return this}pop(){try{for(;this.#c;){let e=this.#o[this.#m];if(this.#F(!0),this.#d(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#h&&this.#g){let e=this.#g,t;for(;t=e?.shift();)this.#r?.(...t)}}}#F(e){let t=this.#m,r=this.#l[t],o=this.#o[t];return this.#T&&this.#d(o)?o.__abortController.abort(new Error("evicted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(o,r,"evict"),this.#h&&this.#g?.push([o,r,"evict"])),this.#N(t),e&&(this.#l[t]=void 0,this.#o[t]=void 0,this.#x.push(t)),this.#c===1?(this.#m=this.#u=0,this.#x.length=0):this.#m=this.#f[t],this.#s.delete(r),this.#c--,t}has(e,t={}){let{updateAgeOnHas:r=this.updateAgeOnHas,status:o}=t,i=this.#s.get(e);if(i!==void 0){let a=this.#o[i];if(this.#d(a)&&a.__staleWhileFetching===void 0)return!1;if(this.#y(i))o&&(o.has="stale",this.#n(o,i));else return r&&this.#R(i),o&&(o.has="hit",this.#n(o,i)),!0}else o&&(o.has="miss");return!1}peek(e,t={}){let{allowStale:r=this.allowStale}=t,o=this.#s.get(e);if(o===void 0||!r&&this.#y(o))return;let i=this.#o[o];return this.#d(i)?i.__staleWhileFetching:i}#U(e,t,r,o){let i=t===void 0?void 0:this.#o[t];if(this.#d(i))return i;let a=new Bs,{signal:s}=r;s?.addEventListener("abort",()=>a.abort(s.reason),{signal:a.signal});let l={signal:a.signal,options:r,context:o},c=(g,f=!1)=>{let{aborted:S}=a.signal,w=r.ignoreFetchAbort&&g!==void 0;if(r.status&&(S&&!f?(r.status.fetchAborted=!0,r.status.fetchError=a.signal.reason,w&&(r.status.fetchAbortIgnored=!0)):r.status.fetchResolved=!0),S&&!w&&!f)return p(a.signal.reason);let v=m;return this.#o[t]===m&&(g===void 0?v.__staleWhileFetching?this.#o[t]=v.__staleWhileFetching:this.#O(e,"fetch"):(r.status&&(r.status.fetchUpdated=!0),this.set(e,g,l.options))),g},d=g=>(r.status&&(r.status.fetchRejected=!0,r.status.fetchError=g),p(g)),p=g=>{let{aborted:f}=a.signal,S=f&&r.allowStaleOnFetchAbort,w=S||r.allowStaleOnFetchRejection,v=w||r.noDeleteOnFetchRejection,b=m;if(this.#o[t]===m&&(!v||b.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=b.__staleWhileFetching)),w)return r.status&&b.__staleWhileFetching!==void 0&&(r.status.returnedStale=!0),b.__staleWhileFetching;if(b.__returned===b)throw g},u=(g,f)=>{let S=this.#a?.(e,i,l);S&&S instanceof Promise&&S.then(w=>g(w===void 0?void 0:w),f),a.signal.addEventListener("abort",()=>{(!r.ignoreFetchAbort||r.allowStaleOnFetchAbort)&&(g(void 0),r.allowStaleOnFetchAbort&&(g=w=>c(w,!0)))})};r.status&&(r.status.fetchDispatched=!0);let m=new Promise(u).then(c,d),h=Object.assign(m,{__abortController:a,__staleWhileFetching:i,__returned:void 0});return t===void 0?(this.set(e,h,{...l.options,status:void 0}),t=this.#s.get(e)):this.#o[t]=h,h}#d(e){if(!this.#T)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof Bs}async fetch(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,ttl:a=this.ttl,noDisposeOnSet:s=this.noDisposeOnSet,size:l=0,sizeCalculation:c=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:p=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:m=this.ignoreFetchAbort,allowStaleOnFetchAbort:h=this.allowStaleOnFetchAbort,context:g,forceRefresh:f=!1,status:S,signal:w}=t;if(!this.#T)return S&&(S.fetch="get"),this.get(e,{allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let v={allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:a,noDisposeOnSet:s,size:l,sizeCalculation:c,noUpdateTTL:d,noDeleteOnFetchRejection:p,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:S,signal:w},b=this.#s.get(e);if(b===void 0){S&&(S.fetch="miss");let x=this.#U(e,b,v,g);return x.__returned=x}else{let x=this.#o[b];if(this.#d(x)){let H=r&&x.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",H&&(S.returnedStale=!0)),H?x.__staleWhileFetching:x.__returned=x}let C=this.#y(b);if(!f&&!C)return S&&(S.fetch="hit"),this.#z(b),o&&this.#R(b),S&&this.#n(S,b),x;let A=this.#U(e,b,v,g),P=A.__staleWhileFetching!==void 0&&r;return S&&(S.fetch=C?"stale":"refresh",P&&C&&(S.returnedStale=!0)),P?A.__staleWhileFetching:A.__returned=A}}async forceFetch(e,t={}){let r=await this.fetch(e,t);if(r===void 0)throw new Error("fetch() returned undefined");return r}memo(e,t={}){let r=this.#w;if(!r)throw new Error("no memoMethod provided to constructor");let{context:o,forceRefresh:i,...a}=t,s=this.get(e,a);if(!i&&s!==void 0)return s;let l=r(e,s,{options:a,context:o});return this.set(e,l,a),l}get(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,status:a}=t,s=this.#s.get(e);if(s!==void 0){let l=this.#o[s],c=this.#d(l);return a&&this.#n(a,s),this.#y(s)?(a&&(a.get="stale"),c?(a&&r&&l.__staleWhileFetching!==void 0&&(a.returnedStale=!0),r?l.__staleWhileFetching:void 0):(i||this.#O(e,"expire"),a&&r&&(a.returnedStale=!0),r?l:void 0)):(a&&(a.get="hit"),c?l.__staleWhileFetching:(this.#z(s),o&&this.#R(s),l))}else a&&(a.get="miss")}#B(e,t){this.#S[t]=e,this.#f[e]=t}#z(e){e!==this.#u&&(e===this.#m?this.#m=this.#f[e]:this.#B(this.#S[e],this.#f[e]),this.#B(this.#u,e),this.#u=e)}delete(e){return this.#O(e,"delete")}#O(e,t){let r=!1;if(this.#c!==0){let o=this.#s.get(e);if(o!==void 0)if(r=!0,this.#c===1)this.#H(t);else{this.#N(o);let i=this.#o[o];if(this.#d(i)?i.__abortController.abort(new Error("deleted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(i,e,t),this.#h&&this.#g?.push([i,e,t])),this.#s.delete(e),this.#l[o]=void 0,this.#o[o]=void 0,o===this.#u)this.#u=this.#S[o];else if(o===this.#m)this.#m=this.#f[o];else{let a=this.#S[o];this.#f[a]=this.#f[o];let s=this.#f[o];this.#S[s]=this.#S[o]}this.#c--,this.#x.push(o)}}if(this.#h&&this.#g?.length){let o=this.#g,i;for(;i=o?.shift();)this.#r?.(...i)}return r}clear(){return this.#H("delete")}#H(e){for(let t of this.#I({allowStale:!0})){let r=this.#o[t];if(this.#d(r))r.__abortController.abort(new Error("deleted"));else{let o=this.#l[t];this.#v&&this.#i?.(r,o,e),this.#h&&this.#g?.push([r,o,e])}}if(this.#s.clear(),this.#o.fill(void 0),this.#l.fill(void 0),this.#b&&this.#C&&(this.#b.fill(0),this.#C.fill(0)),this.#E&&this.#E.fill(0),this.#m=0,this.#u=0,this.#x.length=0,this.#p=0,this.#c=0,this.#h&&this.#g){let t=this.#g,r;for(;r=t?.shift();)this.#r?.(...r)}}};import{posix as mI,win32 as Pd}from"node:path";import{fileURLToPath as hI}from"node:url";import{lstatSync as gI,readdir as fI,readdirSync as SI,readlinkSync as yI,realpathSync as bI}from"fs";import*as wI from"node:fs";import{lstat as TI,readdir as xI,readlink as EI,realpath as CI}from"node:fs/promises";import{EventEmitter as Rd}from"node:events";import lS from"node:stream";import{StringDecoder as rI}from"node:string_decoder";var oS=typeof process=="object"&&process?process:{stdout:null,stderr:null},oI=n=>!!n&&typeof n=="object"&&(n instanceof pr||n instanceof lS||iI(n)||aI(n)),iI=n=>!!n&&typeof n=="object"&&n instanceof Rd&&typeof n.pipe=="function"&&n.pipe!==lS.Writable.prototype.pipe,aI=n=>!!n&&typeof n=="object"&&n instanceof Rd&&typeof n.write=="function"&&typeof n.end=="function",Gn=Symbol("EOF"),Wn=Symbol("maybeEmitEnd"),dr=Symbol("emittedEnd"),zs=Symbol("emittingEnd"),pa=Symbol("emittedError"),Hs=Symbol("closed"),iS=Symbol("read"),$s=Symbol("flush"),aS=Symbol("flushChunk"),mn=Symbol("encoding"),Go=Symbol("decoder"),Qe=Symbol("flowing"),ua=Symbol("paused"),Wo=Symbol("resume"),et=Symbol("buffer"),vt=Symbol("pipes"),tt=Symbol("bufferLength"),wd=Symbol("bufferPush"),js=Symbol("bufferShift"),ut=Symbol("objectMode"),He=Symbol("destroyed"),vd=Symbol("error"),Td=Symbol("emitData"),sS=Symbol("emitEnd"),xd=Symbol("emitEnd2"),Rn=Symbol("async"),Ed=Symbol("abort"),Gs=Symbol("aborted"),ma=Symbol("signal"),Jr=Symbol("dataListeners"),Ut=Symbol("discarded"),ha=n=>Promise.resolve().then(n),sI=n=>n(),lI=n=>n==="end"||n==="finish"||n==="prefinish",cI=n=>n instanceof ArrayBuffer||!!n&&typeof n=="object"&&n.constructor&&n.constructor.name==="ArrayBuffer"&&n.byteLength>=0,dI=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),Ws=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[Wo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Cd=class extends Ws{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,r){super(e,t,r),this.proxyErrors=o=>t.emit("error",o),e.on("error",this.proxyErrors)}},pI=n=>!!n.objectMode,uI=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",pr=class extends Rd{[Qe]=!1;[ua]=!1;[vt]=[];[et]=[];[ut];[mn];[Rn];[Go];[Gn]=!1;[dr]=!1;[zs]=!1;[Hs]=!1;[pa]=null;[tt]=0;[He]=!1;[ma];[Gs]=!1;[Jr]=0;[Ut]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");pI(t)?(this[ut]=!0,this[mn]=null):uI(t)?(this[mn]=t.encoding,this[ut]=!1):(this[ut]=!1,this[mn]=null),this[Rn]=!!t.async,this[Go]=this[mn]?new rI(this[mn]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[et]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[vt]});let{signal:r}=t;r&&(this[ma]=r,r.aborted?this[Ed]():r.addEventListener("abort",()=>this[Ed]()))}get bufferLength(){return this[tt]}get encoding(){return this[mn]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[ut]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[Rn]}set async(e){this[Rn]=this[Rn]||!!e}[Ed](){this[Gs]=!0,this.emit("abort",this[ma]?.reason),this.destroy(this[ma]?.reason)}get aborted(){return this[Gs]}set aborted(e){}write(e,t,r){if(this[Gs])return!1;if(this[Gn])throw new Error("write after end");if(this[He])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(r=t,t="utf8"),t||(t="utf8");let o=this[Rn]?ha:sI;if(!this[ut]&&!Buffer.isBuffer(e)){if(dI(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(cI(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[ut]?(this[Qe]&&this[tt]!==0&&this[$s](!0),this[Qe]?this.emit("data",e):this[wd](e),this[tt]!==0&&this.emit("readable"),r&&o(r),this[Qe]):e.length?(typeof e=="string"&&!(t===this[mn]&&!this[Go]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[mn]&&(e=this[Go].write(e)),this[Qe]&&this[tt]!==0&&this[$s](!0),this[Qe]?this.emit("data",e):this[wd](e),this[tt]!==0&&this.emit("readable"),r&&o(r),this[Qe]):(this[tt]!==0&&this.emit("readable"),r&&o(r),this[Qe])}read(e){if(this[He])return null;if(this[Ut]=!1,this[tt]===0||e===0||e&&e>this[tt])return this[Wn](),null;this[ut]&&(e=null),this[et].length>1&&!this[ut]&&(this[et]=[this[mn]?this[et].join(""):Buffer.concat(this[et],this[tt])]);let t=this[iS](e||null,this[et][0]);return this[Wn](),t}[iS](e,t){if(this[ut])this[js]();else{let r=t;e===r.length||e===null?this[js]():typeof r=="string"?(this[et][0]=r.slice(e),t=r.slice(0,e),this[tt]-=e):(this[et][0]=r.subarray(e),t=r.subarray(0,e),this[tt]-=e)}return this.emit("data",t),!this[et].length&&!this[Gn]&&this.emit("drain"),t}end(e,t,r){return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t="utf8"),e!==void 0&&this.write(e,t),r&&this.once("end",r),this[Gn]=!0,this.writable=!1,(this[Qe]||!this[ua])&&this[Wn](),this}[Wo](){this[He]||(!this[Jr]&&!this[vt].length&&(this[Ut]=!0),this[ua]=!1,this[Qe]=!0,this.emit("resume"),this[et].length?this[$s]():this[Gn]?this[Wn]():this.emit("drain"))}resume(){return this[Wo]()}pause(){this[Qe]=!1,this[ua]=!0,this[Ut]=!1}get destroyed(){return this[He]}get flowing(){return this[Qe]}get paused(){return this[ua]}[wd](e){this[ut]?this[tt]+=1:this[tt]+=e.length,this[et].push(e)}[js](){return this[ut]?this[tt]-=1:this[tt]-=this[et][0].length,this[et].shift()}[$s](e=!1){do;while(this[aS](this[js]())&&this[et].length);!e&&!this[et].length&&!this[Gn]&&this.emit("drain")}[aS](e){return this.emit("data",e),this[Qe]}pipe(e,t){if(this[He])return e;this[Ut]=!1;let r=this[dr];return t=t||{},e===oS.stdout||e===oS.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[vt].push(t.proxyErrors?new Cd(this,e,t):new Ws(this,e,t)),this[Rn]?ha(()=>this[Wo]()):this[Wo]()),e}unpipe(e){let t=this[vt].find(r=>r.dest===e);t&&(this[vt].length===1?(this[Qe]&&this[Jr]===0&&(this[Qe]=!1),this[vt]=[]):this[vt].splice(this[vt].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let r=super.on(e,t);if(e==="data")this[Ut]=!1,this[Jr]++,!this[vt].length&&!this[Qe]&&this[Wo]();else if(e==="readable"&&this[tt]!==0)super.emit("readable");else if(lI(e)&&this[dr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[pa]){let o=t;this[Rn]?ha(()=>o.call(this,this[pa])):o.call(this,this[pa])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Jr]=this.listeners("data").length,this[Jr]===0&&!this[Ut]&&!this[vt].length&&(this[Qe]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Jr]=0,!this[Ut]&&!this[vt].length&&(this[Qe]=!1)),t}get emittedEnd(){return this[dr]}[Wn](){!this[zs]&&!this[dr]&&!this[He]&&this[et].length===0&&this[Gn]&&(this[zs]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Hs]&&this.emit("close"),this[zs]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==He&&this[He])return!1;if(e==="data")return!this[ut]&&!r?!1:this[Rn]?(ha(()=>this[Td](r)),!0):this[Td](r);if(e==="end")return this[sS]();if(e==="close"){if(this[Hs]=!0,!this[dr]&&!this[He])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[pa]=r,super.emit(vd,r);let i=!this[ma]||this.listeners("error").length?super.emit("error",r):!1;return this[Wn](),i}else if(e==="resume"){let i=super.emit("resume");return this[Wn](),i}else if(e==="finish"||e==="prefinish"){let i=super.emit(e);return this.removeAllListeners(e),i}let o=super.emit(e,...t);return this[Wn](),o}[Td](e){for(let r of this[vt])r.dest.write(e)===!1&&this.pause();let t=this[Ut]?!1:super.emit("data",e);return this[Wn](),t}[sS](){return this[dr]?!1:(this[dr]=!0,this.readable=!1,this[Rn]?(ha(()=>this[xd]()),!0):this[xd]())}[xd](){if(this[Go]){let t=this[Go].end();if(t){for(let r of this[vt])r.dest.write(t);this[Ut]||super.emit("data",t)}}for(let t of this[vt])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[ut]||(e.dataLength=0);let t=this.promise();return this.on("data",r=>{e.push(r),this[ut]||(e.dataLength+=r.length)}),await t,e}async concat(){if(this[ut])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[mn]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(He,()=>t(new Error("stream destroyed"))),this.on("error",r=>t(r)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[Ut]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let o=this.read();if(o!==null)return Promise.resolve({done:!1,value:o});if(this[Gn])return t();let i,a,s=p=>{this.off("data",l),this.off("end",c),this.off(He,d),t(),a(p)},l=p=>{this.off("error",s),this.off("end",c),this.off(He,d),this.pause(),i({value:p,done:!!this[Gn]})},c=()=>{this.off("error",s),this.off("data",l),this.off(He,d),t(),i({done:!0,value:void 0})},d=()=>s(new Error("stream destroyed"));return new Promise((p,u)=>{a=u,i=p,this.once(He,d),this.once("error",s),this.once("end",c),this.once("data",l)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[Ut]=!1;let e=!1,t=()=>(this.pause(),this.off(vd,t),this.off(He,t),this.off("end",t),e=!0,{done:!0,value:void 0}),r=()=>{if(e)return t();let o=this.read();return o===null?t():{done:!1,value:o}};return this.once("end",t),this.once(vd,t),this.once(He,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[He])return e?this.emit("error",e):this.emit(He),this;this[He]=!0,this[Ut]=!0,this[et].length=0,this[tt]=0;let t=this;return typeof t.close=="function"&&!this[Hs]&&t.close(),e?this.emit("error",e):this.emit(He),this}static get isStream(){return oI}};var vI=bI.native,fa={lstatSync:gI,readdir:fI,readdirSync:SI,readlinkSync:yI,realpathSync:vI,promises:{lstat:TI,readdir:xI,readlink:EI,realpath:CI}},mS=n=>!n||n===fa||n===wI?fa:{...fa,...n,promises:{...fa.promises,...n.promises||{}}},hS=/^\\\\\?\\([a-z]:)\\?$/i,RI=n=>n.replace(/\//g,"\\").replace(hS,"$1\\"),AI=/[\\\/]/,Qt=0,gS=1,fS=2,An=4,SS=6,yS=8,Xr=10,bS=12,Zt=15,ga=~Zt,Ad=16,cS=32,Sa=64,hn=128,Vs=256,Ks=512,dS=Sa|hn|Ks,II=1023,Id=n=>n.isFile()?yS:n.isDirectory()?An:n.isSymbolicLink()?Xr:n.isCharacterDevice()?fS:n.isBlockDevice()?SS:n.isSocket()?bS:n.isFIFO()?gS:Qt,pS=new Map,ya=n=>{let e=pS.get(n);if(e)return e;let t=n.normalize("NFKD");return pS.set(n,t),t},uS=new Map,qs=n=>{let e=uS.get(n);if(e)return e;let t=ya(n.toLowerCase());return uS.set(n,t),t},Ys=class extends da{constructor(){super({max:256})}},Ld=class extends da{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},wS=Symbol("PathScurry setAsCwd"),mt=class{name;root;roots;parent;nocase;isCWD=!1;#e;#t;get dev(){return this.#t}#i;get mode(){return this.#i}#r;get nlink(){return this.#r}#a;get uid(){return this.#a}#w;get gid(){return this.#w}#c;get rdev(){return this.#c}#p;get blksize(){return this.#p}#s;get ino(){return this.#s}#l;get size(){return this.#l}#o;get blocks(){return this.#o}#f;get atimeMs(){return this.#f}#S;get mtimeMs(){return this.#S}#m;get ctimeMs(){return this.#m}#u;get birthtimeMs(){return this.#u}#x;get atime(){return this.#x}#g;get mtime(){return this.#g}#E;get ctime(){return this.#E}#C;get birthtime(){return this.#C}#b;#v;#T;#h;#P;#R;#n;#M;#y;#L;get parentPath(){return(this.parent||this).fullpath()}get path(){return this.parentPath}constructor(e,t=Qt,r,o,i,a,s){this.name=e,this.#b=i?qs(e):ya(e),this.#n=t&II,this.nocase=i,this.roots=o,this.root=r||this,this.#M=a,this.#T=s.fullpath,this.#P=s.relative,this.#R=s.relativePosix,this.parent=s.parent,this.parent?this.#e=this.parent.#e:this.#e=mS(s.fs)}depth(){return this.#v!==void 0?this.#v:this.parent?this.#v=this.parent.depth()+1:this.#v=0}childrenCache(){return this.#M}resolve(e){if(!e)return this;let t=this.getRootString(e),o=e.substring(t.length).split(this.splitSep);return t?this.getRoot(t).#N(o):this.#N(o)}#N(e){let t=this;for(let r of e)t=t.child(r);return t}children(){let e=this.#M.get(this);if(e)return e;let t=Object.assign([],{provisional:0});return this.#M.set(this,t),this.#n&=~Ad,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?qs(e):ya(e);for(let l of r)if(l.#b===o)return l;let i=this.parent?this.sep:"",a=this.#T?this.#T+i+e:void 0,s=this.newChild(e,Qt,{...t,parent:this,fullpath:a});return this.canReaddir()||(s.#n|=hn),r.push(s),s}relative(){if(this.isCWD)return"";if(this.#P!==void 0)return this.#P;let e=this.name,t=this.parent;if(!t)return this.#P=this.name;let r=t.relative();return r+(!r||!t.parent?"":this.sep)+e}relativePosix(){if(this.sep==="/")return this.relative();if(this.isCWD)return"";if(this.#R!==void 0)return this.#R;let e=this.name,t=this.parent;if(!t)return this.#R=this.fullpathPosix();let r=t.relativePosix();return r+(!r||!t.parent?"":"/")+e}fullpath(){if(this.#T!==void 0)return this.#T;let e=this.name,t=this.parent;if(!t)return this.#T=this.name;let o=t.fullpath()+(t.parent?this.sep:"")+e;return this.#T=o}fullpathPosix(){if(this.#h!==void 0)return this.#h;if(this.sep==="/")return this.#h=this.fullpath();if(!this.parent){let o=this.fullpath().replace(/\\/g,"/");return/^[a-z]:\//i.test(o)?this.#h=`//?/${o}`:this.#h=o}let e=this.parent,t=e.fullpathPosix(),r=t+(!t||!e.parent?"":"/")+this.name;return this.#h=r}isUnknown(){return(this.#n&Zt)===Qt}isType(e){return this[`is${e}`]()}getType(){return this.isUnknown()?"Unknown":this.isDirectory()?"Directory":this.isFile()?"File":this.isSymbolicLink()?"SymbolicLink":this.isFIFO()?"FIFO":this.isCharacterDevice()?"CharacterDevice":this.isBlockDevice()?"BlockDevice":this.isSocket()?"Socket":"Unknown"}isFile(){return(this.#n&Zt)===yS}isDirectory(){return(this.#n&Zt)===An}isCharacterDevice(){return(this.#n&Zt)===fS}isBlockDevice(){return(this.#n&Zt)===SS}isFIFO(){return(this.#n&Zt)===gS}isSocket(){return(this.#n&Zt)===bS}isSymbolicLink(){return(this.#n&Xr)===Xr}lstatCached(){return this.#n&cS?this:void 0}readlinkCached(){return this.#y}realpathCached(){return this.#L}readdirCached(){let e=this.children();return e.slice(0,e.provisional)}canReadlink(){if(this.#y)return!0;if(!this.parent)return!1;let e=this.#n&Zt;return!(e!==Qt&&e!==Xr||this.#n&Vs||this.#n&hn)}calledReaddir(){return!!(this.#n&Ad)}isENOENT(){return!!(this.#n&hn)}isNamed(e){return this.nocase?this.#b===qs(e):this.#b===ya(e)}async readlink(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=await this.#e.promises.readlink(this.fullpath()),r=(await this.parent.realpath())?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}readlinkSync(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=this.#e.readlinkSync(this.fullpath()),r=this.parent.realpathSync()?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}#k(e){this.#n|=Ad;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#_()}}#_(){this.#n&hn||(this.#n=(this.#n|hn)&ga,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#_()}#I(){this.#n|=Ks,this.#D()}#D(){if(this.#n&Sa)return;let e=this.#n;(e&Zt)===An&&(e&=ga),this.#n=e|Sa,this.#A()}#F(e=""){e==="ENOTDIR"||e==="EPERM"?this.#D():e==="ENOENT"?this.#_():this.children().provisional=0}#U(e=""){e==="ENOTDIR"?this.parent.#D():e==="ENOENT"&&this.#_()}#d(e=""){let t=this.#n;t|=Vs,e==="ENOENT"&&(t|=hn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=ga),this.#n=t,e==="ENOTDIR"&&this.parent&&this.parent.#D()}#B(e,t){return this.#O(e,t)||this.#z(e,t)}#z(e,t){let r=Id(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&Zt;return i!==An&&i!==Xr&&i!==Qt&&(o.#n|=Sa),t.unshift(o),t.provisional++,o}#O(e,t){for(let r=t.provisional;r<t.length;r++){let o=t[r];if((this.nocase?qs(e.name):ya(e.name))===o.#b)return this.#H(e,o,r,t)}}#H(e,t,r,o){let i=t.name;return t.#n=t.#n&ga|Id(e),i!==e.name&&(t.name=e.name),r!==o.provisional&&(r===o.length-1?o.pop():o.splice(r,1),o.unshift(t)),o.provisional++,t}async lstat(){if(!(this.#n&hn))try{return this.#W(await this.#e.promises.lstat(this.fullpath())),this}catch(e){this.#U(e.code)}}lstatSync(){if(!(this.#n&hn))try{return this.#W(this.#e.lstatSync(this.fullpath())),this}catch(e){this.#U(e.code)}}#W(e){let{atime:t,atimeMs:r,birthtime:o,birthtimeMs:i,blksize:a,blocks:s,ctime:l,ctimeMs:c,dev:d,gid:p,ino:u,mode:m,mtime:h,mtimeMs:g,nlink:f,rdev:S,size:w,uid:v}=e;this.#x=t,this.#f=r,this.#C=o,this.#u=i,this.#p=a,this.#o=s,this.#E=l,this.#m=c,this.#t=d,this.#w=p,this.#s=u,this.#i=m,this.#g=h,this.#S=g,this.#r=f,this.#c=S,this.#l=w,this.#a=v;let b=Id(e);this.#n=this.#n&ga|b|cS,b!==Qt&&b!==An&&b!==Xr&&(this.#n|=Sa)}#j=[];#G=!1;#V(e){this.#G=!1;let t=this.#j.slice();this.#j.length=0,t.forEach(r=>r(null,e))}readdirCB(e,t=!1){if(!this.canReaddir()){t?e(null,[]):queueMicrotask(()=>e(null,[]));return}let r=this.children();if(this.calledReaddir()){let i=r.slice(0,r.provisional);t?e(null,i):queueMicrotask(()=>e(null,i));return}if(this.#j.push(e),this.#G)return;this.#G=!0;let o=this.fullpath();this.#e.readdir(o,{withFileTypes:!0},(i,a)=>{if(i)this.#F(i.code),r.provisional=0;else{for(let s of a)this.#B(s,r);this.#k(r)}this.#V(r.slice(0,r.provisional))})}#$;async readdir(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();if(this.#$)await this.#$;else{let r=()=>{};this.#$=new Promise(o=>r=o);try{for(let o of await this.#e.promises.readdir(t,{withFileTypes:!0}))this.#B(o,e);this.#k(e)}catch(o){this.#F(o.code),e.provisional=0}this.#$=void 0,r()}return e.slice(0,e.provisional)}readdirSync(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();try{for(let r of this.#e.readdirSync(t,{withFileTypes:!0}))this.#B(r,e);this.#k(e)}catch(r){this.#F(r.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&dS)return!1;let e=Zt&this.#n;return e===Qt||e===An||e===Xr}shouldWalk(e,t){return(this.#n&An)===An&&!(this.#n&dS)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((Ks|Vs|hn)&this.#n))try{let e=await this.#e.promises.realpath(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}realpathSync(){if(this.#L)return this.#L;if(!((Ks|Vs|hn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[wS](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let t=new Set([]),r=[],o=this;for(;o&&o.parent;)t.add(o),o.#P=r.join(this.sep),o.#R=r.join("/"),o=o.parent,r.push("..");for(o=e;o&&o.parent&&!t.has(o);)o.#P=void 0,o.#R=void 0,o=o.parent}},Js=class n extends mt{sep="\\";splitSep=AI;constructor(e,t=Qt,r,o,i,a,s){super(e,t,r,o,i,a,s)}newChild(e,t=Qt,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}getRootString(e){return Pd.parse(e).root}getRoot(e){if(e=RI(e.toUpperCase()),e===this.root.name)return this.root;for(let[t,r]of Object.entries(this.roots))if(this.sameRoot(e,t))return this.roots[e]=r;return this.roots[e]=new Vo(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(hS,"$1\\"),e===t}},Xs=class n extends mt{splitSep="/";sep="/";constructor(e,t=Qt,r,o,i,a,s){super(e,t,r,o,i,a,s)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,t=Qt,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}},Zs=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:a=fa}={}){this.#r=mS(a),(e instanceof URL||e.startsWith("file://"))&&(e=hI(e));let s=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(s),this.#e=new Ys,this.#t=new Ys,this.#i=new Ld(i);let l=s.substring(this.rootPath.length).split(r);if(l.length===1&&!l[0]&&l.pop(),o===void 0)throw new TypeError("must provide nocase setting to PathScurryBase ctor");this.nocase=o,this.root=this.newRoot(this.#r),this.roots[this.rootPath]=this.root;let c=this.root,d=l.length-1,p=t.sep,u=this.rootPath,m=!1;for(let h of l){let g=d--;c=c.child(h,{relative:new Array(g).fill("..").join(p),relativePosix:new Array(g).fill("..").join("/"),fullpath:u+=(m?"":p)+h}),m=!0}this.cwd=c}depth(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.depth()}childrenCache(){return this.#i}resolve(...e){let t="";for(let i=e.length-1;i>=0;i--){let a=e[i];if(!(!a||a===".")&&(t=t?`${a}/${t}`:a,this.isAbsolute(a)))break}let r=this.#e.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpath();return this.#e.set(t,o),o}resolvePosix(...e){let t="";for(let i=e.length-1;i>=0;i--){let a=e[i];if(!(!a||a===".")&&(t=t?`${a}/${t}`:a,this.isAbsolute(a)))break}let r=this.#t.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpathPosix();return this.#t.set(t,o),o}relative(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relative()}relativePosix(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relativePosix()}basename(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.name}dirname(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),(e.parent||e).fullpath()}async readdir(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r}=t;if(e.canReaddir()){let o=await e.readdir();return r?o:o.map(i=>i.name)}else return[]}readdirSync(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r=!0}=t;return e.canReaddir()?r?e.readdirSync():e.readdirSync().map(o=>o.name):[]}async lstat(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstat()}lstatSync(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstatSync()}async readlink(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e.withFileTypes,e=this.cwd);let r=await e.readlink();return t?r:r?.fullpath()}readlinkSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e.withFileTypes,e=this.cwd);let r=e.readlinkSync();return t?r:r?.fullpath()}async realpath(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e.withFileTypes,e=this.cwd);let r=await e.realpath();return t?r:r?.fullpath()}realpathSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e.withFileTypes,e=this.cwd);let r=e.realpathSync();return t?r:r?.fullpath()}async walk(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=[];(!i||i(e))&&s.push(r?e:e.fullpath());let l=new Set,c=(p,u)=>{l.add(p),p.readdirCB((m,h)=>{if(m)return u(m);let g=h.length;if(!g)return u();let f=()=>{--g===0&&u()};for(let S of h)(!i||i(S))&&s.push(r?S:S.fullpath()),o&&S.isSymbolicLink()?S.realpath().then(w=>w?.isUnknown()?w.lstat():w).then(w=>w?.shouldWalk(l,a)?c(w,f):f()):S.shouldWalk(l,a)?c(S,f):f()},!0)},d=e;return new Promise((p,u)=>{c(d,m=>{if(m)return u(m);p(s)})})}walkSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=[];(!i||i(e))&&s.push(r?e:e.fullpath());let l=new Set([e]);for(let c of l){let d=c.readdirSync();for(let p of d){(!i||i(p))&&s.push(r?p:p.fullpath());let u=p;if(p.isSymbolicLink()){if(!(o&&(u=p.realpathSync())))continue;u.isUnknown()&&u.lstatSync()}u.shouldWalk(l,a)&&l.add(u)}}return s}[Symbol.asyncIterator](){return this.iterate()}iterate(e=this.cwd,t={}){return typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd),this.stream(e,t)[Symbol.asyncIterator]()}[Symbol.iterator](){return this.iterateSync()}*iterateSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t;(!i||i(e))&&(yield r?e:e.fullpath());let s=new Set([e]);for(let l of s){let c=l.readdirSync();for(let d of c){(!i||i(d))&&(yield r?d:d.fullpath());let p=d;if(d.isSymbolicLink()){if(!(o&&(p=d.realpathSync())))continue;p.isUnknown()&&p.lstatSync()}p.shouldWalk(s,a)&&s.add(p)}}}stream(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=new pr({objectMode:!0});(!i||i(e))&&s.write(r?e:e.fullpath());let l=new Set,c=[e],d=0,p=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){d===0&&s.end();return}d++,l.add(m);let h=(f,S,w=!1)=>{if(f)return s.emit("error",f);if(o&&!w){let v=[];for(let b of S)b.isSymbolicLink()&&v.push(b.realpath().then(x=>x?.isUnknown()?x.lstat():x));if(v.length){Promise.all(v).then(()=>h(null,S,!0));return}}for(let v of S)v&&(!i||i(v))&&(s.write(r?v:v.fullpath())||(u=!0));d--;for(let v of S){let b=v.realpathCached()||v;b.shouldWalk(l,a)&&c.push(b)}u&&!s.flowing?s.once("drain",p):g||p()},g=!0;m.readdirCB(h,!0),g=!1}};return p(),s}streamSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof mt||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=new pr({objectMode:!0}),l=new Set;(!i||i(e))&&s.write(r?e:e.fullpath());let c=[e],d=0,p=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){d===0&&s.end();return}d++,l.add(m);let h=m.readdirSync();for(let g of h)(!i||i(g))&&(s.write(r?g:g.fullpath())||(u=!0));d--;for(let g of h){let f=g;if(g.isSymbolicLink()){if(!(o&&(f=g.realpathSync())))continue;f.isUnknown()&&f.lstatSync()}f.shouldWalk(l,a)&&c.push(f)}}u&&!s.flowing&&s.once("drain",p)};return p(),s}chdir(e=this.cwd){let t=this.cwd;this.cwd=typeof e=="string"?this.cwd.resolve(e):e,this.cwd[wS](t)}},Vo=class extends Zs{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,Pd,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return Pd.parse(e).root.toUpperCase()}newRoot(e){return new Js(this.rootPath,An,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:(\/|\\)/i.test(e)}},qo=class extends Zs{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,mI,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new Xs(this.rootPath,An,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},ba=class extends qo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},t3=process.platform==="win32"?Js:Xs,vS=process.platform==="win32"?Vo:process.platform==="darwin"?ba:qo;var PI=n=>n.length>=1,LI=n=>n.length>=1,Ko=class n{#e;#t;#i;length;#r;#a;#w;#c;#p;#s;#l=!0;constructor(e,t,r,o){if(!PI(e))throw new TypeError("empty pattern list");if(!LI(t))throw new TypeError("empty glob list");if(t.length!==e.length)throw new TypeError("mismatched pattern list and glob list lengths");if(this.length=e.length,r<0||r>=this.length)throw new TypeError("index out of range");if(this.#e=e,this.#t=t,this.#i=r,this.#r=o,this.#i===0){if(this.isUNC()){let[i,a,s,l,...c]=this.#e,[d,p,u,m,...h]=this.#t;c[0]===""&&(c.shift(),h.shift());let g=[i,a,s,l,""].join("/"),f=[d,p,u,m,""].join("/");this.#e=[g,...c],this.#t=[f,...h],this.length=this.#e.length}else if(this.isDrive()||this.isAbsolute()){let[i,...a]=this.#e,[s,...l]=this.#t;a[0]===""&&(a.shift(),l.shift());let c=i+"/",d=s+"/";this.#e=[c,...a],this.#t=[d,...l],this.length=this.#e.length}}}pattern(){return this.#e[this.#i]}isString(){return typeof this.#e[this.#i]=="string"}isGlobstar(){return this.#e[this.#i]===at}isRegExp(){return this.#e[this.#i]instanceof RegExp}globString(){return this.#w=this.#w||(this.#i===0?this.isAbsolute()?this.#t[0]+this.#t.slice(1).join("/"):this.#t.join("/"):this.#t.slice(this.#i).join("/"))}hasMore(){return this.length>this.#i+1}rest(){return this.#a!==void 0?this.#a:this.hasMore()?(this.#a=new n(this.#e,this.#t,this.#i+1,this.#r),this.#a.#s=this.#s,this.#a.#p=this.#p,this.#a.#c=this.#c,this.#a):this.#a=null}isUNC(){let e=this.#e;return this.#p!==void 0?this.#p:this.#p=this.#r==="win32"&&this.#i===0&&e[0]===""&&e[1]===""&&typeof e[2]=="string"&&!!e[2]&&typeof e[3]=="string"&&!!e[3]}isDrive(){let e=this.#e;return this.#c!==void 0?this.#c:this.#c=this.#r==="win32"&&this.#i===0&&this.length>1&&typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0])}isAbsolute(){let e=this.#e;return this.#s!==void 0?this.#s:this.#s=e[0]===""&&e.length>1||this.isDrive()||this.isUNC()}root(){let e=this.#e[0];return typeof e=="string"&&this.isAbsolute()&&this.#i===0?e:""}checkFollowGlobstar(){return!(this.#i===0||!this.isGlobstar()||!this.#l)}markFollowGlobstar(){return this.#i===0||!this.isGlobstar()||!this.#l?!1:(this.#l=!1,!0)}};var OI=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Yo=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:r,noext:o,noglobstar:i,platform:a=OI}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=a,this.mmopts={dot:!0,nobrace:t,nocase:r,noext:o,noglobstar:i,optimizationLevel:2,platform:a,nocomment:!0,nonegate:!0};for(let s of e)this.add(s)}add(e){let t=new Ft(e,this.mmopts);for(let r=0;r<t.set.length;r++){let o=t.set[r],i=t.globParts[r];if(!o||!i)throw new Error("invalid pattern object");for(;o[0]==="."&&i[0]===".";)o.shift(),i.shift();let a=new Ko(o,i,0,this.platform),s=new Ft(a.globString(),this.mmopts),l=i[i.length-1]==="**",c=a.isAbsolute();c?this.absolute.push(s):this.relative.push(s),l&&(c?this.absoluteChildren.push(s):this.relativeChildren.push(s))}}ignored(e){let t=e.fullpath(),r=`${t}/`,o=e.relative()||".",i=`${o}/`;for(let a of this.relative)if(a.match(o)||a.match(i))return!0;for(let a of this.absolute)if(a.match(t)||a.match(r))return!0;return!1}childrenIgnored(e){let t=e.fullpath()+"/",r=(e.relative()||".")+"/";for(let o of this.relativeChildren)if(o.match(r))return!0;for(let o of this.absoluteChildren)if(o.match(t))return!0;return!1}};var Od=class n{store;constructor(e=new Map){this.store=e}copy(){return new n(new Map(this.store))}hasWalked(e,t){return this.store.get(e.fullpath())?.has(t.globString())}storeWalked(e,t){let r=e.fullpath(),o=this.store.get(r);o?o.add(t.globString()):this.store.set(r,new Set([t.globString()]))}},Md=class{store=new Map;add(e,t,r){let o=(t?2:0)|(r?1:0),i=this.store.get(e);this.store.set(e,i===void 0?o:o&i)}entries(){return[...this.store.entries()].map(([e,t])=>[e,!!(t&2),!!(t&1)])}},Nd=class{store=new Map;add(e,t){if(!e.canReaddir())return;let r=this.store.get(e);r?r.find(o=>o.globString()===t.globString())||r.push(t):this.store.set(e,[t])}get(e){let t=this.store.get(e);if(!t)throw new Error("attempting to walk unknown path");return t}entries(){return this.keys().map(e=>[e,this.store.get(e)])}keys(){return[...this.store.keys()].filter(e=>e.canReaddir())}},wa=class n{hasWalkedCache;matches=new Md;subwalks=new Nd;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Od}processPatterns(e,t){this.patterns=t;let r=t.map(o=>[e,o]);for(let[o,i]of r){this.hasWalkedCache.storeWalked(o,i);let a=i.root(),s=i.isAbsolute()&&this.opts.absolute!==!1;if(a){o=o.resolve(a==="/"&&this.opts.root!==void 0?this.opts.root:a);let p=i.rest();if(p)i=p;else{this.matches.add(o,!0,!1);continue}}if(o.isENOENT())continue;let l,c,d=!1;for(;typeof(l=i.pattern())=="string"&&(c=i.rest());)o=o.resolve(l),i=c,d=!0;if(l=i.pattern(),c=i.rest(),d){if(this.hasWalkedCache.hasWalked(o,i))continue;this.hasWalkedCache.storeWalked(o,i)}if(typeof l=="string"){let p=l===".."||l===""||l===".";this.matches.add(o.resolve(l),s,p);continue}else if(l===at){(!o.isSymbolicLink()||this.follow||i.checkFollowGlobstar())&&this.subwalks.add(o,i);let p=c?.pattern(),u=c?.rest();if(!c||(p===""||p===".")&&!u)this.matches.add(o,s,p===""||p===".");else if(p===".."){let m=o.parent||o;u?this.hasWalkedCache.hasWalked(m,u)||this.subwalks.add(m,u):this.matches.add(m,s,!0)}}else l instanceof RegExp&&this.subwalks.add(o,i)}return this}subwalkTargets(){return this.subwalks.keys()}child(){return new n(this.opts,this.hasWalkedCache)}filterEntries(e,t){let r=this.subwalks.get(e),o=this.child();for(let i of t)for(let a of r){let s=a.isAbsolute(),l=a.pattern(),c=a.rest();l===at?o.testGlobstar(i,a,c,s):l instanceof RegExp?o.testRegExp(i,l,c,s):o.testString(i,l,c,s)}return o}testGlobstar(e,t,r,o){if((this.dot||!e.name.startsWith("."))&&(t.hasMore()||this.matches.add(e,o,!1),e.canReaddir()&&(this.follow||!e.isSymbolicLink()?this.subwalks.add(e,t):e.isSymbolicLink()&&(r&&t.checkFollowGlobstar()?this.subwalks.add(e,r):t.markFollowGlobstar()&&this.subwalks.add(e,t)))),r){let i=r.pattern();if(typeof i=="string"&&i!==".."&&i!==""&&i!==".")this.testString(e,i,r.rest(),o);else if(i===".."){let a=e.parent||e;this.subwalks.add(a,r)}else i instanceof RegExp&&this.testRegExp(e,i,r.rest(),o)}}testRegExp(e,t,r,o){t.test(e.name)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}testString(e,t,r,o){e.isNamed(t)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}};var MI=(n,e)=>typeof n=="string"?new Yo([n],e):Array.isArray(n)?new Yo(n,e):n,Qs=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#e=[];#t;#i;signal;maxDepth;includeChildMatches;constructor(e,t,r){if(this.patterns=e,this.path=t,this.opts=r,this.#i=!r.posix&&r.platform==="win32"?"\\":"/",this.includeChildMatches=r.includeChildMatches!==!1,(r.ignore||!this.includeChildMatches)&&(this.#t=MI(r.ignore??[],r),!this.includeChildMatches&&typeof this.#t.add!="function")){let o="cannot ignore child matches, ignore lacks add() method.";throw new Error(o)}this.maxDepth=r.maxDepth||1/0,r.signal&&(this.signal=r.signal,this.signal.addEventListener("abort",()=>{this.#e.length=0}))}#r(e){return this.seen.has(e)||!!this.#t?.ignored?.(e)}#a(e){return!!this.#t?.childrenIgnored?.(e)}pause(){this.paused=!0}resume(){if(this.signal?.aborted)return;this.paused=!1;let e;for(;!this.paused&&(e=this.#e.shift());)e()}onResume(e){this.signal?.aborted||(this.paused?this.#e.push(e):e())}async matchCheck(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||await e.realpath(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?await e.lstat():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let a=await i.realpath();a&&(a.isUnknown()||this.opts.stat)&&await a.lstat()}return this.matchCheckTest(i,t)}matchCheckTest(e,t){return e&&(this.maxDepth===1/0||e.depth()<=this.maxDepth)&&(!t||e.canReaddir())&&(!this.opts.nodir||!e.isDirectory())&&(!this.opts.nodir||!this.opts.follow||!e.isSymbolicLink()||!e.realpathCached()?.isDirectory())&&!this.#r(e)?e:void 0}matchCheckSync(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||e.realpathSync(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?e.lstatSync():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let a=i.realpathSync();a&&(a?.isUnknown()||this.opts.stat)&&a.lstatSync()}return this.matchCheckTest(i,t)}matchFinish(e,t){if(this.#r(e))return;if(!this.includeChildMatches&&this.#t?.add){let i=`${e.relativePosix()}/**`;this.#t.add(i)}let r=this.opts.absolute===void 0?t:this.opts.absolute;this.seen.add(e);let o=this.opts.mark&&e.isDirectory()?this.#i:"";if(this.opts.withFileTypes)this.matchEmit(e);else if(r){let i=this.opts.posix?e.fullpathPosix():e.fullpath();this.matchEmit(i+o)}else{let i=this.opts.posix?e.relativePosix():e.relative(),a=this.opts.dotRelative&&!i.startsWith(".."+this.#i)?"."+this.#i:"";this.matchEmit(i?a+i+o:"."+o)}}async match(e,t,r){let o=await this.matchCheck(e,r);o&&this.matchFinish(o,t)}matchSync(e,t,r){let o=this.matchCheckSync(e,r);o&&this.matchFinish(o,t)}walkCB(e,t,r){this.signal?.aborted&&r(),this.walkCB2(e,t,new wa(this.opts),r)}walkCB2(e,t,r,o){if(this.#a(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2(e,t,r,o));return}r.processPatterns(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||(i++,this.match(s,l,c).then(()=>a()));for(let s of r.subwalkTargets()){if(this.maxDepth!==1/0&&s.depth()>=this.maxDepth)continue;i++;let l=s.readdirCached();s.calledReaddir()?this.walkCB3(s,l,r,a):s.readdirCB((c,d)=>this.walkCB3(s,d,r,a),!0)}a()}walkCB3(e,t,r,o){r=r.filterEntries(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||(i++,this.match(s,l,c).then(()=>a()));for(let[s,l]of r.subwalks.entries())i++,this.walkCB2(s,l,r.child(),a);a()}walkCBSync(e,t,r){this.signal?.aborted&&r(),this.walkCB2Sync(e,t,new wa(this.opts),r)}walkCB2Sync(e,t,r,o){if(this.#a(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2Sync(e,t,r,o));return}r.processPatterns(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||this.matchSync(s,l,c);for(let s of r.subwalkTargets()){if(this.maxDepth!==1/0&&s.depth()>=this.maxDepth)continue;i++;let l=s.readdirSync();this.walkCB3Sync(s,l,r,a)}a()}walkCB3Sync(e,t,r,o){r=r.filterEntries(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||this.matchSync(s,l,c);for(let[s,l]of r.subwalks.entries())i++,this.walkCB2Sync(s,l,r.child(),a);a()}},va=class extends Qs{matches=new Set;constructor(e,t,r){super(e,t,r)}matchEmit(e){this.matches.add(e)}async walk(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&await this.path.lstat(),await new Promise((e,t)=>{this.walkCB(this.path,this.patterns,()=>{this.signal?.aborted?t(this.signal.reason):e(this.matches)})}),this.matches}walkSync(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>{if(this.signal?.aborted)throw this.signal.reason}),this.matches}},Ta=class extends Qs{results;constructor(e,t,r){super(e,t,r),this.results=new pr({signal:this.signal,objectMode:!0}),this.results.on("drain",()=>this.resume()),this.results.on("resume",()=>this.resume())}matchEmit(e){this.results.write(e),this.results.flowing||this.pause()}stream(){let e=this.path;return e.isUnknown()?e.lstat().then(()=>{this.walkCB(e,this.patterns,()=>this.results.end())}):this.walkCB(e,this.patterns,()=>this.results.end()),this.results}streamSync(){return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>this.results.end()),this.results}};var kI=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",gn=class{absolute;cwd;root;dot;dotRelative;follow;ignore;magicalBraces;mark;matchBase;maxDepth;nobrace;nocase;nodir;noext;noglobstar;pattern;platform;realpath;scurry;stat;signal;windowsPathsNoEscape;withFileTypes;includeChildMatches;opts;patterns;constructor(e,t){if(!t)throw new TypeError("glob options required");if(this.withFileTypes=!!t.withFileTypes,this.signal=t.signal,this.follow=!!t.follow,this.dot=!!t.dot,this.dotRelative=!!t.dotRelative,this.nodir=!!t.nodir,this.mark=!!t.mark,t.cwd?(t.cwd instanceof URL||t.cwd.startsWith("file://"))&&(t.cwd=NI(t.cwd)):this.cwd="",this.cwd=t.cwd||"",this.root=t.root,this.magicalBraces=!!t.magicalBraces,this.nobrace=!!t.nobrace,this.noext=!!t.noext,this.realpath=!!t.realpath,this.absolute=t.absolute,this.includeChildMatches=t.includeChildMatches!==!1,this.noglobstar=!!t.noglobstar,this.matchBase=!!t.matchBase,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:1/0,this.stat=!!t.stat,this.ignore=t.ignore,this.withFileTypes&&this.absolute!==void 0)throw new Error("cannot set absolute and withFileTypes:true");if(typeof e=="string"&&(e=[e]),this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(e=e.map(l=>l.replace(/\\/g,"/"))),this.matchBase){if(t.noglobstar)throw new TypeError("base matching requires globstar");e=e.map(l=>l.includes("/")?l:`./**/${l}`)}if(this.pattern=e,this.platform=t.platform||kI,this.opts={...t,platform:this.platform},t.scurry){if(this.scurry=t.scurry,t.nocase!==void 0&&t.nocase!==t.scurry.nocase)throw new Error("nocase option contradicts provided scurry option")}else{let l=t.platform==="win32"?Vo:t.platform==="darwin"?ba:t.platform?qo:vS;this.scurry=new l(this.cwd,{nocase:t.nocase,fs:t.fs})}this.nocase=this.scurry.nocase;let r=this.platform==="darwin"||this.platform==="win32",o={...t,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:r,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},i=this.pattern.map(l=>new Ft(l,o)),[a,s]=i.reduce((l,c)=>(l[0].push(...c.set),l[1].push(...c.globParts),l),[[],[]]);this.patterns=a.map((l,c)=>{let d=s[c];if(!d)throw new Error("invalid pattern object");return new Ko(l,d,0,this.platform)})}async walk(){return[...await new va(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walk()]}walkSync(){return[...new va(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walkSync()]}stream(){return new Ta(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).stream()}streamSync(){return new Ta(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).streamSync()}iterateSync(){return this.streamSync()[Symbol.iterator]()}[Symbol.iterator](){return this.iterateSync()}iterate(){return this.stream()[Symbol.asyncIterator]()}[Symbol.asyncIterator](){return this.iterate()}};var kd=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Ft(t,e).hasMagic())return!0;return!1};function el(n,e={}){return new gn(n,e).streamSync()}function ES(n,e={}){return new gn(n,e).stream()}function Jo(n,e={}){return new gn(n,e).walkSync()}async function TS(n,e={}){return new gn(n,e).walk()}function tl(n,e={}){return new gn(n,e).iterateSync()}function CS(n,e={}){return new gn(n,e).iterate()}var _I=el,DI=Object.assign(ES,{sync:el}),FI=tl,UI=Object.assign(CS,{sync:tl}),BI=Object.assign(Jo,{stream:el,iterate:tl}),xS=Object.assign(TS,{glob:TS,globSync:Jo,sync:BI,globStream:ES,stream:DI,globStreamSync:el,streamSync:_I,globIterate:CS,iterate:UI,globIterateSync:tl,iterateSync:FI,Glob:gn,hasMagic:kd,escape:Ho,unescape:un});xS.glob=xS;import Zr,{dirname as PS}from"path";import{cwd as Bd}from"process";import LS from"yaml";import{z as de}from"zod";import RS from"fs";import nl from"path";import zI from"yaml";import{z as _d}from"zod";var AS=!1,Dd=[`**/*.${Lt.TEST}`,`**/*.${Lt.MODULE}`],Fd=_d.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),Ud=50,HI=_d.object({fileType:_d.nativeEnum(Ce)});function Pe(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??Dd,o=Array.from(n.config.exclude??[]).concat(kh),i=Jo(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:Ud,nodir:!0});for(let a of i)$I(n.rootDir,a,t,e);return AS=!0,t}function $I(n,e,t,r){let o=nl.join(n,e),i;try{i=RS.readFileSync(o,"utf-8")}catch(p){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${p}`);return}let a;try{if(a=zI.parse(i),typeof a!="object"||a===null)throw new Error("The YAML document should parse as a map with key-value pairs")}catch(p){r.warn(`Could not parse possible Momentic file at ${o}, skipping: ${p}`);return}let s=HI.safeParse(a);if(s.error){r.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let l=s.data.fileType,c;try{c=RS.statSync(o)}catch(p){r.warn(`Skipping path '${o}' because it could not be stat, skipping: ${p}`);return}let d={relativePath:e,fullFilePath:o,platformSep:nl.sep,fullPathSegments:o.split(nl.sep),fileName:nl.basename(o),lastModified:c.mtime,createdAt:c.birthtime};switch(l){case Ce.TEST:try{let p=Yt.parse(a);if(t.tests[p.id]){let u=t.tests[p.id].fullFilePath;y.error(`Two tests with the same ID (${p.id}) were found in the same project. Please ensure that all test IDs are unique and avoid copying tests manually. Momentic will ignore the first test when resolving tests.
|
|
44
|
+
>>> no match, partial?`,e,u,t,m),u===l))}let g;if(typeof d=="string"?(g=p===d,this.debug("string match",d,p,g)):(g=d.test(p),this.debug("pattern match",d,p,g)),!g)return!1}if(a===l&&s===c)return!0;if(a===l)return r;if(s===c)return a===l-1&&e[a]==="";throw new Error("wtf?")}braceExpand(){return pS(this.pattern,this.options)}parse(e){pa(e);let t=this.options;if(e==="**")return st;if(e==="")return"";let r,o=null;(r=e.match(ZA))?o=t.dot?eI:QA:(r=e.match(jA))?o=(t.nocase?t.dot?VA:WA:t.dot?GA:$A)(r[1]):(r=e.match(tI))?o=(t.nocase?t.dot?rI:nI:t.dot?oI:iI)(r):(r=e.match(qA))?o=t.dot?YA:KA:(r=e.match(JA))&&(o=XA);let i=jo.fromGlob(e,this.options).toMMPattern();return o&&typeof i=="object"&&Reflect.defineProperty(i,"test",{value:o}),i}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let t=this.options,r=t.noglobstar?lI:t.dot?cI:dI,o=new Set(t.nocase?["i"]:[]),i=e.map(l=>{let c=l.map(d=>{if(d instanceof RegExp)for(let p of d.flags.split(""))o.add(p);return typeof d=="string"?gI(d):d===st?st:d._src});return c.forEach((d,p)=>{let u=c[p+1],m=c[p-1];d!==st||m===st||(m===void 0?u!==void 0&&u!==st?c[p+1]="(?:\\/|"+r+"\\/)?"+u:c[p]=r:u===void 0?c[p-1]=m+"(?:\\/|"+r+")?":u!==st&&(c[p-1]=m+"(?:\\/|\\/"+r+"\\/)"+u,c[p+1]=st))}),c.filter(d=>d!==st).join("/")}).join("|"),[a,s]=e.length>1?["(?:",")"]:["",""];i="^"+a+i+s+"$",this.negate&&(i="^(?!"+i+").+$");try{this.regexp=new RegExp(i,[...o].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,t=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&t)return!0;let r=this.options;this.isWindows&&(e=e.split("\\").join("/"));let o=this.slashSplit(e);this.debug(this.pattern,"split",o);let i=this.set;this.debug(this.pattern,"set",i);let a=o[o.length-1];if(!a)for(let s=o.length-2;!a&&s>=0;s--)a=o[s];for(let s=0;s<i.length;s++){let l=i[s],c=o;if(r.matchBase&&l.length===1&&(c=[a]),this.matchOne(c,l,t))return r.flipNegate?!0:!this.negate}return r.flipNegate?!1:this.negate}static defaults(e){return xt.defaults(e).Minimatch}};xt.AST=jo;xt.Minimatch=Bt;xt.escape=$o;xt.unescape=hn;import{fileURLToPath as qI}from"node:url";var Go=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,mS=new Set,Td=typeof process=="object"&&process?process:{},hS=(n,e,t,r)=>{typeof Td.emitWarning=="function"?Td.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},Ws=globalThis.AbortController,uS=globalThis.AbortSignal;if(typeof Ws>"u"){uS=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},Ws=class{constructor(){e()}signal=new uS;abort(r){if(!this.signal.aborted){this.signal.reason=r,this.signal.aborted=!0;for(let o of this.signal._onabort)o(r);this.signal.onabort?.(r)}}};let n=Td.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{n&&(n=!1,hS("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e))}}var fI=n=>!mS.has(n),d3=Symbol("type"),pr=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),gS=n=>pr(n)?n<=Math.pow(2,8)?Uint8Array:n<=Math.pow(2,16)?Uint16Array:n<=Math.pow(2,32)?Uint32Array:n<=Number.MAX_SAFE_INTEGER?Wo:null:null,Wo=class extends Array{constructor(e){super(e),this.fill(0)}},Ed=class n{heap;length;static#e=!1;static create(e){let t=gS(e);if(!t)return[];n.#e=!0;let r=new n(e,t);return n.#e=!1,r}constructor(e,t){if(!n.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},ma=class n{#e;#t;#i;#r;#a;#w;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#c;#p;#s;#l;#o;#f;#S;#m;#u;#T;#g;#E;#C;#b;#v;#x;#h;static unsafeExposeInternals(e){return{starts:e.#C,ttls:e.#b,sizes:e.#E,keyMap:e.#s,keyList:e.#l,valList:e.#o,next:e.#f,prev:e.#S,get head(){return e.#m},get tail(){return e.#u},free:e.#T,isBackgroundFetch:t=>e.#d(t),backgroundFetch:(t,r,o,i)=>e.#U(t,r,o,i),moveToTail:t=>e.#z(t),indexes:t=>e.#A(t),rindexes:t=>e.#I(t),isStale:t=>e.#y(t)}}get max(){return this.#e}get maxSize(){return this.#t}get calculatedSize(){return this.#p}get size(){return this.#c}get fetchMethod(){return this.#a}get memoMethod(){return this.#w}get dispose(){return this.#i}get disposeAfter(){return this.#r}constructor(e){let{max:t=0,ttl:r,ttlResolution:o=1,ttlAutopurge:i,updateAgeOnGet:a,updateAgeOnHas:s,allowStale:l,dispose:c,disposeAfter:d,noDisposeOnSet:p,noUpdateTTL:u,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:g,fetchMethod:f,memoMethod:S,noDeleteOnFetchRejection:w,noDeleteOnStaleGet:v,allowStaleOnFetchRejection:b,allowStaleOnFetchAbort:T,ignoreFetchAbort:C}=e;if(t!==0&&!pr(t))throw new TypeError("max option must be a nonnegative integer");let A=t?gS(t):Array;if(!A)throw new Error("invalid max value: "+t);if(this.#e=t,this.#t=m,this.maxEntrySize=h||this.#t,this.sizeCalculation=g,this.sizeCalculation){if(!this.#t&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#w=S,f!==void 0&&typeof f!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#a=f,this.#x=!!f,this.#s=new Map,this.#l=new Array(t).fill(void 0),this.#o=new Array(t).fill(void 0),this.#f=new A(t),this.#S=new A(t),this.#m=0,this.#u=0,this.#T=Ed.create(t),this.#c=0,this.#p=0,typeof c=="function"&&(this.#i=c),typeof d=="function"?(this.#r=d,this.#g=[]):(this.#r=void 0,this.#g=void 0),this.#v=!!this.#i,this.#h=!!this.#r,this.noDisposeOnSet=!!p,this.noUpdateTTL=!!u,this.noDeleteOnFetchRejection=!!w,this.allowStaleOnFetchRejection=!!b,this.allowStaleOnFetchAbort=!!T,this.ignoreFetchAbort=!!C,this.maxEntrySize!==0){if(this.#t!==0&&!pr(this.#t))throw new TypeError("maxSize must be a positive integer if specified");if(!pr(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#L()}if(this.allowStale=!!l,this.noDeleteOnStaleGet=!!v,this.updateAgeOnGet=!!a,this.updateAgeOnHas=!!s,this.ttlResolution=pr(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=r||0,this.ttl){if(!pr(this.ttl))throw new TypeError("ttl must be a positive integer if specified");this.#P()}if(this.#e===0&&this.ttl===0&&this.#t===0)throw new TypeError("At least one of max, maxSize, or ttl is required");if(!this.ttlAutopurge&&!this.#e&&!this.#t){let k="LRU_CACHE_UNBOUNDED";fI(k)&&(mS.add(k),hS("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",k,n))}}getRemainingTTL(e){return this.#s.has(e)?1/0:0}#P(){let e=new Wo(this.#e),t=new Wo(this.#e);this.#b=e,this.#C=t,this.#M=(i,a,s=Go.now())=>{if(t[i]=a!==0?s:0,e[i]=a,a!==0&&this.ttlAutopurge){let l=setTimeout(()=>{this.#y(i)&&this.#O(this.#l[i],"expire")},a+1);l.unref&&l.unref()}},this.#R=i=>{t[i]=e[i]!==0?Go.now():0},this.#n=(i,a)=>{if(e[a]){let s=e[a],l=t[a];if(!s||!l)return;i.ttl=s,i.start=l,i.now=r||o();let c=i.now-l;i.remainingTTL=s-c}};let r=0,o=()=>{let i=Go.now();if(this.ttlResolution>0){r=i;let a=setTimeout(()=>r=0,this.ttlResolution);a.unref&&a.unref()}return i};this.getRemainingTTL=i=>{let a=this.#s.get(i);if(a===void 0)return 0;let s=e[a],l=t[a];if(!s||!l)return 1/0;let c=(r||o())-l;return s-c},this.#y=i=>{let a=t[i],s=e[i];return!!s&&!!a&&(r||o())-a>s}}#R=()=>{};#n=()=>{};#M=()=>{};#y=()=>!1;#L(){let e=new Wo(this.#e);this.#p=0,this.#E=e,this.#N=t=>{this.#p-=e[t],e[t]=0},this.#_=(t,r,o,i)=>{if(this.#d(r))return 0;if(!pr(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(r,t),!pr(o))throw new TypeError("sizeCalculation return invalid (expect positive integer)")}else throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");return o},this.#k=(t,r,o)=>{if(e[t]=r,this.#t){let i=this.#t-e[t];for(;this.#p>i;)this.#F(!0)}this.#p+=e[t],o&&(o.entrySize=r,o.totalCalculatedSize=this.#p)}}#N=e=>{};#k=(e,t,r)=>{};#_=(e,t,r,o)=>{if(r||o)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#u;!(!this.#D(t)||((e||!this.#y(t))&&(yield t),t===this.#m));)t=this.#S[t]}*#I({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#m;!(!this.#D(t)||((e||!this.#y(t))&&(yield t),t===this.#u));)t=this.#f[t]}#D(e){return e!==void 0&&this.#s.get(this.#l[e])===e}*entries(){for(let e of this.#A())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*rentries(){for(let e of this.#I())this.#o[e]!==void 0&&this.#l[e]!==void 0&&!this.#d(this.#o[e])&&(yield[this.#l[e],this.#o[e]])}*keys(){for(let e of this.#A()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*rkeys(){for(let e of this.#I()){let t=this.#l[e];t!==void 0&&!this.#d(this.#o[e])&&(yield t)}}*values(){for(let e of this.#A())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}*rvalues(){for(let e of this.#I())this.#o[e]!==void 0&&!this.#d(this.#o[e])&&(yield this.#o[e])}[Symbol.iterator](){return this.entries()}[Symbol.toStringTag]="LRUCache";find(e,t={}){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;if(i!==void 0&&e(i,this.#l[r],this))return this.get(this.#l[r],t)}}forEach(e,t=this){for(let r of this.#A()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}rforEach(e,t=this){for(let r of this.#I()){let o=this.#o[r],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[r],this)}}purgeStale(){let e=!1;for(let t of this.#I({allowStale:!0}))this.#y(t)&&(this.#O(this.#l[t],"expire"),e=!0);return e}info(e){let t=this.#s.get(e);if(t===void 0)return;let r=this.#o[t],o=this.#d(r)?r.__staleWhileFetching:r;if(o===void 0)return;let i={value:o};if(this.#b&&this.#C){let a=this.#b[t],s=this.#C[t];if(a&&s){let l=a-(Go.now()-s);i.ttl=l,i.start=Date.now()}}return this.#E&&(i.size=this.#E[t]),i}dump(){let e=[];for(let t of this.#A({allowStale:!0})){let r=this.#l[t],o=this.#o[t],i=this.#d(o)?o.__staleWhileFetching:o;if(i===void 0||r===void 0)continue;let a={value:i};if(this.#b&&this.#C){a.ttl=this.#b[t];let s=Go.now()-this.#C[t];a.start=Math.floor(Date.now()-s)}this.#E&&(a.size=this.#E[t]),e.unshift([r,a])}return e}load(e){this.clear();for(let[t,r]of e){if(r.start){let o=Date.now()-r.start;r.start=Go.now()-o}this.set(t,r.value,r)}}set(e,t,r={}){if(t===void 0)return this.delete(e),this;let{ttl:o=this.ttl,start:i,noDisposeOnSet:a=this.noDisposeOnSet,sizeCalculation:s=this.sizeCalculation,status:l}=r,{noUpdateTTL:c=this.noUpdateTTL}=r,d=this.#_(e,t,r.size||0,s);if(this.maxEntrySize&&d>this.maxEntrySize)return l&&(l.set="miss",l.maxEntrySizeExceeded=!0),this.#O(e,"set"),this;let p=this.#c===0?void 0:this.#s.get(e);if(p===void 0)p=this.#c===0?this.#u:this.#T.length!==0?this.#T.pop():this.#c===this.#e?this.#F(!1):this.#c,this.#l[p]=e,this.#o[p]=t,this.#s.set(e,p),this.#f[this.#u]=p,this.#S[p]=this.#u,this.#u=p,this.#c++,this.#k(p,d,l),l&&(l.set="add"),c=!1;else{this.#z(p);let u=this.#o[p];if(t!==u){if(this.#x&&this.#d(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:m}=u;m!==void 0&&!a&&(this.#v&&this.#i?.(m,e,"set"),this.#h&&this.#g?.push([m,e,"set"]))}else a||(this.#v&&this.#i?.(u,e,"set"),this.#h&&this.#g?.push([u,e,"set"]));if(this.#N(p),this.#k(p,d,l),this.#o[p]=t,l){l.set="replace";let m=u&&this.#d(u)?u.__staleWhileFetching:u;m!==void 0&&(l.oldValue=m)}}else l&&(l.set="update")}if(o!==0&&!this.#b&&this.#P(),this.#b&&(c||this.#M(p,o,i),l&&this.#n(l,p)),!a&&this.#h&&this.#g){let u=this.#g,m;for(;m=u?.shift();)this.#r?.(...m)}return this}pop(){try{for(;this.#c;){let e=this.#o[this.#m];if(this.#F(!0),this.#d(e)){if(e.__staleWhileFetching)return e.__staleWhileFetching}else if(e!==void 0)return e}}finally{if(this.#h&&this.#g){let e=this.#g,t;for(;t=e?.shift();)this.#r?.(...t)}}}#F(e){let t=this.#m,r=this.#l[t],o=this.#o[t];return this.#x&&this.#d(o)?o.__abortController.abort(new Error("evicted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(o,r,"evict"),this.#h&&this.#g?.push([o,r,"evict"])),this.#N(t),e&&(this.#l[t]=void 0,this.#o[t]=void 0,this.#T.push(t)),this.#c===1?(this.#m=this.#u=0,this.#T.length=0):this.#m=this.#f[t],this.#s.delete(r),this.#c--,t}has(e,t={}){let{updateAgeOnHas:r=this.updateAgeOnHas,status:o}=t,i=this.#s.get(e);if(i!==void 0){let a=this.#o[i];if(this.#d(a)&&a.__staleWhileFetching===void 0)return!1;if(this.#y(i))o&&(o.has="stale",this.#n(o,i));else return r&&this.#R(i),o&&(o.has="hit",this.#n(o,i)),!0}else o&&(o.has="miss");return!1}peek(e,t={}){let{allowStale:r=this.allowStale}=t,o=this.#s.get(e);if(o===void 0||!r&&this.#y(o))return;let i=this.#o[o];return this.#d(i)?i.__staleWhileFetching:i}#U(e,t,r,o){let i=t===void 0?void 0:this.#o[t];if(this.#d(i))return i;let a=new Ws,{signal:s}=r;s?.addEventListener("abort",()=>a.abort(s.reason),{signal:a.signal});let l={signal:a.signal,options:r,context:o},c=(g,f=!1)=>{let{aborted:S}=a.signal,w=r.ignoreFetchAbort&&g!==void 0;if(r.status&&(S&&!f?(r.status.fetchAborted=!0,r.status.fetchError=a.signal.reason,w&&(r.status.fetchAbortIgnored=!0)):r.status.fetchResolved=!0),S&&!w&&!f)return p(a.signal.reason);let v=m;return this.#o[t]===m&&(g===void 0?v.__staleWhileFetching?this.#o[t]=v.__staleWhileFetching:this.#O(e,"fetch"):(r.status&&(r.status.fetchUpdated=!0),this.set(e,g,l.options))),g},d=g=>(r.status&&(r.status.fetchRejected=!0,r.status.fetchError=g),p(g)),p=g=>{let{aborted:f}=a.signal,S=f&&r.allowStaleOnFetchAbort,w=S||r.allowStaleOnFetchRejection,v=w||r.noDeleteOnFetchRejection,b=m;if(this.#o[t]===m&&(!v||b.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=b.__staleWhileFetching)),w)return r.status&&b.__staleWhileFetching!==void 0&&(r.status.returnedStale=!0),b.__staleWhileFetching;if(b.__returned===b)throw g},u=(g,f)=>{let S=this.#a?.(e,i,l);S&&S instanceof Promise&&S.then(w=>g(w===void 0?void 0:w),f),a.signal.addEventListener("abort",()=>{(!r.ignoreFetchAbort||r.allowStaleOnFetchAbort)&&(g(void 0),r.allowStaleOnFetchAbort&&(g=w=>c(w,!0)))})};r.status&&(r.status.fetchDispatched=!0);let m=new Promise(u).then(c,d),h=Object.assign(m,{__abortController:a,__staleWhileFetching:i,__returned:void 0});return t===void 0?(this.set(e,h,{...l.options,status:void 0}),t=this.#s.get(e)):this.#o[t]=h,h}#d(e){if(!this.#x)return!1;let t=e;return!!t&&t instanceof Promise&&t.hasOwnProperty("__staleWhileFetching")&&t.__abortController instanceof Ws}async fetch(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,ttl:a=this.ttl,noDisposeOnSet:s=this.noDisposeOnSet,size:l=0,sizeCalculation:c=this.sizeCalculation,noUpdateTTL:d=this.noUpdateTTL,noDeleteOnFetchRejection:p=this.noDeleteOnFetchRejection,allowStaleOnFetchRejection:u=this.allowStaleOnFetchRejection,ignoreFetchAbort:m=this.ignoreFetchAbort,allowStaleOnFetchAbort:h=this.allowStaleOnFetchAbort,context:g,forceRefresh:f=!1,status:S,signal:w}=t;if(!this.#x)return S&&(S.fetch="get"),this.get(e,{allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let v={allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:a,noDisposeOnSet:s,size:l,sizeCalculation:c,noUpdateTTL:d,noDeleteOnFetchRejection:p,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:S,signal:w},b=this.#s.get(e);if(b===void 0){S&&(S.fetch="miss");let T=this.#U(e,b,v,g);return T.__returned=T}else{let T=this.#o[b];if(this.#d(T)){let j=r&&T.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",j&&(S.returnedStale=!0)),j?T.__staleWhileFetching:T.__returned=T}let C=this.#y(b);if(!f&&!C)return S&&(S.fetch="hit"),this.#z(b),o&&this.#R(b),S&&this.#n(S,b),T;let A=this.#U(e,b,v,g),L=A.__staleWhileFetching!==void 0&&r;return S&&(S.fetch=C?"stale":"refresh",L&&C&&(S.returnedStale=!0)),L?A.__staleWhileFetching:A.__returned=A}}async forceFetch(e,t={}){let r=await this.fetch(e,t);if(r===void 0)throw new Error("fetch() returned undefined");return r}memo(e,t={}){let r=this.#w;if(!r)throw new Error("no memoMethod provided to constructor");let{context:o,forceRefresh:i,...a}=t,s=this.get(e,a);if(!i&&s!==void 0)return s;let l=r(e,s,{options:a,context:o});return this.set(e,l,a),l}get(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,status:a}=t,s=this.#s.get(e);if(s!==void 0){let l=this.#o[s],c=this.#d(l);return a&&this.#n(a,s),this.#y(s)?(a&&(a.get="stale"),c?(a&&r&&l.__staleWhileFetching!==void 0&&(a.returnedStale=!0),r?l.__staleWhileFetching:void 0):(i||this.#O(e,"expire"),a&&r&&(a.returnedStale=!0),r?l:void 0)):(a&&(a.get="hit"),c?l.__staleWhileFetching:(this.#z(s),o&&this.#R(s),l))}else a&&(a.get="miss")}#B(e,t){this.#S[t]=e,this.#f[e]=t}#z(e){e!==this.#u&&(e===this.#m?this.#m=this.#f[e]:this.#B(this.#S[e],this.#f[e]),this.#B(this.#u,e),this.#u=e)}delete(e){return this.#O(e,"delete")}#O(e,t){let r=!1;if(this.#c!==0){let o=this.#s.get(e);if(o!==void 0)if(r=!0,this.#c===1)this.#H(t);else{this.#N(o);let i=this.#o[o];if(this.#d(i)?i.__abortController.abort(new Error("deleted")):(this.#v||this.#h)&&(this.#v&&this.#i?.(i,e,t),this.#h&&this.#g?.push([i,e,t])),this.#s.delete(e),this.#l[o]=void 0,this.#o[o]=void 0,o===this.#u)this.#u=this.#S[o];else if(o===this.#m)this.#m=this.#f[o];else{let a=this.#S[o];this.#f[a]=this.#f[o];let s=this.#f[o];this.#S[s]=this.#S[o]}this.#c--,this.#T.push(o)}}if(this.#h&&this.#g?.length){let o=this.#g,i;for(;i=o?.shift();)this.#r?.(...i)}return r}clear(){return this.#H("delete")}#H(e){for(let t of this.#I({allowStale:!0})){let r=this.#o[t];if(this.#d(r))r.__abortController.abort(new Error("deleted"));else{let o=this.#l[t];this.#v&&this.#i?.(r,o,e),this.#h&&this.#g?.push([r,o,e])}}if(this.#s.clear(),this.#o.fill(void 0),this.#l.fill(void 0),this.#b&&this.#C&&(this.#b.fill(0),this.#C.fill(0)),this.#E&&this.#E.fill(0),this.#m=0,this.#u=0,this.#T.length=0,this.#p=0,this.#c=0,this.#h&&this.#g){let t=this.#g,r;for(;r=t?.shift();)this.#r?.(...r)}}};import{posix as AI,win32 as kd}from"node:path";import{fileURLToPath as II}from"node:url";import{lstatSync as PI,readdir as LI,readdirSync as OI,readlinkSync as MI,realpathSync as NI}from"fs";import*as kI from"node:fs";import{lstat as DI,readdir as FI,readlink as UI,realpath as BI}from"node:fs/promises";import{EventEmitter as Od}from"node:events";import wS from"node:stream";import{StringDecoder as SI}from"node:string_decoder";var fS=typeof process=="object"&&process?process:{stdout:null,stderr:null},yI=n=>!!n&&typeof n=="object"&&(n instanceof mr||n instanceof wS||bI(n)||wI(n)),bI=n=>!!n&&typeof n=="object"&&n instanceof Od&&typeof n.pipe=="function"&&n.pipe!==wS.Writable.prototype.pipe,wI=n=>!!n&&typeof n=="object"&&n instanceof Od&&typeof n.write=="function"&&typeof n.end=="function",Vn=Symbol("EOF"),qn=Symbol("maybeEmitEnd"),ur=Symbol("emittedEnd"),Vs=Symbol("emittingEnd"),ha=Symbol("emittedError"),qs=Symbol("closed"),SS=Symbol("read"),Ks=Symbol("flush"),yS=Symbol("flushChunk"),gn=Symbol("encoding"),Vo=Symbol("decoder"),Qe=Symbol("flowing"),ga=Symbol("paused"),qo=Symbol("resume"),et=Symbol("buffer"),Tt=Symbol("pipes"),tt=Symbol("bufferLength"),Cd=Symbol("bufferPush"),Ys=Symbol("bufferShift"),mt=Symbol("objectMode"),He=Symbol("destroyed"),Rd=Symbol("error"),Ad=Symbol("emitData"),bS=Symbol("emitEnd"),Id=Symbol("emitEnd2"),In=Symbol("async"),Pd=Symbol("abort"),Js=Symbol("aborted"),fa=Symbol("signal"),Zr=Symbol("dataListeners"),zt=Symbol("discarded"),Sa=n=>Promise.resolve().then(n),vI=n=>n(),xI=n=>n==="end"||n==="finish"||n==="prefinish",TI=n=>n instanceof ArrayBuffer||!!n&&typeof n=="object"&&n.constructor&&n.constructor.name==="ArrayBuffer"&&n.byteLength>=0,EI=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),Xs=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[qo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Ld=class extends Xs{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,r){super(e,t,r),this.proxyErrors=o=>t.emit("error",o),e.on("error",this.proxyErrors)}},CI=n=>!!n.objectMode,RI=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",mr=class extends Od{[Qe]=!1;[ga]=!1;[Tt]=[];[et]=[];[mt];[gn];[In];[Vo];[Vn]=!1;[ur]=!1;[Vs]=!1;[qs]=!1;[ha]=null;[tt]=0;[He]=!1;[fa];[Js]=!1;[Zr]=0;[zt]=!1;writable=!0;readable=!0;constructor(...e){let t=e[0]||{};if(super(),t.objectMode&&typeof t.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");CI(t)?(this[mt]=!0,this[gn]=null):RI(t)?(this[gn]=t.encoding,this[mt]=!1):(this[mt]=!1,this[gn]=null),this[In]=!!t.async,this[Vo]=this[gn]?new SI(this[gn]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[et]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[Tt]});let{signal:r}=t;r&&(this[fa]=r,r.aborted?this[Pd]():r.addEventListener("abort",()=>this[Pd]()))}get bufferLength(){return this[tt]}get encoding(){return this[gn]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[mt]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[In]}set async(e){this[In]=this[In]||!!e}[Pd](){this[Js]=!0,this.emit("abort",this[fa]?.reason),this.destroy(this[fa]?.reason)}get aborted(){return this[Js]}set aborted(e){}write(e,t,r){if(this[Js])return!1;if(this[Vn])throw new Error("write after end");if(this[He])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof t=="function"&&(r=t,t="utf8"),t||(t="utf8");let o=this[In]?Sa:vI;if(!this[mt]&&!Buffer.isBuffer(e)){if(EI(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(TI(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[mt]?(this[Qe]&&this[tt]!==0&&this[Ks](!0),this[Qe]?this.emit("data",e):this[Cd](e),this[tt]!==0&&this.emit("readable"),r&&o(r),this[Qe]):e.length?(typeof e=="string"&&!(t===this[gn]&&!this[Vo]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[gn]&&(e=this[Vo].write(e)),this[Qe]&&this[tt]!==0&&this[Ks](!0),this[Qe]?this.emit("data",e):this[Cd](e),this[tt]!==0&&this.emit("readable"),r&&o(r),this[Qe]):(this[tt]!==0&&this.emit("readable"),r&&o(r),this[Qe])}read(e){if(this[He])return null;if(this[zt]=!1,this[tt]===0||e===0||e&&e>this[tt])return this[qn](),null;this[mt]&&(e=null),this[et].length>1&&!this[mt]&&(this[et]=[this[gn]?this[et].join(""):Buffer.concat(this[et],this[tt])]);let t=this[SS](e||null,this[et][0]);return this[qn](),t}[SS](e,t){if(this[mt])this[Ys]();else{let r=t;e===r.length||e===null?this[Ys]():typeof r=="string"?(this[et][0]=r.slice(e),t=r.slice(0,e),this[tt]-=e):(this[et][0]=r.subarray(e),t=r.subarray(0,e),this[tt]-=e)}return this.emit("data",t),!this[et].length&&!this[Vn]&&this.emit("drain"),t}end(e,t,r){return typeof e=="function"&&(r=e,e=void 0),typeof t=="function"&&(r=t,t="utf8"),e!==void 0&&this.write(e,t),r&&this.once("end",r),this[Vn]=!0,this.writable=!1,(this[Qe]||!this[ga])&&this[qn](),this}[qo](){this[He]||(!this[Zr]&&!this[Tt].length&&(this[zt]=!0),this[ga]=!1,this[Qe]=!0,this.emit("resume"),this[et].length?this[Ks]():this[Vn]?this[qn]():this.emit("drain"))}resume(){return this[qo]()}pause(){this[Qe]=!1,this[ga]=!0,this[zt]=!1}get destroyed(){return this[He]}get flowing(){return this[Qe]}get paused(){return this[ga]}[Cd](e){this[mt]?this[tt]+=1:this[tt]+=e.length,this[et].push(e)}[Ys](){return this[mt]?this[tt]-=1:this[tt]-=this[et][0].length,this[et].shift()}[Ks](e=!1){do;while(this[yS](this[Ys]())&&this[et].length);!e&&!this[et].length&&!this[Vn]&&this.emit("drain")}[yS](e){return this.emit("data",e),this[Qe]}pipe(e,t){if(this[He])return e;this[zt]=!1;let r=this[ur];return t=t||{},e===fS.stdout||e===fS.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[Tt].push(t.proxyErrors?new Ld(this,e,t):new Xs(this,e,t)),this[In]?Sa(()=>this[qo]()):this[qo]()),e}unpipe(e){let t=this[Tt].find(r=>r.dest===e);t&&(this[Tt].length===1?(this[Qe]&&this[Zr]===0&&(this[Qe]=!1),this[Tt]=[]):this[Tt].splice(this[Tt].indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let r=super.on(e,t);if(e==="data")this[zt]=!1,this[Zr]++,!this[Tt].length&&!this[Qe]&&this[qo]();else if(e==="readable"&&this[tt]!==0)super.emit("readable");else if(xI(e)&&this[ur])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[ha]){let o=t;this[In]?Sa(()=>o.call(this,this[ha])):o.call(this,this[ha])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Zr]=this.listeners("data").length,this[Zr]===0&&!this[zt]&&!this[Tt].length&&(this[Qe]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Zr]=0,!this[zt]&&!this[Tt].length&&(this[Qe]=!1)),t}get emittedEnd(){return this[ur]}[qn](){!this[Vs]&&!this[ur]&&!this[He]&&this[et].length===0&&this[Vn]&&(this[Vs]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[qs]&&this.emit("close"),this[Vs]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==He&&this[He])return!1;if(e==="data")return!this[mt]&&!r?!1:this[In]?(Sa(()=>this[Ad](r)),!0):this[Ad](r);if(e==="end")return this[bS]();if(e==="close"){if(this[qs]=!0,!this[ur]&&!this[He])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[ha]=r,super.emit(Rd,r);let i=!this[fa]||this.listeners("error").length?super.emit("error",r):!1;return this[qn](),i}else if(e==="resume"){let i=super.emit("resume");return this[qn](),i}else if(e==="finish"||e==="prefinish"){let i=super.emit(e);return this.removeAllListeners(e),i}let o=super.emit(e,...t);return this[qn](),o}[Ad](e){for(let r of this[Tt])r.dest.write(e)===!1&&this.pause();let t=this[zt]?!1:super.emit("data",e);return this[qn](),t}[bS](){return this[ur]?!1:(this[ur]=!0,this.readable=!1,this[In]?(Sa(()=>this[Id]()),!0):this[Id]())}[Id](){if(this[Vo]){let t=this[Vo].end();if(t){for(let r of this[Tt])r.dest.write(t);this[zt]||super.emit("data",t)}}for(let t of this[Tt])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[mt]||(e.dataLength=0);let t=this.promise();return this.on("data",r=>{e.push(r),this[mt]||(e.dataLength+=r.length)}),await t,e}async concat(){if(this[mt])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[gn]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on(He,()=>t(new Error("stream destroyed"))),this.on("error",r=>t(r)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[zt]=!1;let e=!1,t=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return t();let o=this.read();if(o!==null)return Promise.resolve({done:!1,value:o});if(this[Vn])return t();let i,a,s=p=>{this.off("data",l),this.off("end",c),this.off(He,d),t(),a(p)},l=p=>{this.off("error",s),this.off("end",c),this.off(He,d),this.pause(),i({value:p,done:!!this[Vn]})},c=()=>{this.off("error",s),this.off("data",l),this.off(He,d),t(),i({done:!0,value:void 0})},d=()=>s(new Error("stream destroyed"));return new Promise((p,u)=>{a=u,i=p,this.once(He,d),this.once("error",s),this.once("end",c),this.once("data",l)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[zt]=!1;let e=!1,t=()=>(this.pause(),this.off(Rd,t),this.off(He,t),this.off("end",t),e=!0,{done:!0,value:void 0}),r=()=>{if(e)return t();let o=this.read();return o===null?t():{done:!1,value:o}};return this.once("end",t),this.once(Rd,t),this.once(He,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[He])return e?this.emit("error",e):this.emit(He),this;this[He]=!0,this[zt]=!0,this[et].length=0,this[tt]=0;let t=this;return typeof t.close=="function"&&!this[qs]&&t.close(),e?this.emit("error",e):this.emit(He),this}static get isStream(){return yI}};var _I=NI.native,ba={lstatSync:PI,readdir:LI,readdirSync:OI,readlinkSync:MI,realpathSync:_I,promises:{lstat:DI,readdir:FI,readlink:UI,realpath:BI}},CS=n=>!n||n===ba||n===kI?ba:{...ba,...n,promises:{...ba.promises,...n.promises||{}}},RS=/^\\\\\?\\([a-z]:)\\?$/i,zI=n=>n.replace(/\//g,"\\").replace(RS,"$1\\"),HI=/[\\\/]/,tn=0,AS=1,IS=2,Pn=4,PS=6,LS=8,Qr=10,OS=12,en=15,ya=~en,Md=16,vS=32,wa=64,fn=128,Zs=256,el=512,xS=wa|fn|el,jI=1023,Nd=n=>n.isFile()?LS:n.isDirectory()?Pn:n.isSymbolicLink()?Qr:n.isCharacterDevice()?IS:n.isBlockDevice()?PS:n.isSocket()?OS:n.isFIFO()?AS:tn,TS=new Map,va=n=>{let e=TS.get(n);if(e)return e;let t=n.normalize("NFKD");return TS.set(n,t),t},ES=new Map,Qs=n=>{let e=ES.get(n);if(e)return e;let t=va(n.toLowerCase());return ES.set(n,t),t},tl=class extends ma{constructor(){super({max:256})}},_d=class extends ma{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},MS=Symbol("PathScurry setAsCwd"),ht=class{name;root;roots;parent;nocase;isCWD=!1;#e;#t;get dev(){return this.#t}#i;get mode(){return this.#i}#r;get nlink(){return this.#r}#a;get uid(){return this.#a}#w;get gid(){return this.#w}#c;get rdev(){return this.#c}#p;get blksize(){return this.#p}#s;get ino(){return this.#s}#l;get size(){return this.#l}#o;get blocks(){return this.#o}#f;get atimeMs(){return this.#f}#S;get mtimeMs(){return this.#S}#m;get ctimeMs(){return this.#m}#u;get birthtimeMs(){return this.#u}#T;get atime(){return this.#T}#g;get mtime(){return this.#g}#E;get ctime(){return this.#E}#C;get birthtime(){return this.#C}#b;#v;#x;#h;#P;#R;#n;#M;#y;#L;get parentPath(){return(this.parent||this).fullpath()}get path(){return this.parentPath}constructor(e,t=tn,r,o,i,a,s){this.name=e,this.#b=i?Qs(e):va(e),this.#n=t&jI,this.nocase=i,this.roots=o,this.root=r||this,this.#M=a,this.#x=s.fullpath,this.#P=s.relative,this.#R=s.relativePosix,this.parent=s.parent,this.parent?this.#e=this.parent.#e:this.#e=CS(s.fs)}depth(){return this.#v!==void 0?this.#v:this.parent?this.#v=this.parent.depth()+1:this.#v=0}childrenCache(){return this.#M}resolve(e){if(!e)return this;let t=this.getRootString(e),o=e.substring(t.length).split(this.splitSep);return t?this.getRoot(t).#N(o):this.#N(o)}#N(e){let t=this;for(let r of e)t=t.child(r);return t}children(){let e=this.#M.get(this);if(e)return e;let t=Object.assign([],{provisional:0});return this.#M.set(this,t),this.#n&=~Md,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?Qs(e):va(e);for(let l of r)if(l.#b===o)return l;let i=this.parent?this.sep:"",a=this.#x?this.#x+i+e:void 0,s=this.newChild(e,tn,{...t,parent:this,fullpath:a});return this.canReaddir()||(s.#n|=fn),r.push(s),s}relative(){if(this.isCWD)return"";if(this.#P!==void 0)return this.#P;let e=this.name,t=this.parent;if(!t)return this.#P=this.name;let r=t.relative();return r+(!r||!t.parent?"":this.sep)+e}relativePosix(){if(this.sep==="/")return this.relative();if(this.isCWD)return"";if(this.#R!==void 0)return this.#R;let e=this.name,t=this.parent;if(!t)return this.#R=this.fullpathPosix();let r=t.relativePosix();return r+(!r||!t.parent?"":"/")+e}fullpath(){if(this.#x!==void 0)return this.#x;let e=this.name,t=this.parent;if(!t)return this.#x=this.name;let o=t.fullpath()+(t.parent?this.sep:"")+e;return this.#x=o}fullpathPosix(){if(this.#h!==void 0)return this.#h;if(this.sep==="/")return this.#h=this.fullpath();if(!this.parent){let o=this.fullpath().replace(/\\/g,"/");return/^[a-z]:\//i.test(o)?this.#h=`//?/${o}`:this.#h=o}let e=this.parent,t=e.fullpathPosix(),r=t+(!t||!e.parent?"":"/")+this.name;return this.#h=r}isUnknown(){return(this.#n&en)===tn}isType(e){return this[`is${e}`]()}getType(){return this.isUnknown()?"Unknown":this.isDirectory()?"Directory":this.isFile()?"File":this.isSymbolicLink()?"SymbolicLink":this.isFIFO()?"FIFO":this.isCharacterDevice()?"CharacterDevice":this.isBlockDevice()?"BlockDevice":this.isSocket()?"Socket":"Unknown"}isFile(){return(this.#n&en)===LS}isDirectory(){return(this.#n&en)===Pn}isCharacterDevice(){return(this.#n&en)===IS}isBlockDevice(){return(this.#n&en)===PS}isFIFO(){return(this.#n&en)===AS}isSocket(){return(this.#n&en)===OS}isSymbolicLink(){return(this.#n&Qr)===Qr}lstatCached(){return this.#n&vS?this:void 0}readlinkCached(){return this.#y}realpathCached(){return this.#L}readdirCached(){let e=this.children();return e.slice(0,e.provisional)}canReadlink(){if(this.#y)return!0;if(!this.parent)return!1;let e=this.#n&en;return!(e!==tn&&e!==Qr||this.#n&Zs||this.#n&fn)}calledReaddir(){return!!(this.#n&Md)}isENOENT(){return!!(this.#n&fn)}isNamed(e){return this.nocase?this.#b===Qs(e):this.#b===va(e)}async readlink(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=await this.#e.promises.readlink(this.fullpath()),r=(await this.parent.realpath())?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}readlinkSync(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=this.#e.readlinkSync(this.fullpath()),r=this.parent.realpathSync()?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}#k(e){this.#n|=Md;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#_()}}#_(){this.#n&fn||(this.#n=(this.#n|fn)&ya,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#_()}#I(){this.#n|=el,this.#D()}#D(){if(this.#n&wa)return;let e=this.#n;(e&en)===Pn&&(e&=ya),this.#n=e|wa,this.#A()}#F(e=""){e==="ENOTDIR"||e==="EPERM"?this.#D():e==="ENOENT"?this.#_():this.children().provisional=0}#U(e=""){e==="ENOTDIR"?this.parent.#D():e==="ENOENT"&&this.#_()}#d(e=""){let t=this.#n;t|=Zs,e==="ENOENT"&&(t|=fn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=ya),this.#n=t,e==="ENOTDIR"&&this.parent&&this.parent.#D()}#B(e,t){return this.#O(e,t)||this.#z(e,t)}#z(e,t){let r=Nd(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&en;return i!==Pn&&i!==Qr&&i!==tn&&(o.#n|=wa),t.unshift(o),t.provisional++,o}#O(e,t){for(let r=t.provisional;r<t.length;r++){let o=t[r];if((this.nocase?Qs(e.name):va(e.name))===o.#b)return this.#H(e,o,r,t)}}#H(e,t,r,o){let i=t.name;return t.#n=t.#n&ya|Nd(e),i!==e.name&&(t.name=e.name),r!==o.provisional&&(r===o.length-1?o.pop():o.splice(r,1),o.unshift(t)),o.provisional++,t}async lstat(){if(!(this.#n&fn))try{return this.#W(await this.#e.promises.lstat(this.fullpath())),this}catch(e){this.#U(e.code)}}lstatSync(){if(!(this.#n&fn))try{return this.#W(this.#e.lstatSync(this.fullpath())),this}catch(e){this.#U(e.code)}}#W(e){let{atime:t,atimeMs:r,birthtime:o,birthtimeMs:i,blksize:a,blocks:s,ctime:l,ctimeMs:c,dev:d,gid:p,ino:u,mode:m,mtime:h,mtimeMs:g,nlink:f,rdev:S,size:w,uid:v}=e;this.#T=t,this.#f=r,this.#C=o,this.#u=i,this.#p=a,this.#o=s,this.#E=l,this.#m=c,this.#t=d,this.#w=p,this.#s=u,this.#i=m,this.#g=h,this.#S=g,this.#r=f,this.#c=S,this.#l=w,this.#a=v;let b=Nd(e);this.#n=this.#n&ya|b|vS,b!==tn&&b!==Pn&&b!==Qr&&(this.#n|=wa)}#$=[];#G=!1;#V(e){this.#G=!1;let t=this.#$.slice();this.#$.length=0,t.forEach(r=>r(null,e))}readdirCB(e,t=!1){if(!this.canReaddir()){t?e(null,[]):queueMicrotask(()=>e(null,[]));return}let r=this.children();if(this.calledReaddir()){let i=r.slice(0,r.provisional);t?e(null,i):queueMicrotask(()=>e(null,i));return}if(this.#$.push(e),this.#G)return;this.#G=!0;let o=this.fullpath();this.#e.readdir(o,{withFileTypes:!0},(i,a)=>{if(i)this.#F(i.code),r.provisional=0;else{for(let s of a)this.#B(s,r);this.#k(r)}this.#V(r.slice(0,r.provisional))})}#j;async readdir(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();if(this.#j)await this.#j;else{let r=()=>{};this.#j=new Promise(o=>r=o);try{for(let o of await this.#e.promises.readdir(t,{withFileTypes:!0}))this.#B(o,e);this.#k(e)}catch(o){this.#F(o.code),e.provisional=0}this.#j=void 0,r()}return e.slice(0,e.provisional)}readdirSync(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();try{for(let r of this.#e.readdirSync(t,{withFileTypes:!0}))this.#B(r,e);this.#k(e)}catch(r){this.#F(r.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&xS)return!1;let e=en&this.#n;return e===tn||e===Pn||e===Qr}shouldWalk(e,t){return(this.#n&Pn)===Pn&&!(this.#n&xS)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((el|Zs|fn)&this.#n))try{let e=await this.#e.promises.realpath(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}realpathSync(){if(this.#L)return this.#L;if(!((el|Zs|fn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[MS](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let t=new Set([]),r=[],o=this;for(;o&&o.parent;)t.add(o),o.#P=r.join(this.sep),o.#R=r.join("/"),o=o.parent,r.push("..");for(o=e;o&&o.parent&&!t.has(o);)o.#P=void 0,o.#R=void 0,o=o.parent}},nl=class n extends ht{sep="\\";splitSep=HI;constructor(e,t=tn,r,o,i,a,s){super(e,t,r,o,i,a,s)}newChild(e,t=tn,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}getRootString(e){return kd.parse(e).root}getRoot(e){if(e=zI(e.toUpperCase()),e===this.root.name)return this.root;for(let[t,r]of Object.entries(this.roots))if(this.sameRoot(e,t))return this.roots[e]=r;return this.roots[e]=new Ko(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(RS,"$1\\"),e===t}},rl=class n extends ht{splitSep="/";sep="/";constructor(e,t=tn,r,o,i,a,s){super(e,t,r,o,i,a,s)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,t=tn,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}},ol=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:a=ba}={}){this.#r=CS(a),(e instanceof URL||e.startsWith("file://"))&&(e=II(e));let s=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(s),this.#e=new tl,this.#t=new tl,this.#i=new _d(i);let l=s.substring(this.rootPath.length).split(r);if(l.length===1&&!l[0]&&l.pop(),o===void 0)throw new TypeError("must provide nocase setting to PathScurryBase ctor");this.nocase=o,this.root=this.newRoot(this.#r),this.roots[this.rootPath]=this.root;let c=this.root,d=l.length-1,p=t.sep,u=this.rootPath,m=!1;for(let h of l){let g=d--;c=c.child(h,{relative:new Array(g).fill("..").join(p),relativePosix:new Array(g).fill("..").join("/"),fullpath:u+=(m?"":p)+h}),m=!0}this.cwd=c}depth(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.depth()}childrenCache(){return this.#i}resolve(...e){let t="";for(let i=e.length-1;i>=0;i--){let a=e[i];if(!(!a||a===".")&&(t=t?`${a}/${t}`:a,this.isAbsolute(a)))break}let r=this.#e.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpath();return this.#e.set(t,o),o}resolvePosix(...e){let t="";for(let i=e.length-1;i>=0;i--){let a=e[i];if(!(!a||a===".")&&(t=t?`${a}/${t}`:a,this.isAbsolute(a)))break}let r=this.#t.get(t);if(r!==void 0)return r;let o=this.cwd.resolve(t).fullpathPosix();return this.#t.set(t,o),o}relative(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relative()}relativePosix(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.relativePosix()}basename(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.name}dirname(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),(e.parent||e).fullpath()}async readdir(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r}=t;if(e.canReaddir()){let o=await e.readdir();return r?o:o.map(i=>i.name)}else return[]}readdirSync(e=this.cwd,t={withFileTypes:!0}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r=!0}=t;return e.canReaddir()?r?e.readdirSync():e.readdirSync().map(o=>o.name):[]}async lstat(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstat()}lstatSync(e=this.cwd){return typeof e=="string"&&(e=this.cwd.resolve(e)),e.lstatSync()}async readlink(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e.withFileTypes,e=this.cwd);let r=await e.readlink();return t?r:r?.fullpath()}readlinkSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e.withFileTypes,e=this.cwd);let r=e.readlinkSync();return t?r:r?.fullpath()}async realpath(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e.withFileTypes,e=this.cwd);let r=await e.realpath();return t?r:r?.fullpath()}realpathSync(e=this.cwd,{withFileTypes:t}={withFileTypes:!1}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e.withFileTypes,e=this.cwd);let r=e.realpathSync();return t?r:r?.fullpath()}async walk(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=[];(!i||i(e))&&s.push(r?e:e.fullpath());let l=new Set,c=(p,u)=>{l.add(p),p.readdirCB((m,h)=>{if(m)return u(m);let g=h.length;if(!g)return u();let f=()=>{--g===0&&u()};for(let S of h)(!i||i(S))&&s.push(r?S:S.fullpath()),o&&S.isSymbolicLink()?S.realpath().then(w=>w?.isUnknown()?w.lstat():w).then(w=>w?.shouldWalk(l,a)?c(w,f):f()):S.shouldWalk(l,a)?c(S,f):f()},!0)},d=e;return new Promise((p,u)=>{c(d,m=>{if(m)return u(m);p(s)})})}walkSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=[];(!i||i(e))&&s.push(r?e:e.fullpath());let l=new Set([e]);for(let c of l){let d=c.readdirSync();for(let p of d){(!i||i(p))&&s.push(r?p:p.fullpath());let u=p;if(p.isSymbolicLink()){if(!(o&&(u=p.realpathSync())))continue;u.isUnknown()&&u.lstatSync()}u.shouldWalk(l,a)&&l.add(u)}}return s}[Symbol.asyncIterator](){return this.iterate()}iterate(e=this.cwd,t={}){return typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd),this.stream(e,t)[Symbol.asyncIterator]()}[Symbol.iterator](){return this.iterateSync()}*iterateSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t;(!i||i(e))&&(yield r?e:e.fullpath());let s=new Set([e]);for(let l of s){let c=l.readdirSync();for(let d of c){(!i||i(d))&&(yield r?d:d.fullpath());let p=d;if(d.isSymbolicLink()){if(!(o&&(p=d.realpathSync())))continue;p.isUnknown()&&p.lstatSync()}p.shouldWalk(s,a)&&s.add(p)}}}stream(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=new mr({objectMode:!0});(!i||i(e))&&s.write(r?e:e.fullpath());let l=new Set,c=[e],d=0,p=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){d===0&&s.end();return}d++,l.add(m);let h=(f,S,w=!1)=>{if(f)return s.emit("error",f);if(o&&!w){let v=[];for(let b of S)b.isSymbolicLink()&&v.push(b.realpath().then(T=>T?.isUnknown()?T.lstat():T));if(v.length){Promise.all(v).then(()=>h(null,S,!0));return}}for(let v of S)v&&(!i||i(v))&&(s.write(r?v:v.fullpath())||(u=!0));d--;for(let v of S){let b=v.realpathCached()||v;b.shouldWalk(l,a)&&c.push(b)}u&&!s.flowing?s.once("drain",p):g||p()},g=!0;m.readdirCB(h,!0),g=!1}};return p(),s}streamSync(e=this.cwd,t={}){typeof e=="string"?e=this.cwd.resolve(e):e instanceof ht||(t=e,e=this.cwd);let{withFileTypes:r=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=new mr({objectMode:!0}),l=new Set;(!i||i(e))&&s.write(r?e:e.fullpath());let c=[e],d=0,p=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){d===0&&s.end();return}d++,l.add(m);let h=m.readdirSync();for(let g of h)(!i||i(g))&&(s.write(r?g:g.fullpath())||(u=!0));d--;for(let g of h){let f=g;if(g.isSymbolicLink()){if(!(o&&(f=g.realpathSync())))continue;f.isUnknown()&&f.lstatSync()}f.shouldWalk(l,a)&&c.push(f)}}u&&!s.flowing&&s.once("drain",p)};return p(),s}chdir(e=this.cwd){let t=this.cwd;this.cwd=typeof e=="string"?this.cwd.resolve(e):e,this.cwd[MS](t)}},Ko=class extends ol{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,kd,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return kd.parse(e).root.toUpperCase()}newRoot(e){return new nl(this.rootPath,Pn,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:(\/|\\)/i.test(e)}},Yo=class extends ol{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,AI,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new rl(this.rootPath,Pn,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},xa=class extends Yo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},x3=process.platform==="win32"?nl:rl,NS=process.platform==="win32"?Ko:process.platform==="darwin"?xa:Yo;var $I=n=>n.length>=1,GI=n=>n.length>=1,Jo=class n{#e;#t;#i;length;#r;#a;#w;#c;#p;#s;#l=!0;constructor(e,t,r,o){if(!$I(e))throw new TypeError("empty pattern list");if(!GI(t))throw new TypeError("empty glob list");if(t.length!==e.length)throw new TypeError("mismatched pattern list and glob list lengths");if(this.length=e.length,r<0||r>=this.length)throw new TypeError("index out of range");if(this.#e=e,this.#t=t,this.#i=r,this.#r=o,this.#i===0){if(this.isUNC()){let[i,a,s,l,...c]=this.#e,[d,p,u,m,...h]=this.#t;c[0]===""&&(c.shift(),h.shift());let g=[i,a,s,l,""].join("/"),f=[d,p,u,m,""].join("/");this.#e=[g,...c],this.#t=[f,...h],this.length=this.#e.length}else if(this.isDrive()||this.isAbsolute()){let[i,...a]=this.#e,[s,...l]=this.#t;a[0]===""&&(a.shift(),l.shift());let c=i+"/",d=s+"/";this.#e=[c,...a],this.#t=[d,...l],this.length=this.#e.length}}}pattern(){return this.#e[this.#i]}isString(){return typeof this.#e[this.#i]=="string"}isGlobstar(){return this.#e[this.#i]===st}isRegExp(){return this.#e[this.#i]instanceof RegExp}globString(){return this.#w=this.#w||(this.#i===0?this.isAbsolute()?this.#t[0]+this.#t.slice(1).join("/"):this.#t.join("/"):this.#t.slice(this.#i).join("/"))}hasMore(){return this.length>this.#i+1}rest(){return this.#a!==void 0?this.#a:this.hasMore()?(this.#a=new n(this.#e,this.#t,this.#i+1,this.#r),this.#a.#s=this.#s,this.#a.#p=this.#p,this.#a.#c=this.#c,this.#a):this.#a=null}isUNC(){let e=this.#e;return this.#p!==void 0?this.#p:this.#p=this.#r==="win32"&&this.#i===0&&e[0]===""&&e[1]===""&&typeof e[2]=="string"&&!!e[2]&&typeof e[3]=="string"&&!!e[3]}isDrive(){let e=this.#e;return this.#c!==void 0?this.#c:this.#c=this.#r==="win32"&&this.#i===0&&this.length>1&&typeof e[0]=="string"&&/^[a-z]:$/i.test(e[0])}isAbsolute(){let e=this.#e;return this.#s!==void 0?this.#s:this.#s=e[0]===""&&e.length>1||this.isDrive()||this.isUNC()}root(){let e=this.#e[0];return typeof e=="string"&&this.isAbsolute()&&this.#i===0?e:""}checkFollowGlobstar(){return!(this.#i===0||!this.isGlobstar()||!this.#l)}markFollowGlobstar(){return this.#i===0||!this.isGlobstar()||!this.#l?!1:(this.#l=!1,!0)}};var WI=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Xo=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:r,noext:o,noglobstar:i,platform:a=WI}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=a,this.mmopts={dot:!0,nobrace:t,nocase:r,noext:o,noglobstar:i,optimizationLevel:2,platform:a,nocomment:!0,nonegate:!0};for(let s of e)this.add(s)}add(e){let t=new Bt(e,this.mmopts);for(let r=0;r<t.set.length;r++){let o=t.set[r],i=t.globParts[r];if(!o||!i)throw new Error("invalid pattern object");for(;o[0]==="."&&i[0]===".";)o.shift(),i.shift();let a=new Jo(o,i,0,this.platform),s=new Bt(a.globString(),this.mmopts),l=i[i.length-1]==="**",c=a.isAbsolute();c?this.absolute.push(s):this.relative.push(s),l&&(c?this.absoluteChildren.push(s):this.relativeChildren.push(s))}}ignored(e){let t=e.fullpath(),r=`${t}/`,o=e.relative()||".",i=`${o}/`;for(let a of this.relative)if(a.match(o)||a.match(i))return!0;for(let a of this.absolute)if(a.match(t)||a.match(r))return!0;return!1}childrenIgnored(e){let t=e.fullpath()+"/",r=(e.relative()||".")+"/";for(let o of this.relativeChildren)if(o.match(r))return!0;for(let o of this.absoluteChildren)if(o.match(t))return!0;return!1}};var Dd=class n{store;constructor(e=new Map){this.store=e}copy(){return new n(new Map(this.store))}hasWalked(e,t){return this.store.get(e.fullpath())?.has(t.globString())}storeWalked(e,t){let r=e.fullpath(),o=this.store.get(r);o?o.add(t.globString()):this.store.set(r,new Set([t.globString()]))}},Fd=class{store=new Map;add(e,t,r){let o=(t?2:0)|(r?1:0),i=this.store.get(e);this.store.set(e,i===void 0?o:o&i)}entries(){return[...this.store.entries()].map(([e,t])=>[e,!!(t&2),!!(t&1)])}},Ud=class{store=new Map;add(e,t){if(!e.canReaddir())return;let r=this.store.get(e);r?r.find(o=>o.globString()===t.globString())||r.push(t):this.store.set(e,[t])}get(e){let t=this.store.get(e);if(!t)throw new Error("attempting to walk unknown path");return t}entries(){return this.keys().map(e=>[e,this.store.get(e)])}keys(){return[...this.store.keys()].filter(e=>e.canReaddir())}},Ta=class n{hasWalkedCache;matches=new Fd;subwalks=new Ud;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Dd}processPatterns(e,t){this.patterns=t;let r=t.map(o=>[e,o]);for(let[o,i]of r){this.hasWalkedCache.storeWalked(o,i);let a=i.root(),s=i.isAbsolute()&&this.opts.absolute!==!1;if(a){o=o.resolve(a==="/"&&this.opts.root!==void 0?this.opts.root:a);let p=i.rest();if(p)i=p;else{this.matches.add(o,!0,!1);continue}}if(o.isENOENT())continue;let l,c,d=!1;for(;typeof(l=i.pattern())=="string"&&(c=i.rest());)o=o.resolve(l),i=c,d=!0;if(l=i.pattern(),c=i.rest(),d){if(this.hasWalkedCache.hasWalked(o,i))continue;this.hasWalkedCache.storeWalked(o,i)}if(typeof l=="string"){let p=l===".."||l===""||l===".";this.matches.add(o.resolve(l),s,p);continue}else if(l===st){(!o.isSymbolicLink()||this.follow||i.checkFollowGlobstar())&&this.subwalks.add(o,i);let p=c?.pattern(),u=c?.rest();if(!c||(p===""||p===".")&&!u)this.matches.add(o,s,p===""||p===".");else if(p===".."){let m=o.parent||o;u?this.hasWalkedCache.hasWalked(m,u)||this.subwalks.add(m,u):this.matches.add(m,s,!0)}}else l instanceof RegExp&&this.subwalks.add(o,i)}return this}subwalkTargets(){return this.subwalks.keys()}child(){return new n(this.opts,this.hasWalkedCache)}filterEntries(e,t){let r=this.subwalks.get(e),o=this.child();for(let i of t)for(let a of r){let s=a.isAbsolute(),l=a.pattern(),c=a.rest();l===st?o.testGlobstar(i,a,c,s):l instanceof RegExp?o.testRegExp(i,l,c,s):o.testString(i,l,c,s)}return o}testGlobstar(e,t,r,o){if((this.dot||!e.name.startsWith("."))&&(t.hasMore()||this.matches.add(e,o,!1),e.canReaddir()&&(this.follow||!e.isSymbolicLink()?this.subwalks.add(e,t):e.isSymbolicLink()&&(r&&t.checkFollowGlobstar()?this.subwalks.add(e,r):t.markFollowGlobstar()&&this.subwalks.add(e,t)))),r){let i=r.pattern();if(typeof i=="string"&&i!==".."&&i!==""&&i!==".")this.testString(e,i,r.rest(),o);else if(i===".."){let a=e.parent||e;this.subwalks.add(a,r)}else i instanceof RegExp&&this.testRegExp(e,i,r.rest(),o)}}testRegExp(e,t,r,o){t.test(e.name)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}testString(e,t,r,o){e.isNamed(t)&&(r?this.subwalks.add(e,r):this.matches.add(e,o,!1))}};var VI=(n,e)=>typeof n=="string"?new Xo([n],e):Array.isArray(n)?new Xo(n,e):n,il=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#e=[];#t;#i;signal;maxDepth;includeChildMatches;constructor(e,t,r){if(this.patterns=e,this.path=t,this.opts=r,this.#i=!r.posix&&r.platform==="win32"?"\\":"/",this.includeChildMatches=r.includeChildMatches!==!1,(r.ignore||!this.includeChildMatches)&&(this.#t=VI(r.ignore??[],r),!this.includeChildMatches&&typeof this.#t.add!="function")){let o="cannot ignore child matches, ignore lacks add() method.";throw new Error(o)}this.maxDepth=r.maxDepth||1/0,r.signal&&(this.signal=r.signal,this.signal.addEventListener("abort",()=>{this.#e.length=0}))}#r(e){return this.seen.has(e)||!!this.#t?.ignored?.(e)}#a(e){return!!this.#t?.childrenIgnored?.(e)}pause(){this.paused=!0}resume(){if(this.signal?.aborted)return;this.paused=!1;let e;for(;!this.paused&&(e=this.#e.shift());)e()}onResume(e){this.signal?.aborted||(this.paused?this.#e.push(e):e())}async matchCheck(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||await e.realpath(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?await e.lstat():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let a=await i.realpath();a&&(a.isUnknown()||this.opts.stat)&&await a.lstat()}return this.matchCheckTest(i,t)}matchCheckTest(e,t){return e&&(this.maxDepth===1/0||e.depth()<=this.maxDepth)&&(!t||e.canReaddir())&&(!this.opts.nodir||!e.isDirectory())&&(!this.opts.nodir||!this.opts.follow||!e.isSymbolicLink()||!e.realpathCached()?.isDirectory())&&!this.#r(e)?e:void 0}matchCheckSync(e,t){if(t&&this.opts.nodir)return;let r;if(this.opts.realpath){if(r=e.realpathCached()||e.realpathSync(),!r)return;e=r}let i=e.isUnknown()||this.opts.stat?e.lstatSync():e;if(this.opts.follow&&this.opts.nodir&&i?.isSymbolicLink()){let a=i.realpathSync();a&&(a?.isUnknown()||this.opts.stat)&&a.lstatSync()}return this.matchCheckTest(i,t)}matchFinish(e,t){if(this.#r(e))return;if(!this.includeChildMatches&&this.#t?.add){let i=`${e.relativePosix()}/**`;this.#t.add(i)}let r=this.opts.absolute===void 0?t:this.opts.absolute;this.seen.add(e);let o=this.opts.mark&&e.isDirectory()?this.#i:"";if(this.opts.withFileTypes)this.matchEmit(e);else if(r){let i=this.opts.posix?e.fullpathPosix():e.fullpath();this.matchEmit(i+o)}else{let i=this.opts.posix?e.relativePosix():e.relative(),a=this.opts.dotRelative&&!i.startsWith(".."+this.#i)?"."+this.#i:"";this.matchEmit(i?a+i+o:"."+o)}}async match(e,t,r){let o=await this.matchCheck(e,r);o&&this.matchFinish(o,t)}matchSync(e,t,r){let o=this.matchCheckSync(e,r);o&&this.matchFinish(o,t)}walkCB(e,t,r){this.signal?.aborted&&r(),this.walkCB2(e,t,new Ta(this.opts),r)}walkCB2(e,t,r,o){if(this.#a(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2(e,t,r,o));return}r.processPatterns(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||(i++,this.match(s,l,c).then(()=>a()));for(let s of r.subwalkTargets()){if(this.maxDepth!==1/0&&s.depth()>=this.maxDepth)continue;i++;let l=s.readdirCached();s.calledReaddir()?this.walkCB3(s,l,r,a):s.readdirCB((c,d)=>this.walkCB3(s,d,r,a),!0)}a()}walkCB3(e,t,r,o){r=r.filterEntries(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||(i++,this.match(s,l,c).then(()=>a()));for(let[s,l]of r.subwalks.entries())i++,this.walkCB2(s,l,r.child(),a);a()}walkCBSync(e,t,r){this.signal?.aborted&&r(),this.walkCB2Sync(e,t,new Ta(this.opts),r)}walkCB2Sync(e,t,r,o){if(this.#a(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2Sync(e,t,r,o));return}r.processPatterns(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||this.matchSync(s,l,c);for(let s of r.subwalkTargets()){if(this.maxDepth!==1/0&&s.depth()>=this.maxDepth)continue;i++;let l=s.readdirSync();this.walkCB3Sync(s,l,r,a)}a()}walkCB3Sync(e,t,r,o){r=r.filterEntries(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of r.matches.entries())this.#r(s)||this.matchSync(s,l,c);for(let[s,l]of r.subwalks.entries())i++,this.walkCB2Sync(s,l,r.child(),a);a()}},Ea=class extends il{matches=new Set;constructor(e,t,r){super(e,t,r)}matchEmit(e){this.matches.add(e)}async walk(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&await this.path.lstat(),await new Promise((e,t)=>{this.walkCB(this.path,this.patterns,()=>{this.signal?.aborted?t(this.signal.reason):e(this.matches)})}),this.matches}walkSync(){if(this.signal?.aborted)throw this.signal.reason;return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>{if(this.signal?.aborted)throw this.signal.reason}),this.matches}},Ca=class extends il{results;constructor(e,t,r){super(e,t,r),this.results=new mr({signal:this.signal,objectMode:!0}),this.results.on("drain",()=>this.resume()),this.results.on("resume",()=>this.resume())}matchEmit(e){this.results.write(e),this.results.flowing||this.pause()}stream(){let e=this.path;return e.isUnknown()?e.lstat().then(()=>{this.walkCB(e,this.patterns,()=>this.results.end())}):this.walkCB(e,this.patterns,()=>this.results.end()),this.results}streamSync(){return this.path.isUnknown()&&this.path.lstatSync(),this.walkCBSync(this.path,this.patterns,()=>this.results.end()),this.results}};var KI=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Sn=class{absolute;cwd;root;dot;dotRelative;follow;ignore;magicalBraces;mark;matchBase;maxDepth;nobrace;nocase;nodir;noext;noglobstar;pattern;platform;realpath;scurry;stat;signal;windowsPathsNoEscape;withFileTypes;includeChildMatches;opts;patterns;constructor(e,t){if(!t)throw new TypeError("glob options required");if(this.withFileTypes=!!t.withFileTypes,this.signal=t.signal,this.follow=!!t.follow,this.dot=!!t.dot,this.dotRelative=!!t.dotRelative,this.nodir=!!t.nodir,this.mark=!!t.mark,t.cwd?(t.cwd instanceof URL||t.cwd.startsWith("file://"))&&(t.cwd=qI(t.cwd)):this.cwd="",this.cwd=t.cwd||"",this.root=t.root,this.magicalBraces=!!t.magicalBraces,this.nobrace=!!t.nobrace,this.noext=!!t.noext,this.realpath=!!t.realpath,this.absolute=t.absolute,this.includeChildMatches=t.includeChildMatches!==!1,this.noglobstar=!!t.noglobstar,this.matchBase=!!t.matchBase,this.maxDepth=typeof t.maxDepth=="number"?t.maxDepth:1/0,this.stat=!!t.stat,this.ignore=t.ignore,this.withFileTypes&&this.absolute!==void 0)throw new Error("cannot set absolute and withFileTypes:true");if(typeof e=="string"&&(e=[e]),this.windowsPathsNoEscape=!!t.windowsPathsNoEscape||t.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(e=e.map(l=>l.replace(/\\/g,"/"))),this.matchBase){if(t.noglobstar)throw new TypeError("base matching requires globstar");e=e.map(l=>l.includes("/")?l:`./**/${l}`)}if(this.pattern=e,this.platform=t.platform||KI,this.opts={...t,platform:this.platform},t.scurry){if(this.scurry=t.scurry,t.nocase!==void 0&&t.nocase!==t.scurry.nocase)throw new Error("nocase option contradicts provided scurry option")}else{let l=t.platform==="win32"?Ko:t.platform==="darwin"?xa:t.platform?Yo:NS;this.scurry=new l(this.cwd,{nocase:t.nocase,fs:t.fs})}this.nocase=this.scurry.nocase;let r=this.platform==="darwin"||this.platform==="win32",o={...t,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:r,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},i=this.pattern.map(l=>new Bt(l,o)),[a,s]=i.reduce((l,c)=>(l[0].push(...c.set),l[1].push(...c.globParts),l),[[],[]]);this.patterns=a.map((l,c)=>{let d=s[c];if(!d)throw new Error("invalid pattern object");return new Jo(l,d,0,this.platform)})}async walk(){return[...await new Ea(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walk()]}walkSync(){return[...new Ea(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).walkSync()]}stream(){return new Ca(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).stream()}streamSync(){return new Ca(this.patterns,this.scurry.cwd,{...this.opts,maxDepth:this.maxDepth!==1/0?this.maxDepth+this.scurry.cwd.depth():1/0,platform:this.platform,nocase:this.nocase,includeChildMatches:this.includeChildMatches}).streamSync()}iterateSync(){return this.streamSync()[Symbol.iterator]()}[Symbol.iterator](){return this.iterateSync()}iterate(){return this.stream()[Symbol.asyncIterator]()}[Symbol.asyncIterator](){return this.iterate()}};var Bd=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Bt(t,e).hasMagic())return!0;return!1};function al(n,e={}){return new Sn(n,e).streamSync()}function DS(n,e={}){return new Sn(n,e).stream()}function Zo(n,e={}){return new Sn(n,e).walkSync()}async function kS(n,e={}){return new Sn(n,e).walk()}function sl(n,e={}){return new Sn(n,e).iterateSync()}function FS(n,e={}){return new Sn(n,e).iterate()}var YI=al,JI=Object.assign(DS,{sync:al}),XI=sl,ZI=Object.assign(FS,{sync:sl}),QI=Object.assign(Zo,{stream:al,iterate:sl}),_S=Object.assign(kS,{glob:kS,globSync:Zo,sync:QI,globStream:DS,stream:JI,globStreamSync:al,streamSync:YI,globIterate:FS,iterate:ZI,globIterateSync:sl,iterateSync:XI,Glob:Sn,hasMagic:Bd,escape:$o,unescape:hn});_S.glob=_S;import eo,{dirname as HS}from"path";import{cwd as Gd}from"process";import jS from"yaml";import{z as ue}from"zod";import US from"fs";import Ra from"path";import eP from"yaml";import{z as zd}from"zod";var BS=!1,Hd=[`**/*.${Mt.TEST}`,`**/*.${Mt.MODULE}`],jd=zd.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),$d=50,tP=zd.object({fileType:zd.nativeEnum(Ae)});function we(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??Hd,o=Array.from(n.config.exclude??[]).concat(Vh),i=Zo(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:$d,nodir:!0});for(let a of i)nP(n.rootDir,a,t,e);return BS=!0,t}function nP(n,e,t,r){let o=Ra.join(n,e),i;try{i=US.readFileSync(o,"utf-8")}catch(p){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${p}`);return}let a;try{if(a=eP.parse(i),typeof a!="object"||a===null)throw new Error("The YAML document should parse as a map with key-value pairs")}catch(p){r.warn(`Could not parse possible Momentic file at ${o}, skipping: ${p}`);return}let s=tP.safeParse(a);if(s.error){r.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let l=s.data.fileType,c;try{c=US.statSync(o)}catch(p){r.warn(`Skipping path '${o}' because it could not be stat, skipping: ${p}`);return}let d={relativePath:e,fullFilePath:o,platformSep:Ra.sep,fullPathSegments:o.split(Ra.sep),relativePathSegments:e.split(Ra.sep),fileName:Ra.basename(o),lastModified:c.mtime,createdAt:c.birthtime};switch(l){case Ae.TEST:try{let p=Xt.parse(a);if(t.tests[p.id]){let u=t.tests[p.id].fullFilePath;y.error(`Two tests with the same ID (${p.id}) were found in the same project. Please ensure that all test IDs are unique and avoid copying tests manually. Momentic will ignore the first test when resolving tests.
|
|
45
45
|
|
|
46
46
|
First test path: ${u}
|
|
47
47
|
|
|
48
|
-
Second test path: ${o}`)}t.tests[p.id]={type:
|
|
49
|
-
${r.map(o=>o.configFilePath)}`);if(r.length===0)throw new Error("No valid Momentic project file available.");return y.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}function eP(n){let e=ZI(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${Xo}`)),r=Jo(t,{absolute:!1,cwd:Bd(),dotRelative:!1,maxDepth:Ud,nodir:!0}),o=[];for(let i of r){let a=Zr.join(Bd(),i),s=zd(a);s&&o.push({configFilePath:a,config:s,rootDir:PS(a)})}return o}function Hd(n){if(n){n=Zr.resolve(n);let t=zd(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:Zr.dirname(n)}]}if(jI(IS)){let t=eP(IS);if(t)return t}return QI()}function Zo(n,e){let t=LS.stringify(n);VI(e,t)}import Qo from"fs";import $d from"path";import{z as jd}from"zod";var MS="golden/visual-diff",NS="reports",kS="test-results";var tP=jd.object({width:jd.number(),height:jd.number()}),ei=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=$d.join(e.rootDir,e.config.goldenFileDir??MS);this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){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=$d.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Qo.mkdirSync($d.dirname(o),{recursive:!0}),Qo.writeFileSync(o,r.buffer),Qo.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(Qo.existsSync(o)){let a=Qo.readFileSync(o),s=tP.parse(JSON.parse(Qo.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new R("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var ti=class{flags;constructor(e){this.flags={auto_expand_iframes:e.browser?.autoExpandIframes??!1,rag_v2:e.ai?.aiPageFiltering??!1,faker_constant_seed:e.advanced?.fakerConstantSeed??!1,disable_secondary_cache_resolution:e.browser?.disableSecondaryCacheResolution??!1,show_zero_opacity_elements:e.browser?.showZeroOpacityElements??!1,global_locator_redirect:e.browser?.globalLocatorRedirect??!1,visual_actions:e.browser?.visualActions??!1,mini_model_initial_assertion:!1,mini_model_initial_locator:!1,show_test_plans:!1,icon_knowledge_base:!1,disable_clickhouse_caches:!1,disable_clickhouse_last_updated_endpoint:!1}}isBooleanFlagEnabled(e){return this.flags[e]}getAllFlags(){return{...this.flags}}getFlagPayload(e){}async refresh(){}};import nP from"simple-git";var be=nP();function rl(n){if(n.startsWith("git@")){let e=n.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let r=t[0],o=t[1];return`${r}/${o}`}}}else if(n.startsWith("http")||n.startsWith("https")){let t=new URL(n).pathname.split("/").filter(Boolean);if(t.length>=2){let r=t[0],o=t[1].replace(".git","");return`${r}/${o}`}}}async function we(n,e){try{return(await e).trim()}catch(t){n.error({err:t},"Failed to run git command");return}}function rP(){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"}async function oP(n){let[e,t,r,o]=await Promise.all([we(n,be.show(["--no-patch","--format=%ci"])),we(n,be.listRemote(["--get-url","origin"])),we(n,be.show(["-s","--pretty=%B"])),we(n,be.show(["-s","--pretty=%an"]))]);return{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:t,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:`${process.env.GITHUB_RUN_ID}:${process.env.GITHUB_RUN_ATTEMPT}`}}async function iP(n){let[e,t,r]=await Promise.all([we(n,be.listRemote(["--get-url","origin"])),we(n,be.show(["-s","--pretty=%B"])),we(n,be.show(["-s","--pretty=%an"]))]);return{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:r,gitlabProjectPath:process.env.CI_SERVER_HOST,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function aP(n){let[e,t,r,o]=await Promise.all([we(n,be.show(["--no-patch","--format=%ci"])),we(n,be.listRemote(["--get-url","origin"])),we(n,be.show(["-s","--pretty=%B"])),we(n,be.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),a=t?.includes("gitlab.com"),s=t?rl(t):void 0;return{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:r,gitCommitAuthorName:o,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function sP(n){let[e,t,r]=await Promise.all([we(n,be.show(["--no-patch","--format=%ci"])),we(n,be.show(["-s","--pretty=%B"])),we(n,be.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?rl(o):void 0;return{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:r,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 lP(n){let[e,t,r]=await Promise.all([we(n,be.show(["--no-patch","--format=%ci"])),we(n,be.show(["-s","--pretty=%B"])),we(n,be.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?rl(o):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function cP(n,e){let[t,r,o,i,a,s,l,c]=await Promise.all([we(n,be.revparse(["HEAD"])),we(n,be.revparse(["--short","HEAD"])),we(n,be.revparse(["--abbrev-ref","HEAD"])),we(n,be.listRemote(["--get-url","origin"])),we(n,be.show(["--no-patch","--format=%ci"])),we(n,be.show(["-s","--pretty=%B"])),we(n,be.show(["-s","--pretty=%an"])),e?we(n,be.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0)]),d=c?await we(n,be.show(["--no-patch","--format=%ci",c])):void 0,p=i?.includes("github.com"),u=i?.includes("gitlab.com"),m=i?rl(i):void 0;return{gitCommitSha:t,gitCommitShaShort:r,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:l,lastCommitOnMainSha:c,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?m:void 0,gitlabProjectPath:u?m:void 0,pipelineId:void 0}}async function dP(n){let e=n.config.gitProtectedBranches??[];return n.config.gitMainBranch&&e.push(n.config.gitMainBranch),{gitMainBranch:n.config.gitMainBranch,gitProtectedBranches:e}}async function pP(n,e){let t=rP();if(!t)return cP(n,e);switch(t){case"GithubActions":return oP(n);case"GitlabCI":return iP(n);case"CircleCI":return aP(n);case"Buildkite":return sP(n);case"AzureDevOps":return lP(n)}}async function uP(n,e,t){if(t.lastCommitOnMainSha&&t.lastCommitOnMainTimestamp)return{};if(t.gitlabProjectPath){if(!t.gitMainBranch||!t.gitCommitSha)return{};try{let r=await e.getMergeBaseCommitFromGitlab(t.gitlabProjectPath,t.gitMainBranch,t.gitCommitSha);return{lastCommitOnMainSha:r.sha,lastCommitOnMainTimestamp:r.committer.date}}catch(r){return n.warn({err:r},"Failed to get remote metadata from Gitlab"),{}}}if(t.githubRepository){if(!t.gitMainBranch||!t.gitCommitSha)return{};try{let[r,o]=t.githubRepository.split("/"),i=await e.getMergeBaseCommitFromGithub(r,o,t.gitMainBranch,t.gitCommitSha);return{lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(r){return n.warn({err:r},"Failed to get remote metadata from Github"),{}}}return{}}async function ni(n,e,t){let r=await dP(t),o=await pP(n,r.gitMainBranch),i={...r,...o},a=await uP(n,e,i);return{...r,...o,...a}}import yN from"http";import{z as Vd}from"zod";var z="v1",xa="2.3.1";var ur=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var _S=n=>{let e=n.reason===void 0?new DOMException("This operation was aborted.","AbortError"):n.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};async function _(n,e){let{milliseconds:t,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a,s;return new Promise((l,c)=>{if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);if(e.signal){let{signal:p}=e;p.aborted&&c(_S(p)),s=()=>{c(_S(p))},p.addEventListener("abort",s)}if(t===Number.POSITIVE_INFINITY){n.then(l,c);return}let d=new ur;a=i.setTimeout.call(void 0,()=>{if(r){try{l(r())}catch(p){c(p)}return}"cancel"in n&&typeof n.cancel=="function"&&n.cancel(),o instanceof Error?c(o):(d.message=o??`Promise timed out after ${t} milliseconds`,c(d))},t),(async()=>{try{l(await n)}catch(p){c(p)}})()}).catch(l=>{throw l}).finally(()=>{a!==void 0&&i.clearTimeout.call(void 0,a),s!==void 0&&e.signal&&e.signal.removeEventListener("abort",s)})}var ol=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>r-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let r=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(r),!1)}};var Gd=["ability","able","aboard","about","above","accept","accident","according","account","accurate","acres","across","act","action","active","activity","actual","actually","add","addition","additional","adjective","adult","adventure","advice","affect","afraid","after","afternoon","again","against","age","ago","agree","ahead","aid","air","airplane","alike","alive","all","allow","almost","alone","along","aloud","alphabet","already","also","although","am","among","amount","ancient","angle","angry","animal","announced","another","answer","ants","any","anybody","anyone","anything","anyway","anywhere","apart","apartment","appearance","apple","applied","appropriate","are","area","arm","army","around","arrange","arrangement","arrive","arrow","art","article","as","aside","ask","asleep","at","ate","atmosphere","atom","atomic","attached","attack","attempt","attention","audience","author","automobile","available","average","avoid","aware","away","baby","back","bad","badly","bag","balance","ball","balloon","band","bank","bar","bare","bark","barn","base","baseball","basic","basis","basket","bat","battle","be","bean","bear","beat","beautiful","beauty","became","because","become","becoming","bee","been","before","began","beginning","begun","behavior","behind","being","believed","bell","belong","below","belt","bend","beneath","bent","beside","best","bet","better","between","beyond","bicycle","bigger","biggest","bill","birds","birth","birthday","bit","bite","black","blank","blanket","blew","blind","block","blood","blow","blue","board","boat","body","bone","book","border","born","both","bottle","bottom","bound","bow","bowl","box","boy","brain","branch","brass","brave","bread","break","breakfast","breath","breathe","breathing","breeze","brick","bridge","brief","bright","bring","broad","broke","broken","brother","brought","brown","brush","buffalo","build","building","built","buried","burn","burst","bus","bush","business","busy","but","butter","buy","by","cabin","cage","cake","call","calm","came","camera","camp","can","canal","cannot","cap","capital","captain","captured","car","carbon","card","care","careful","carefully","carried","carry","case","cast","castle","cat","catch","cattle","caught","cause","cave","cell","cent","center","central","century","certain","certainly","chain","chair","chamber","chance","change","changing","chapter","character","characteristic","charge","chart","check","cheese","chemical","chest","chicken","chief","child","children","choice","choose","chose","chosen","church","circle","circus","citizen","city","class","classroom","claws","clay","clean","clear","clearly","climate","climb","clock","close","closely","closer","cloth","clothes","clothing","cloud","club","coach","coal","coast","coat","coffee","cold","collect","college","colony","color","column","combination","combine","come","comfortable","coming","command","common","community","company","compare","compass","complete","completely","complex","composed","composition","compound","concerned","condition","congress","connected","consider","consist","consonant","constantly","construction","contain","continent","continued","contrast","control","conversation","cook","cookies","cool","copper","copy","corn","corner","correct","correctly","cost","cotton","could","count","country","couple","courage","course","court","cover","cow","cowboy","crack","cream","create","creature","crew","crop","cross","crowd","cry","cup","curious","current","curve","customs","cut","cutting","daily","damage","dance","danger","dangerous","dark","darkness","date","daughter","dawn","day","dead","deal","dear","death","decide","declared","deep","deeply","deer","definition","degree","depend","depth","describe","desert","design","desk","detail","determine","develop","development","diagram","diameter","did","die","differ","difference","different","difficult","difficulty","dig","dinner","direct","direction","directly","dirt","dirty","disappear","discover","discovery","discuss","discussion","disease","dish","distance","distant","divide","division","do","doctor","does","dog","doing","doll","dollar","done","donkey","door","dot","double","doubt","down","dozen","draw","drawn","dream","dress","drew","dried","drink","drive","driven","driver","driving","drop","dropped","drove","dry","duck","due","dug","dull","during","dust","duty","each","eager","ear","earlier","early","earn","earth","easier","easily","east","easy","eat","eaten","edge","education","effect","effort","egg","eight","either","electric","electricity","element","elephant","eleven","else","empty","end","enemy","energy","engine","engineer","enjoy","enough","enter","entire","entirely","environment","equal","equally","equator","equipment","escape","especially","essential","establish","even","evening","event","eventually","ever","every","everybody","everyone","everything","everywhere","evidence","exact","exactly","examine","example","excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise","exist","expect","experience","experiment","explain","explanation","explore","express","expression","extra","eye","face","facing","fact","factor","factory","failed","fair","fairly","fall","fallen","familiar","family","famous","far","farm","farmer","farther","fast","fastened","faster","fat","father","favorite","fear","feathers","feature","fed","feed","feel","feet","fell","fellow","felt","fence","few","fewer","field","fierce","fifteen","fifth","fifty","fight","fighting","figure","fill","film","final","finally","find","fine","finest","finger","finish","fire","fireplace","firm","first","fish","five","fix","flag","flame","flat","flew","flies","flight","floating","floor","flow","flower","fly","fog","folks","follow","food","foot","football","for","force","foreign","forest","forget","forgot","forgotten","form","former","fort","forth","forty","forward","fought","found","four","fourth","fox","frame","free","freedom","frequently","fresh","friend","friendly","frighten","frog","from","front","frozen","fruit","fuel","full","fully","fun","function","funny","fur","furniture","further","future","gain","game","garage","garden","gas","gasoline","gate","gather","gave","general","generally","gentle","gently","get","getting","giant","gift","girl","give","given","giving","glad","glass","globe","go","goes","gold","golden","gone","good","goose","got","government","grabbed","grade","gradually","grain","grandfather","grandmother","graph","grass","gravity","gray","great","greater","greatest","greatly","green","grew","ground","group","grow","grown","growth","guard","guess","guide","gulf","gun","habit","had","hair","half","halfway","hall","hand","handle","handsome","hang","happen","happened","happily","happy","harbor","hard","harder","hardly","has","hat","have","having","hay","he","headed","heading","health","heard","hearing","heart","heat","heavy","height","held","hello","help","helpful","her","herd","here","herself","hidden","hide","high","higher","highest","highway","hill","him","himself","his","history","hit","hold","hole","hollow","home","honor","hope","horn","horse","hospital","hot","hour","house","how","however","huge","human","hundred","hung","hungry","hunt","hunter","hurried","hurry","hurt","husband","ice","idea","identity","if","ill","image","imagine","immediately","importance","important","impossible","improve","in","inch","include","including","income","increase","indeed","independent","indicate","individual","industrial","industry","influence","information","inside","instance","instant","instead","instrument","interest","interior","into","introduced","invented","involved","iron","is","island","it","its","itself","jack","jar","jet","job","join","joined","journey","joy","judge","jump","jungle","just","keep","kept","key","kids","kill","kind","kitchen","knew","knife","know","knowledge","known","label","labor","lack","lady","laid","lake","lamp","land","language","large","larger","largest","last","late","later","laugh","law","lay","layers","lead","leader","leaf","learn","least","leather","leave","leaving","led","left","leg","length","lesson","let","letter","level","library","lie","life","lift","light","like","likely","limited","line","lion","lips","liquid","list","listen","little","live","living","load","local","locate","location","log","lonely","long","longer","look","loose","lose","loss","lost","lot","loud","love","lovely","low","lower","luck","lucky","lunch","lungs","lying","machine","machinery","mad","made","magic","magnet","mail","main","mainly","major","make","making","man","managed","manner","manufacturing","many","map","mark","market","married","mass","massage","master","material","mathematics","matter","may","maybe","me","meal","mean","means","meant","measure","meat","medicine","meet","melted","member","memory","men","mental","merely","met","metal","method","mice","middle","might","mighty","mile","military","milk","mill","mind","mine","minerals","minute","mirror","missing","mission","mistake","mix","mixture","model","modern","molecular","moment","money","monkey","month","mood","moon","more","morning","most","mostly","mother","motion","motor","mountain","mouse","mouth","move","movement","movie","moving","mud","muscle","music","musical","must","my","myself","mysterious","nails","name","nation","national","native","natural","naturally","nature","near","nearby","nearer","nearest","nearly","necessary","neck","needed","needle","needs","negative","neighbor","neighborhood","nervous","nest","never","new","news","newspaper","next","nice","night","nine","no","nobody","nodded","noise","none","noon","nor","north","nose","not","note","noted","nothing","notice","noun","now","number","numeral","nuts","object","observe","obtain","occasionally","occur","ocean","of","off","offer","office","officer","official","oil","old","older","oldest","on","once","one","only","onto","open","operation","opinion","opportunity","opposite","or","orange","orbit","order","ordinary","organization","organized","origin","original","other","ought","our","ourselves","out","outer","outline","outside","over","own","owner","oxygen","pack","package","page","paid","pain","paint","pair","palace","pale","pan","paper","paragraph","parallel","parent","park","part","particles","particular","particularly","partly","parts","party","pass","passage","past","path","pattern","pay","peace","pen","pencil","people","per","percent","perfect","perfectly","perhaps","period","person","personal","pet","phrase","physical","piano","pick","picture","pictured","pie","piece","pig","pile","pilot","pine","pink","pipe","pitch","place","plain","plan","plane","planet","planned","planning","plant","plastic","plate","plates","play","pleasant","please","pleasure","plenty","plural","plus","pocket","poem","poet","poetry","point","pole","police","policeman","political","pond","pony","pool","poor","popular","population","porch","port","position","positive","possible","possibly","post","pot","potatoes","pound","pour","powder","power","powerful","practical","practice","prepare","present","president","press","pressure","pretty","prevent","previous","price","pride","primitive","principal","principle","printed","private","prize","probably","problem","process","produce","product","production","program","progress","promised","proper","properly","property","protection","proud","prove","provide","public","pull","pupil","pure","purple","purpose","push","put","putting","quarter","queen","question","quick","quickly","quiet","quietly","quite","rabbit","race","radio","railroad","rain","raise","ran","ranch","range","rapidly","rate","rather","raw","rays","reach","read","reader","ready","real","realize","rear","reason","recall","receive","recent","recently","recognize","record","red","refer","refused","region","regular","related","relationship","religious","remain","remarkable","remember","remove","repeat","replace","replied","report","represent","require","research","respect","rest","result","return","review","rhyme","rhythm","rice","rich","ride","riding","right","ring","rise","rising","river","road","roar","rock","rocket","rocky","rod","roll","roof","room","root","rope","rose","rough","round","route","row","rubbed","rubber","rule","ruler","run","running","rush","sad","saddle","safe","safety","said","sail","sale","salmon","salt","same","sand","sang","sat","satellites","satisfied","save","saved","saw","say","scale","scared","scene","school","science","scientific","scientist","score","screen","sea","search","season","seat","second","secret","section","see","seed","seeing","seems","seen","seldom","select","selection","sell","send","sense","sent","sentence","separate","series","serious","serve","service","sets","setting","settle","settlers","seven","several","shade","shadow","shake","shaking","shall","shallow","shape","share","sharp","she","sheep","sheet","shelf","shells","shelter","shine","shinning","ship","shirt","shoe","shoot","shop","shore","short","shorter","shot","should","shoulder","shout","show","shown","shut","sick","sides","sight","sign","signal","silence","silent","silk","silly","silver","similar","simple","simplest","simply","since","sing","single","sink","sister","sit","sitting","situation","six","size","skill","skin","sky","slabs","slave","sleep","slept","slide","slight","slightly","slip","slipped","slope","slow","slowly","small","smaller","smallest","smell","smile","smoke","smooth","snake","snow","so","soap","social","society","soft","softly","soil","solar","sold","soldier","solid","solution","solve","some","somebody","somehow","someone","something","sometime","somewhere","son","song","soon","sort","sound","source","south","southern","space","speak","special","species","specific","speech","speed","spell","spend","spent","spider","spin","spirit","spite","split","spoken","sport","spread","spring","square","stage","stairs","stand","standard","star","stared","start","state","statement","station","stay","steady","steam","steel","steep","stems","step","stepped","stick","stiff","still","stock","stomach","stone","stood","stop","stopped","store","storm","story","stove","straight","strange","stranger","straw","stream","street","strength","stretch","strike","string","strip","strong","stronger","struck","structure","struggle","stuck","student","studied","studying","subject","substance","success","successful","such","sudden","suddenly","sugar","suggest","suit","sum","summer","sun","sunlight","supper","supply","support","suppose","sure","surface","surprise","surrounded","swam","sweet","swept","swim","swimming","swing","swung","syllable","symbol","system","table","tail","take","taken","tales","talk","tall","tank","tape","task","taste","taught","tax","tea","teach","teacher","team","tears","teeth","telephone","television","tell","temperature","ten","tent","term","terrible","test","than","thank","that","thee","them","themselves","then","theory","there","therefore","these","they","thick","thin","thing","think","third","thirty","this","those","thou","though","thought","thousand","thread","three","threw","throat","through","throughout","throw","thrown","thumb","thus","thy","tide","tie","tight","tightly","till","time","tin","tiny","tip","tired","title","to","tobacco","today","together","told","tomorrow","tone","tongue","tonight","too","took","tool","top","topic","torn","total","touch","toward","tower","town","toy","trace","track","trade","traffic","trail","train","transportation","trap","travel","treated","tree","triangle","tribe","trick","tried","trip","troops","tropical","trouble","truck","trunk","truth","try","tube","tune","turn","twelve","twenty","twice","two","type","typical","uncle","under","underline","understanding","unhappy","union","unit","universe","unknown","unless","until","unusual","up","upon","upper","upward","us","use","useful","using","usual","usually","valley","valuable","value","vapor","variety","various","vast","vegetable","verb","vertical","very","vessels","victory","view","village","visit","visitor","voice","volume","vote","vowel","voyage","wagon","wait","walk","wall","want","war","warm","warn","was","wash","waste","watch","water","wave","way","we","weak","wealth","wear","weather","week","weigh","weight","welcome","well","went","were","west","western","wet","whale","what","whatever","wheat","wheel","when","whenever","where","wherever","whether","which","while","whispered","whistle","white","who","whole","whom","whose","why","wide","widely","wife","wild","will","willing","win","wind","window","wing","winter","wire","wise","wish","with","within","without","wolf","women","won","wonder","wonderful","wood","wooden","wool","word","wore","work","worker","world","worried","worry","worse","worth","would","wrapped","write","writer","writing","written","wrong","wrote","yard","year","yellow","yes","yesterday","yet","you","young","younger","your","yourself","youth","zero","zebra","zipper","zoo","zulu"];function DS(n){return new Array(n).fill(0).map(()=>Gd[Math.floor(Math.random()*Gd.length)]).join("-")}var mP=9e4,hP=15e3,fn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function gP(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Wd=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return xa&&(e[Uh]=xa),e}async sendRequest(e,t,r=3,o=mP){let i=r,a,s={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(a=l,l instanceof fn&&l.status>=400&&l.status<500)throw l;if(l instanceof Error&&l.name==="AbortError"&&(a=new ur),r===0)throw a;let c=1500,d=i-r,p=Math.min(c*Math.pow(2,d-1),hP);await new Promise(u=>setTimeout(u,p))}throw this.logger.warn({...s,err:a},"Got fatal error response from Momentic server"),a}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),r),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s);let l={...this.getHeaders(),...t.extraHeaders};try{let c=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!c.ok){let p=await gP(c);throw new fn(c.status,p,`Request to ${e} failed with status ${c.status}: ${p}`)}let d;if(c.status===204)d={};else{let p=await c.text();try{d=JSON.parse(p)}catch{d=p}}return this.logger&&!t.noLog&&d&&this.logger.debug({result:d,status:c.status,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Ot=class extends Wd{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var st=class extends Ot{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${z}/auth/check`,{method:"GET",noLog:!0},10,5e3),{orgId:t,userId:r}=og.parse(e);return{orgId:t,userId:r}}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${z}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return eg.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${z}/tests/export`,{method:"POST",body:e},3,3e4);return Yh.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${z}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${z}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return Jh.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${z}/tests/queue`,{method:"POST",body:e},3,1e4);return Kh.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${z}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return rg.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${z}/environments`,{method:"GET"},3,5e3);return ig.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${z}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return ug.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${z}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${z}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${z}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${z}/result-cache/entry`,{method:"POST",body:e},3,5e3)}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${z}/suites/queue`,{method:"POST",body:e},3,5e3);return ag.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${z}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return $m.array().parse(r)}async updateCacheLastUsedDate(e,t,r,o){try{await this.sendRequest(`/${z}/cache/last-used-at`,{method:"PATCH",body:{uniqueKeys:t,testId:e},noLog:!0,extraHeaders:o},3,7500)}catch(i){r.error({err:i},"Failed to update cache last used date")}}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${z}/test-fragments/`,{method:"POST",body:e},3,1e4)}catch(r){t.error({err:r},"Failed to upload proposed steps")}}async uploadSnapshotScreenshot(e,t,r){try{await this.sendRequest(`/${z}/snapshots/${t}/screenshot`,{method:"POST",body:r,noLog:!0},3,1e4)}catch(o){e.error({err:o},"Failed to upload screenshot")}}async generateConsoleLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${z}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return ea.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${z}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return ea.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${z}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return ea.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${z}/billing/events`,{method:"POST",body:t,noLog:!0},10,1e4)}catch(r){e.error({err:r},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${z}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return sg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${z}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${z}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return lg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${z}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return cg.parse(e)}async startProcessingResultsUpload(e){let t=await this.sendRequest(`/${z}/results/uploads/${e}/process`,{method:"POST",noLog:!0},3,1e4);return dg.parse(t)}async fetchIconKnowledgeBase(e,t){try{let r=await this.sendRequest(`/${z}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return yg.parse(r)}catch(r){return t.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${z}/knowledge-base/icons`,{method:"POST",body:e,noLog:!0},3,5e3)}catch(r){t.error({err:r},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,r,o){let i=new URLSearchParams;i.set("base",r),i.set("head",o);let a=await this.sendRequest(`/${z}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return rd.parse(a)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${z}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return rd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${z}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return Vd.record(Vd.string(),Vd.string()).parse(e)}};import{randomUUID as FS}from"crypto";var il=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvent(e,t,r){try{return await this.apiClient.reportBillableEvents(e,[{event:t,timestamp:new Date().toISOString(),transactionId:r?.eventId??FS(),properties:Vc({},r)}])}catch(o){e.error({err:o},"Failed to report billable event")}}async reportCreditsUsed(e,t,r,o){if(r)try{return await this.apiClient.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:o?.eventId??FS(),properties:Vc({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function ri(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var al=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:a}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),s=await ri(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(i){e.error({err:i},"Failed to upload console logs")}}async storeNetworkLogsForRunAttempt(e,t,r,o){let i=JSON.stringify(o);try{let{uploadUrl:a}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),s=await ri(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(a){e.error({err:a},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await ri(o,"text/html",r);if(!i.ok)throw new Error(`Failed to upload network logs: ${i.statusText}`)}catch(o){e.error({err:o},"Failed to upload html snapshot")}}async storeScreenshot(e,t,r){try{await this.client.uploadSnapshotScreenshot(e,t,{screenshot:r.toString("base64")})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async storeA11yTreeSnapshot(e,t,r){return Promise.resolve()}async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}};var oi=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,t){return this.client.fetchIconKnowledgeBase(e,t)}saveNewIcons(e,t,r){return this.client.saveNewIcons(t,r)}};import{Faker as fP,en as SP}from"@faker-js/faker";var ii="v1",mr=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 fP({locale:SP}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${ii}/tools/ai/generate`,{method:"POST",body:t}).catch(r=>{throw r instanceof fn?new Error(r.rawError):new Error(`Failed to send AI generation: ${r.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${ii}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof fn?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${ii}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof fn?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${ii}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof fn?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${ii}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof fn?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${ii}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof fn?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};import{z as yP}from"zod";var ai=class extends Ot{agentConfig;constructor(e,t){super(t),this.agentConfig=e}async rankChunksWithAi(e,t){let r={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${z}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return rh.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${z}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:xa,...e},signal:t.abortSignal});return nh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${z}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return yP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${z}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return Vh.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${z}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return td.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${z}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return Wh.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${z}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return td.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${z}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Gh.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${z}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let r=await this.sendRequest(`/${z}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return wc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${z}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return qh.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${z}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return bc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${z}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Mc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${z}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return th.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${z}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Gu.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${z}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Wu.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${z}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Cu.parse(r)}};var si=class extends Ot{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${z}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Ru.parse(r)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var sl=class{constructor(e){this.client=e}async uploadResultsArchive(e){let{uploadUrl:t,id:r}=await this.client.generateTestResultsUploadUrl(),o=await ri(t,"application/zip",e);if(!o.ok)throw new Error(`Failed to upload test results: ${await o.text()}`);let{runGroupId:i}=await this.client.startProcessingResultsUpload(r);return i}};function li({client:n,gitMetadata:e,alwaysSaveCache:t,noCache:r}){return r?new Es:new qd(n,e,t)}var qd=class{constructor(e,{gitMainBranch:t,gitBranchName:r,gitProtectedBranches:o,gitCommitTimestamp:i,lastCommitOnMainSha:a,lastCommitOnMainTimestamp:s},l){this.client=e;this.cacheHeaders={},t&&(this.cacheHeaders[Bh]=t),r&&(this.cacheHeaders[zh]=r),i&&(this.cacheHeaders[Hh]=i.toISOString()),a&&(this.cacheHeaders[$h]=a),s&&(this.cacheHeaders[jh]=s.toISOString()),l?this.writeCaches=!0:r?this.writeCaches=!o.includes(r):this.writeCaches=!0}cacheHeaders;writeCaches;async saveStepCacheEntries(e,t,r){if(!this.writeCaches){r.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){r.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){let t=await this.client.getStepCacheForTest({testId:e.testId,organizationId:e.organizationId,steps:e.steps,schemaVersion:e.schemaVersion},this.cacheHeaders);if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}let{uniqueKeysHit:r}=Do({steps:e.steps,stepCacheEntries:t,logger:e.logger});this.client.updateCacheLastUsedDate(e.testId,r,e.logger,this.cacheHeaders)}};import{Server as KM}from"socket.io";import{cloneDeep as bP}from"lodash-es";var wP={showOverlay:!1},Kd=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:r,clientIp:o,sessionId:i,browserbaseSessionId:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:a,browserBehavior:bP(wP)}),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)}},Q=new Kd;function US(n,e,t){let r=Date.now(),o=Date.now(),i,a,s,l,c=!1,d=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=s;s=void 0;let S=h.url(),w=g.toEditorDisplayCopy();JSON.stringify(w)===JSON.stringify(i)&&S===l&&r>o||(n.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:a??[],context:w,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=w}catch(f){if(!n.connected)return;let S=f instanceof Error?f.message:`${f}`;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:f,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=Q.getSession(e),g=h?.controller?.browser;if(!g||g.closed){t.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(g,h.context)},1e3),u=(h,g)=>!!(JSON.stringify(h)!==JSON.stringify(a)||g.logsPerPage.some(f=>f.length>0)||g.harPages&&Object.keys(g.harPages).length>0||g.harEntries&&Object.keys(g.harEntries).length>0),m=setInterval(async()=>{let g=Q.getSession(e)?.controller?.browser;if(!g||g.closed){clearInterval(m);return}else if(c)return;c=!0;try{let f=await g.getAllFrameUrls(),S=g.retrieveAndClearDebugData();u(f,S)&&(a=f,s=S,o=Date.now())}catch(f){t.warn({err:f},"Failed to fetch extended details")}finally{c=!1}},2500);return{timers:[p,m]}}var hr={};var vP=n=>()=>{let{sessionId:e}=n.metadata;hr[e]?.abort?.abort()},BS={event:"cancelApiTest",createHandler:vP};import{CookieJar as zP}from"tough-cookie";import{randomUUID as PP}from"crypto";import{faker as TP}from"@faker-js/faker";import xP from"assert";import EP from"axios";import CP from"moment";import*as RP from"otpauth";import AP from"pg";async function zS(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=fs(r,e);t.push(...o)}),t}var IP=Object.getPrototypeOf(async function(){}).constructor;async function HS(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,a={},s=(f,S)=>{o[f]=S,a[f]=S},l={},c=(f,S)=>{o[f]=S,l[f]=S},d;r.includes("Octokit")&&(d=(await import("@octokit/rest")).Octokit);let p;r.includes("createAppAuth")&&(p=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new IP("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(EP,CP,i.fakerInstance??TP,xP,AP,d,p,RP,zS,o,s,c,S=>i.sms.send(S),S=>i.sms.fetchLatest(S),i.email,i.sms,i.ai)),m=!0,h,g;try{h=await _(u(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal})}catch(f){t.error({err:f,env:o,evalCode:r},`[${n}] Error executing code: ${f}`),m=!1,f instanceof ur?g=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:g=f instanceof Error?f.message:`${f}`}return{result:h,variableUpdates:a,persistentVariableUpdates:l,success:m,error:g}}async function $S({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:a=or}){let s=PP(),l=await HS(s,{code:n,options:{fragment:e,timeoutMs:a},bindings:t.toObjectCopy(),tools:r,signal:i},o);return y.debug(`[${s}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as LP,randomUUID as OP}from"crypto";import MP from"fetch-retry";var NP=MP(global.fetch,{retries:3,retryOn:function(n,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(n){return Math.pow(2,n)*500}}),jS=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,GS=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function WS({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=or,retries:i=2,signal:a,logger:s}){if(!jS)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!GS)throw new Error("Missing lambda auth secret.");let p=LP("sha256",GS).update(n).digest("hex");for(;d<=i;){d++,a?.throwIfAborted();let m={id:OP(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await _(NP(jS,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!l)throw new Error("Got empty response from code evaluation server");if(!l.ok)throw new Error(`Code evaluation server returned error code ${l.status}`);c=void 0;break}catch(h){c=h}}if(c)throw s.error({err:c},"Failed to evaluate code remotely"),c;if(!l)throw new Error(`An unexpected code evaluation error occurred${c?`: ${c}`:""}`);let u;try{u=ph.parse(await l.json())}catch(m){throw new Error(`Code evaluation server returned invalid response: ${m}`)}if(u.error)throw new Error(`Code evaluation error: ${u.error}`);return u}async function Vn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await WS(n);else if(n.localTools)e=await $S({...n,localTools:n.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
|
|
48
|
+
Second test path: ${o}`)}t.tests[p.id]={type:Ae.TEST,name:p.name,id:p.id,description:p.description??void 0,labels:p.labels,...d};return}catch(p){r.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${p}`);return}case Ae.MODULE:try{let p=At.parse(a);t.modules[p.moduleId]={type:Ae.MODULE,name:p.name,id:p.moduleId,description:p.description??void 0,...d};let u=d.fileName.replace(".module.yaml","");!BS&&Ne(p.name)!==u&&r.warn(`The module with ID ${p.moduleId} has a name (${p.name}) that does not match its file name (${u}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`);return}catch(p){r.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${p}`);return}default:r.warn(`Unsupported file type ${l}, skipping...`);return}}var Qo="momentic.config.yaml",zS="momentic.workspace.yaml",sP=ue.object({projects:ue.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),lP=ue.union([ue.string(),ue.object({fromFile:ue.string(),json:ue.boolean().optional()})]),cP=ue.object({name:jd,baseUrl:ue.string(),envFile:ue.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:ue.record(ue.string(),lP).optional(),inheritFromShell:ue.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Mr.optional()}),dP=ue.object({postSave:ue.string().optional()}),pP=ue.object({name:jd,include:ue.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:ue.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:ue.string().optional(),reporterDir:ue.string().optional(),outputDir:ue.string().optional(),retries:ue.number().optional().describe("number of retries per test"),parallel:ue.number().optional().describe("degree of parallelism"),environments:ue.array(cP).optional(),gitMainBranch:ue.string().optional(),gitProtectedBranches:ue.string().array().optional(),ai:ad.extend({aiPageFiltering:ue.boolean().optional().describe("rag v2 flag")}).optional(),browser:Mr.extend({autoExpandIframes:ue.boolean().optional(),disableSecondaryCacheResolution:ue.boolean().optional(),showZeroOpacityElements:ue.boolean().optional(),globalLocatorRedirect:ue.boolean().optional(),visualActions:ue.boolean().optional()}).optional(),advanced:Yh.optional(),hooks:dP.optional()});function $S(n,e){let t;try{t=oP(n,"utf-8")}catch(o){y.warn(`Could not read possible Momentic ${e} file at ${n}: ${o}`);return}let r;try{if(r=jS.parse(t),typeof r!="object"||r===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof r} instead`)}catch(o){y.warn(`Possible Momentic ${e} file at ${n} does not parse as valid YAML: ${o}`);return}return r}function Wd(n){let e=$S(n,"project configuration");if(e!==void 0)try{return pP.parse(e)}catch(t){y.warn(`Possible Momentic project configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function uP(n){let e=$S(n,"workspace configuration");if(e!==void 0)try{return sP.parse(e)}catch(t){y.warn(`Possible Momentic workspace configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function mP(){let n=[],e=Gd(),t=eo.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=eo.basename(e);if(Is.includes(i))return y.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),n;for(let a of iP(e))if(a.endsWith(Qo)){let s=eo.join(e,a),l=Wd(s);l&&n.push({configFilePath:s,config:l,rootDir:HS(s)})}if(n.length)return n;if(e=eo.dirname(e),e===t)break}return n}function nn(n={}){let{configFilePath:e,nameFilter:t}=n,r=Vd(e);if(t&&(r=r.filter(o=>o.config.name===t)),r.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
49
|
+
${r.map(o=>o.configFilePath)}`);if(r.length===0)throw new Error("No valid Momentic project file available.");return y.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}function hP(n){let e=uP(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${Qo}`)),r=Zo(t,{absolute:!1,cwd:Gd(),dotRelative:!1,maxDepth:$d,nodir:!0}),o=[];for(let i of r){let a=eo.join(Gd(),i),s=Wd(a);s&&o.push({configFilePath:a,config:s,rootDir:HS(a)})}return o}function Vd(n){if(n){n=eo.resolve(n);let t=Wd(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:eo.dirname(n)}]}if(rP(zS)){let t=hP(zS);if(t)return t}return mP()}function ei(n,e){let t=jS.stringify(n);aP(e,t)}import ti from"fs";import qd from"path";import{z as Kd}from"zod";var GS="golden/visual-diff",WS="reports",VS="test-results";var gP=Kd.object({width:Kd.number(),height:Kd.number()}),ni=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=qd.join(e.rootDir,e.config.goldenFileDir??GS);this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){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=qd.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ti.mkdirSync(qd.dirname(o),{recursive:!0}),ti.writeFileSync(o,r.buffer),ti.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(ti.existsSync(o)){let a=ti.readFileSync(o),s=gP.parse(JSON.parse(ti.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new R("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var ri=class{flags;constructor(e){this.flags={auto_expand_iframes:e.browser?.autoExpandIframes??!1,rag_v2:e.ai?.aiPageFiltering??!1,faker_constant_seed:e.advanced?.fakerConstantSeed??!1,disable_secondary_cache_resolution:e.browser?.disableSecondaryCacheResolution??!1,show_zero_opacity_elements:e.browser?.showZeroOpacityElements??!1,global_locator_redirect:e.browser?.globalLocatorRedirect??!1,visual_actions:e.browser?.visualActions??!1,mini_model_initial_assertion:!1,mini_model_initial_locator:!1,show_test_plans:!1,icon_knowledge_base:!1,disable_clickhouse_caches:!1,disable_clickhouse_last_updated_endpoint:!1}}isBooleanFlagEnabled(e){return this.flags[e]}getAllFlags(){return{...this.flags}}getFlagPayload(e){}async refresh(){}};import fP from"simple-git";var ve=fP();function ll(n){if(n.startsWith("git@")){let e=n.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let r=t[0],o=t[1];return`${r}/${o}`}}}else if(n.startsWith("http")||n.startsWith("https")){let t=new URL(n).pathname.split("/").filter(Boolean);if(t.length>=2){let r=t[0],o=t[1].replace(".git","");return`${r}/${o}`}}}async function xe(n,e){try{return(await e).trim()}catch(t){n.error({err:t},"Failed to run git command");return}}function SP(){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"}async function yP(n){let[e,t,r,o]=await Promise.all([xe(n,ve.show(["--no-patch","--format=%ci"])),xe(n,ve.listRemote(["--get-url","origin"])),xe(n,ve.show(["-s","--pretty=%B"])),xe(n,ve.show(["-s","--pretty=%an"]))]);return{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:t,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:`${process.env.GITHUB_RUN_ID}:${process.env.GITHUB_RUN_ATTEMPT}`}}async function bP(n){let[e,t,r]=await Promise.all([xe(n,ve.listRemote(["--get-url","origin"])),xe(n,ve.show(["-s","--pretty=%B"])),xe(n,ve.show(["-s","--pretty=%an"]))]);return{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:r,gitlabProjectPath:process.env.CI_SERVER_HOST,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function wP(n){let[e,t,r,o]=await Promise.all([xe(n,ve.show(["--no-patch","--format=%ci"])),xe(n,ve.listRemote(["--get-url","origin"])),xe(n,ve.show(["-s","--pretty=%B"])),xe(n,ve.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),a=t?.includes("gitlab.com"),s=t?ll(t):void 0;return{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:r,gitCommitAuthorName:o,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function vP(n){let[e,t,r]=await Promise.all([xe(n,ve.show(["--no-patch","--format=%ci"])),xe(n,ve.show(["-s","--pretty=%B"])),xe(n,ve.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?ll(o):void 0;return{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:r,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 xP(n){let[e,t,r]=await Promise.all([xe(n,ve.show(["--no-patch","--format=%ci"])),xe(n,ve.show(["-s","--pretty=%B"])),xe(n,ve.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?ll(o):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function TP(n,e){let[t,r,o,i,a,s,l,c]=await Promise.all([xe(n,ve.revparse(["HEAD"])),xe(n,ve.revparse(["--short","HEAD"])),xe(n,ve.revparse(["--abbrev-ref","HEAD"])),xe(n,ve.listRemote(["--get-url","origin"])),xe(n,ve.show(["--no-patch","--format=%ci"])),xe(n,ve.show(["-s","--pretty=%B"])),xe(n,ve.show(["-s","--pretty=%an"])),e?xe(n,ve.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0)]),d=c?await xe(n,ve.show(["--no-patch","--format=%ci",c])):void 0,p=i?.includes("github.com"),u=i?.includes("gitlab.com"),m=i?ll(i):void 0;return{gitCommitSha:t,gitCommitShaShort:r,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:l,lastCommitOnMainSha:c,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?m:void 0,gitlabProjectPath:u?m:void 0,pipelineId:void 0}}async function EP(n){let e=n.config.gitProtectedBranches??[];return n.config.gitMainBranch&&e.push(n.config.gitMainBranch),{gitMainBranch:n.config.gitMainBranch,gitProtectedBranches:e}}async function CP(n,e){let t=SP();if(!t)return TP(n,e);switch(t){case"GithubActions":return yP(n);case"GitlabCI":return bP(n);case"CircleCI":return wP(n);case"Buildkite":return vP(n);case"AzureDevOps":return xP(n)}}async function RP(n,e,t){if(t.lastCommitOnMainSha&&t.lastCommitOnMainTimestamp)return{};if(t.gitlabProjectPath){if(!t.gitMainBranch||!t.gitCommitSha)return{};try{let r=await e.getMergeBaseCommitFromGitlab(t.gitlabProjectPath,t.gitMainBranch,t.gitCommitSha);return{lastCommitOnMainSha:r.sha,lastCommitOnMainTimestamp:r.committer.date}}catch(r){return n.warn({err:r},"Failed to get remote metadata from Gitlab"),{}}}if(t.githubRepository){if(!t.gitMainBranch||!t.gitCommitSha)return{};try{let[r,o]=t.githubRepository.split("/"),i=await e.getMergeBaseCommitFromGithub(r,o,t.gitMainBranch,t.gitCommitSha);return{lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(r){return n.warn({err:r},"Failed to get remote metadata from Github"),{}}}return{}}async function oi(n,e,t){let r=await EP(t),o=await CP(n,r.gitMainBranch),i={...r,...o},a=await RP(n,e,i);return{...r,...o,...a}}import DN from"http";import{z as Xd}from"zod";var H="v1",Aa="2.3.2";var hr=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var qS=n=>{let e=n.reason===void 0?new DOMException("This operation was aborted.","AbortError"):n.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};async function D(n,e){let{milliseconds:t,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a,s;return new Promise((l,c)=>{if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);if(e.signal){let{signal:p}=e;p.aborted&&c(qS(p)),s=()=>{c(qS(p))},p.addEventListener("abort",s)}if(t===Number.POSITIVE_INFINITY){n.then(l,c);return}let d=new hr;a=i.setTimeout.call(void 0,()=>{if(r){try{l(r())}catch(p){c(p)}return}"cancel"in n&&typeof n.cancel=="function"&&n.cancel(),o instanceof Error?c(o):(d.message=o??`Promise timed out after ${t} milliseconds`,c(d))},t),(async()=>{try{l(await n)}catch(p){c(p)}})()}).catch(l=>{throw l}).finally(()=>{a!==void 0&&i.clearTimeout.call(void 0,a),s!==void 0&&e.signal&&e.signal.removeEventListener("abort",s)})}var cl=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>r-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let r=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(r),!1)}};var Yd=["ability","able","aboard","about","above","accept","accident","according","account","accurate","acres","across","act","action","active","activity","actual","actually","add","addition","additional","adjective","adult","adventure","advice","affect","afraid","after","afternoon","again","against","age","ago","agree","ahead","aid","air","airplane","alike","alive","all","allow","almost","alone","along","aloud","alphabet","already","also","although","am","among","amount","ancient","angle","angry","animal","announced","another","answer","ants","any","anybody","anyone","anything","anyway","anywhere","apart","apartment","appearance","apple","applied","appropriate","are","area","arm","army","around","arrange","arrangement","arrive","arrow","art","article","as","aside","ask","asleep","at","ate","atmosphere","atom","atomic","attached","attack","attempt","attention","audience","author","automobile","available","average","avoid","aware","away","baby","back","bad","badly","bag","balance","ball","balloon","band","bank","bar","bare","bark","barn","base","baseball","basic","basis","basket","bat","battle","be","bean","bear","beat","beautiful","beauty","became","because","become","becoming","bee","been","before","began","beginning","begun","behavior","behind","being","believed","bell","belong","below","belt","bend","beneath","bent","beside","best","bet","better","between","beyond","bicycle","bigger","biggest","bill","birds","birth","birthday","bit","bite","black","blank","blanket","blew","blind","block","blood","blow","blue","board","boat","body","bone","book","border","born","both","bottle","bottom","bound","bow","bowl","box","boy","brain","branch","brass","brave","bread","break","breakfast","breath","breathe","breathing","breeze","brick","bridge","brief","bright","bring","broad","broke","broken","brother","brought","brown","brush","buffalo","build","building","built","buried","burn","burst","bus","bush","business","busy","but","butter","buy","by","cabin","cage","cake","call","calm","came","camera","camp","can","canal","cannot","cap","capital","captain","captured","car","carbon","card","care","careful","carefully","carried","carry","case","cast","castle","cat","catch","cattle","caught","cause","cave","cell","cent","center","central","century","certain","certainly","chain","chair","chamber","chance","change","changing","chapter","character","characteristic","charge","chart","check","cheese","chemical","chest","chicken","chief","child","children","choice","choose","chose","chosen","church","circle","circus","citizen","city","class","classroom","claws","clay","clean","clear","clearly","climate","climb","clock","close","closely","closer","cloth","clothes","clothing","cloud","club","coach","coal","coast","coat","coffee","cold","collect","college","colony","color","column","combination","combine","come","comfortable","coming","command","common","community","company","compare","compass","complete","completely","complex","composed","composition","compound","concerned","condition","congress","connected","consider","consist","consonant","constantly","construction","contain","continent","continued","contrast","control","conversation","cook","cookies","cool","copper","copy","corn","corner","correct","correctly","cost","cotton","could","count","country","couple","courage","course","court","cover","cow","cowboy","crack","cream","create","creature","crew","crop","cross","crowd","cry","cup","curious","current","curve","customs","cut","cutting","daily","damage","dance","danger","dangerous","dark","darkness","date","daughter","dawn","day","dead","deal","dear","death","decide","declared","deep","deeply","deer","definition","degree","depend","depth","describe","desert","design","desk","detail","determine","develop","development","diagram","diameter","did","die","differ","difference","different","difficult","difficulty","dig","dinner","direct","direction","directly","dirt","dirty","disappear","discover","discovery","discuss","discussion","disease","dish","distance","distant","divide","division","do","doctor","does","dog","doing","doll","dollar","done","donkey","door","dot","double","doubt","down","dozen","draw","drawn","dream","dress","drew","dried","drink","drive","driven","driver","driving","drop","dropped","drove","dry","duck","due","dug","dull","during","dust","duty","each","eager","ear","earlier","early","earn","earth","easier","easily","east","easy","eat","eaten","edge","education","effect","effort","egg","eight","either","electric","electricity","element","elephant","eleven","else","empty","end","enemy","energy","engine","engineer","enjoy","enough","enter","entire","entirely","environment","equal","equally","equator","equipment","escape","especially","essential","establish","even","evening","event","eventually","ever","every","everybody","everyone","everything","everywhere","evidence","exact","exactly","examine","example","excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise","exist","expect","experience","experiment","explain","explanation","explore","express","expression","extra","eye","face","facing","fact","factor","factory","failed","fair","fairly","fall","fallen","familiar","family","famous","far","farm","farmer","farther","fast","fastened","faster","fat","father","favorite","fear","feathers","feature","fed","feed","feel","feet","fell","fellow","felt","fence","few","fewer","field","fierce","fifteen","fifth","fifty","fight","fighting","figure","fill","film","final","finally","find","fine","finest","finger","finish","fire","fireplace","firm","first","fish","five","fix","flag","flame","flat","flew","flies","flight","floating","floor","flow","flower","fly","fog","folks","follow","food","foot","football","for","force","foreign","forest","forget","forgot","forgotten","form","former","fort","forth","forty","forward","fought","found","four","fourth","fox","frame","free","freedom","frequently","fresh","friend","friendly","frighten","frog","from","front","frozen","fruit","fuel","full","fully","fun","function","funny","fur","furniture","further","future","gain","game","garage","garden","gas","gasoline","gate","gather","gave","general","generally","gentle","gently","get","getting","giant","gift","girl","give","given","giving","glad","glass","globe","go","goes","gold","golden","gone","good","goose","got","government","grabbed","grade","gradually","grain","grandfather","grandmother","graph","grass","gravity","gray","great","greater","greatest","greatly","green","grew","ground","group","grow","grown","growth","guard","guess","guide","gulf","gun","habit","had","hair","half","halfway","hall","hand","handle","handsome","hang","happen","happened","happily","happy","harbor","hard","harder","hardly","has","hat","have","having","hay","he","headed","heading","health","heard","hearing","heart","heat","heavy","height","held","hello","help","helpful","her","herd","here","herself","hidden","hide","high","higher","highest","highway","hill","him","himself","his","history","hit","hold","hole","hollow","home","honor","hope","horn","horse","hospital","hot","hour","house","how","however","huge","human","hundred","hung","hungry","hunt","hunter","hurried","hurry","hurt","husband","ice","idea","identity","if","ill","image","imagine","immediately","importance","important","impossible","improve","in","inch","include","including","income","increase","indeed","independent","indicate","individual","industrial","industry","influence","information","inside","instance","instant","instead","instrument","interest","interior","into","introduced","invented","involved","iron","is","island","it","its","itself","jack","jar","jet","job","join","joined","journey","joy","judge","jump","jungle","just","keep","kept","key","kids","kill","kind","kitchen","knew","knife","know","knowledge","known","label","labor","lack","lady","laid","lake","lamp","land","language","large","larger","largest","last","late","later","laugh","law","lay","layers","lead","leader","leaf","learn","least","leather","leave","leaving","led","left","leg","length","lesson","let","letter","level","library","lie","life","lift","light","like","likely","limited","line","lion","lips","liquid","list","listen","little","live","living","load","local","locate","location","log","lonely","long","longer","look","loose","lose","loss","lost","lot","loud","love","lovely","low","lower","luck","lucky","lunch","lungs","lying","machine","machinery","mad","made","magic","magnet","mail","main","mainly","major","make","making","man","managed","manner","manufacturing","many","map","mark","market","married","mass","massage","master","material","mathematics","matter","may","maybe","me","meal","mean","means","meant","measure","meat","medicine","meet","melted","member","memory","men","mental","merely","met","metal","method","mice","middle","might","mighty","mile","military","milk","mill","mind","mine","minerals","minute","mirror","missing","mission","mistake","mix","mixture","model","modern","molecular","moment","money","monkey","month","mood","moon","more","morning","most","mostly","mother","motion","motor","mountain","mouse","mouth","move","movement","movie","moving","mud","muscle","music","musical","must","my","myself","mysterious","nails","name","nation","national","native","natural","naturally","nature","near","nearby","nearer","nearest","nearly","necessary","neck","needed","needle","needs","negative","neighbor","neighborhood","nervous","nest","never","new","news","newspaper","next","nice","night","nine","no","nobody","nodded","noise","none","noon","nor","north","nose","not","note","noted","nothing","notice","noun","now","number","numeral","nuts","object","observe","obtain","occasionally","occur","ocean","of","off","offer","office","officer","official","oil","old","older","oldest","on","once","one","only","onto","open","operation","opinion","opportunity","opposite","or","orange","orbit","order","ordinary","organization","organized","origin","original","other","ought","our","ourselves","out","outer","outline","outside","over","own","owner","oxygen","pack","package","page","paid","pain","paint","pair","palace","pale","pan","paper","paragraph","parallel","parent","park","part","particles","particular","particularly","partly","parts","party","pass","passage","past","path","pattern","pay","peace","pen","pencil","people","per","percent","perfect","perfectly","perhaps","period","person","personal","pet","phrase","physical","piano","pick","picture","pictured","pie","piece","pig","pile","pilot","pine","pink","pipe","pitch","place","plain","plan","plane","planet","planned","planning","plant","plastic","plate","plates","play","pleasant","please","pleasure","plenty","plural","plus","pocket","poem","poet","poetry","point","pole","police","policeman","political","pond","pony","pool","poor","popular","population","porch","port","position","positive","possible","possibly","post","pot","potatoes","pound","pour","powder","power","powerful","practical","practice","prepare","present","president","press","pressure","pretty","prevent","previous","price","pride","primitive","principal","principle","printed","private","prize","probably","problem","process","produce","product","production","program","progress","promised","proper","properly","property","protection","proud","prove","provide","public","pull","pupil","pure","purple","purpose","push","put","putting","quarter","queen","question","quick","quickly","quiet","quietly","quite","rabbit","race","radio","railroad","rain","raise","ran","ranch","range","rapidly","rate","rather","raw","rays","reach","read","reader","ready","real","realize","rear","reason","recall","receive","recent","recently","recognize","record","red","refer","refused","region","regular","related","relationship","religious","remain","remarkable","remember","remove","repeat","replace","replied","report","represent","require","research","respect","rest","result","return","review","rhyme","rhythm","rice","rich","ride","riding","right","ring","rise","rising","river","road","roar","rock","rocket","rocky","rod","roll","roof","room","root","rope","rose","rough","round","route","row","rubbed","rubber","rule","ruler","run","running","rush","sad","saddle","safe","safety","said","sail","sale","salmon","salt","same","sand","sang","sat","satellites","satisfied","save","saved","saw","say","scale","scared","scene","school","science","scientific","scientist","score","screen","sea","search","season","seat","second","secret","section","see","seed","seeing","seems","seen","seldom","select","selection","sell","send","sense","sent","sentence","separate","series","serious","serve","service","sets","setting","settle","settlers","seven","several","shade","shadow","shake","shaking","shall","shallow","shape","share","sharp","she","sheep","sheet","shelf","shells","shelter","shine","shinning","ship","shirt","shoe","shoot","shop","shore","short","shorter","shot","should","shoulder","shout","show","shown","shut","sick","sides","sight","sign","signal","silence","silent","silk","silly","silver","similar","simple","simplest","simply","since","sing","single","sink","sister","sit","sitting","situation","six","size","skill","skin","sky","slabs","slave","sleep","slept","slide","slight","slightly","slip","slipped","slope","slow","slowly","small","smaller","smallest","smell","smile","smoke","smooth","snake","snow","so","soap","social","society","soft","softly","soil","solar","sold","soldier","solid","solution","solve","some","somebody","somehow","someone","something","sometime","somewhere","son","song","soon","sort","sound","source","south","southern","space","speak","special","species","specific","speech","speed","spell","spend","spent","spider","spin","spirit","spite","split","spoken","sport","spread","spring","square","stage","stairs","stand","standard","star","stared","start","state","statement","station","stay","steady","steam","steel","steep","stems","step","stepped","stick","stiff","still","stock","stomach","stone","stood","stop","stopped","store","storm","story","stove","straight","strange","stranger","straw","stream","street","strength","stretch","strike","string","strip","strong","stronger","struck","structure","struggle","stuck","student","studied","studying","subject","substance","success","successful","such","sudden","suddenly","sugar","suggest","suit","sum","summer","sun","sunlight","supper","supply","support","suppose","sure","surface","surprise","surrounded","swam","sweet","swept","swim","swimming","swing","swung","syllable","symbol","system","table","tail","take","taken","tales","talk","tall","tank","tape","task","taste","taught","tax","tea","teach","teacher","team","tears","teeth","telephone","television","tell","temperature","ten","tent","term","terrible","test","than","thank","that","thee","them","themselves","then","theory","there","therefore","these","they","thick","thin","thing","think","third","thirty","this","those","thou","though","thought","thousand","thread","three","threw","throat","through","throughout","throw","thrown","thumb","thus","thy","tide","tie","tight","tightly","till","time","tin","tiny","tip","tired","title","to","tobacco","today","together","told","tomorrow","tone","tongue","tonight","too","took","tool","top","topic","torn","total","touch","toward","tower","town","toy","trace","track","trade","traffic","trail","train","transportation","trap","travel","treated","tree","triangle","tribe","trick","tried","trip","troops","tropical","trouble","truck","trunk","truth","try","tube","tune","turn","twelve","twenty","twice","two","type","typical","uncle","under","underline","understanding","unhappy","union","unit","universe","unknown","unless","until","unusual","up","upon","upper","upward","us","use","useful","using","usual","usually","valley","valuable","value","vapor","variety","various","vast","vegetable","verb","vertical","very","vessels","victory","view","village","visit","visitor","voice","volume","vote","vowel","voyage","wagon","wait","walk","wall","want","war","warm","warn","was","wash","waste","watch","water","wave","way","we","weak","wealth","wear","weather","week","weigh","weight","welcome","well","went","were","west","western","wet","whale","what","whatever","wheat","wheel","when","whenever","where","wherever","whether","which","while","whispered","whistle","white","who","whole","whom","whose","why","wide","widely","wife","wild","will","willing","win","wind","window","wing","winter","wire","wise","wish","with","within","without","wolf","women","won","wonder","wonderful","wood","wooden","wool","word","wore","work","worker","world","worried","worry","worse","worth","would","wrapped","write","writer","writing","written","wrong","wrote","yard","year","yellow","yes","yesterday","yet","you","young","younger","your","yourself","youth","zero","zebra","zipper","zoo","zulu"];function KS(n){return new Array(n).fill(0).map(()=>Yd[Math.floor(Math.random()*Yd.length)]).join("-")}var AP=9e4,IP=15e3,yn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function PP(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Jd=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Aa&&(e[Jh]=Aa),e}async sendRequest(e,t,r=3,o=AP){let i=r,a,s={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(a=l,l instanceof yn&&l.status>=400&&l.status<500)throw l;if(l instanceof Error&&l.name==="AbortError"&&(a=new hr),r===0)throw a;let c=1500,d=i-r,p=Math.min(c*Math.pow(2,d-1),IP);await new Promise(u=>setTimeout(u,p))}throw this.logger.warn({...s,err:a},"Got fatal error response from Momentic server"),a}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),r),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s);let l={...this.getHeaders(),...t.extraHeaders};try{let c=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!c.ok){let p=await PP(c);throw new yn(c.status,p,`Request to ${e} failed with status ${c.status}: ${p}`)}let d;if(c.status===204)d={};else{let p=await c.text();try{d=JSON.parse(p)}catch{d=p}}return this.logger&&!t.noLog&&d&&this.logger.debug({result:d,status:c.status,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Nt=class extends Jd{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var lt=class extends Nt{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${H}/auth/check`,{method:"GET",noLog:!0},10,5e3),{orgId:t,userId:r}=fg.parse(e);return{orgId:t,userId:r}}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${H}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return ug.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${H}/tests/export`,{method:"POST",body:e},3,3e4);return sg.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${H}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${H}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return lg.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${H}/tests/queue`,{method:"POST",body:e},3,1e4);return ag.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${H}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return gg.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${H}/environments`,{method:"GET"},3,5e3);return Sg.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${H}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return Eg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${H}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${H}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${H}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${H}/result-cache/entry`,{method:"POST",body:e},3,5e3)}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${H}/suites/queue`,{method:"POST",body:e},3,5e3);return yg.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${H}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return Jm.array().parse(r)}async updateCacheLastUsedDate(e,t,r,o){try{await this.sendRequest(`/${H}/cache/last-used-at`,{method:"PATCH",body:{uniqueKeys:t,testId:e},noLog:!0,extraHeaders:o},3,7500)}catch(i){r.error({err:i},"Failed to update cache last used date")}}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${H}/test-fragments/`,{method:"POST",body:e},3,1e4)}catch(r){t.error({err:r},"Failed to upload proposed steps")}}async uploadSnapshotScreenshot(e,t,r){try{await this.sendRequest(`/${H}/snapshots/${t}/screenshot`,{method:"POST",body:r,noLog:!0},3,1e4)}catch(o){e.error({err:o},"Failed to upload screenshot")}}async generateConsoleLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${H}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return na.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${H}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return na.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${H}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return na.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${H}/billing/events`,{method:"POST",body:t,noLog:!0},10,1e4)}catch(r){e.error({err:r},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${H}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return bg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${H}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${H}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return wg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${H}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return vg.parse(e)}async startProcessingResultsUpload(e,t){let r=await this.sendRequest(`/${H}/results/uploads/${e}/process`,{method:"POST",noLog:!0,body:t},3,1e4);return xg.parse(r)}async fetchIconKnowledgeBase(e,t){try{let r=await this.sendRequest(`/${H}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return Lg.parse(r)}catch(r){return t.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${H}/knowledge-base/icons`,{method:"POST",body:e,noLog:!0},3,5e3)}catch(r){t.error({err:r},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,r,o){let i=new URLSearchParams;i.set("base",r),i.set("head",o);let a=await this.sendRequest(`/${H}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return cd.parse(a)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${H}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return cd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${H}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return Xd.record(Xd.string(),Xd.string()).parse(e)}};import{randomUUID as YS}from"crypto";var dl=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvent(e,t,r){try{return await this.apiClient.reportBillableEvents(e,[{event:t,timestamp:new Date().toISOString(),transactionId:r?.eventId??YS(),properties:Xc({},r)}])}catch(o){e.error({err:o},"Failed to report billable event")}}async reportCreditsUsed(e,t,r,o){if(r)try{return await this.apiClient.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:o?.eventId??YS(),properties:Xc({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function ii(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var pl=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:a}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),s=await ii(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(i){e.error({err:i},"Failed to upload console logs")}}async storeNetworkLogsForRunAttempt(e,t,r,o){let i=JSON.stringify(o);try{let{uploadUrl:a}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),s=await ii(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(a){e.error({err:a},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await ii(o,"text/html",r);if(!i.ok)throw new Error(`Failed to upload network logs: ${i.statusText}`)}catch(o){e.error({err:o},"Failed to upload html snapshot")}}async storeScreenshot(e,t,r){try{await this.client.uploadSnapshotScreenshot(e,t,{screenshot:r.toString("base64")})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async storeA11yTreeSnapshot(e,t,r){return Promise.resolve()}async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}};var ai=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,t){return this.client.fetchIconKnowledgeBase(e,t)}saveNewIcons(e,t,r){return this.client.saveNewIcons(t,r)}};import{Faker as LP,en as OP}from"@faker-js/faker";var si="v1",gr=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 LP({locale:OP}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${si}/tools/ai/generate`,{method:"POST",body:t}).catch(r=>{throw r instanceof yn?new Error(r.rawError):new Error(`Failed to send AI generation: ${r.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${si}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof yn?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${si}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof yn?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${si}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof yn?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${si}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof yn?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${si}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof yn?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};import{z as MP}from"zod";var li=class extends Nt{agentConfig;constructor(e,t){super(t),this.agentConfig=e}async rankChunksWithAi(e,t){let r={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return ph.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${H}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Aa,...e},signal:t.abortSignal});return dh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${H}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return MP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${H}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return og.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${H}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return sd.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return rg.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return sd.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${H}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return ng.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${H}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let r=await this.sendRequest(`/${H}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Cc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${H}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return ig.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return Ec.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${H}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Fc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${H}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return ch.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${H}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Zu.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${H}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Qu.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${H}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Nu.parse(r)}};var ci=class extends Nt{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${H}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return ku.parse(r)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var ul=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:r,id:o}=await this.client.generateTestResultsUploadUrl(),i=await ii(r,"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}};function di({client:n,gitMetadata:e,alwaysSaveCache:t,noCache:r}){return r?new Ls:new Zd(n,e,t)}var Zd=class{constructor(e,{gitMainBranch:t,gitBranchName:r,gitProtectedBranches:o,gitCommitTimestamp:i,lastCommitOnMainSha:a,lastCommitOnMainTimestamp:s},l){this.client=e;this.cacheHeaders={},t&&(this.cacheHeaders[Xh]=t),r&&(this.cacheHeaders[Zh]=r),i&&(this.cacheHeaders[Qh]=i.toISOString()),a&&(this.cacheHeaders[eg]=a),s&&(this.cacheHeaders[tg]=s.toISOString()),l?this.writeCaches=!0:r?this.writeCaches=!o.includes(r):this.writeCaches=!0}cacheHeaders;writeCaches;async saveStepCacheEntries(e,t,r){if(!this.writeCaches){r.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){r.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){let t=await this.client.getStepCacheForTest({testId:e.testId,organizationId:e.organizationId,steps:e.steps,schemaVersion:e.schemaVersion},this.cacheHeaders);if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}let{uniqueKeysHit:r}=Uo({steps:e.steps,stepCacheEntries:t,logger:e.logger});this.client.updateCacheLastUsedDate(e.testId,r,e.logger,this.cacheHeaders)}};import{Server as lN}from"socket.io";import{cloneDeep as NP}from"lodash-es";var kP={showOverlay:!1},Qd=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:r,clientIp:o,sessionId:i,browserbaseSessionId:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:a,browserBehavior:NP(kP)}),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)}},Q=new Qd;function JS(n,e,t){let r=Date.now(),o=Date.now(),i,a,s,l,c=!1,d=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=s;s=void 0;let S=h.url(),w=g.toEditorDisplayCopy();JSON.stringify(w)===JSON.stringify(i)&&S===l&&r>o||(n.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:a??[],context:w,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=w}catch(f){if(!n.connected)return;let S=f instanceof Error?f.message:`${f}`;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:f,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=Q.getSession(e),g=h?.controller?.browser;if(!g||g.closed){t.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(g,h.context)},1e3),u=(h,g)=>!!(JSON.stringify(h)!==JSON.stringify(a)||g.logsPerPage.some(f=>f.length>0)||g.harPages&&Object.keys(g.harPages).length>0||g.harEntries&&Object.keys(g.harEntries).length>0),m=setInterval(async()=>{let g=Q.getSession(e)?.controller?.browser;if(!g||g.closed){clearInterval(m);return}else if(c)return;c=!0;try{let f=await g.getAllFrameUrls(),S=g.retrieveAndClearDebugData();u(f,S)&&(a=f,s=S,o=Date.now())}catch(f){t.warn({err:f},"Failed to fetch extended details")}finally{c=!1}},2500);return{timers:[p,m]}}var fr={};var _P=n=>()=>{let{sessionId:e}=n.metadata;fr[e]?.abort?.abort()},XS={event:"cancelApiTest",createHandler:_P};import{CookieJar as eL}from"tough-cookie";import{randomUUID as $P}from"crypto";import{faker as DP}from"@faker-js/faker";import FP from"assert";import UP from"axios";import BP from"moment";import*as zP from"otpauth";import HP from"pg";async function ZS(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=xs(r,e);t.push(...o)}),t}var jP=Object.getPrototypeOf(async function(){}).constructor;async function QS(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,a={},s=(f,S)=>{o[f]=S,a[f]=S},l={},c=(f,S)=>{o[f]=S,l[f]=S},d;r.includes("Octokit")&&(d=(await import("@octokit/rest")).Octokit);let p;r.includes("createAppAuth")&&(p=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new jP("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(UP,BP,i.fakerInstance??DP,FP,HP,d,p,zP,ZS,o,s,c,S=>i.sms.send(S),S=>i.sms.fetchLatest(S),i.email,i.sms,i.ai)),m=!0,h,g;try{h=await D(u(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal})}catch(f){t.error({err:f,env:o,evalCode:r},`[${n}] Error executing code: ${f}`),m=!1,f instanceof hr?g=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:g=f instanceof Error?f.message:`${f}`}return{result:h,variableUpdates:a,persistentVariableUpdates:l,success:m,error:g}}async function ey({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:a=ar}){let s=$P(),l=await QS(s,{code:n,options:{fragment:e,timeoutMs:a},bindings:t.toObjectCopy(),tools:r,signal:i},o);return y.debug(`[${s}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as GP,randomUUID as WP}from"crypto";import VP from"fetch-retry";var qP=VP(global.fetch,{retries:3,retryOn:function(n,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(n){return Math.pow(2,n)*500}}),ty=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,ny=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function ry({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=ar,retries:i=2,signal:a,logger:s}){if(!ty)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!ny)throw new Error("Missing lambda auth secret.");let p=GP("sha256",ny).update(n).digest("hex");for(;d<=i;){d++,a?.throwIfAborted();let m={id:WP(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await D(qP(ty,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!l)throw new Error("Got empty response from code evaluation server");if(!l.ok)throw new Error(`Code evaluation server returned error code ${l.status}`);c=void 0;break}catch(h){c=h}}if(c)throw s.error({err:c},"Failed to evaluate code remotely"),c;if(!l)throw new Error(`An unexpected code evaluation error occurred${c?`: ${c}`:""}`);let u;try{u=bh.parse(await l.json())}catch(m){throw new Error(`Code evaluation server returned invalid response: ${m}`)}if(u.error)throw new Error(`Code evaluation error: ${u.error}`);return u}async function Kn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await ry(n);else if(n.localTools)e=await ey({...n,localTools:n.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
|
|
50
50
|
${e.error}
|
|
51
51
|
Code received:
|
|
52
|
-
${n.code}`;throw n.logger.error({err:e.error,code:n.code,env:n.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,r]of Object.entries(e.variableUpdates))n.context.setVariable(t,r);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await n.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,r]of Object.entries(e.persistentVariableUpdates))n.context.setVariable(t,r)}return e.result}import{set as kP}from"lodash-es";async function Bt(n){let{orgId:e,s:t,context:r,logger:o,signal:i,flagStore:a,retries:s=2,timeoutMs:l=or,allowUndefined:c=!1}=n,d=/{{(.*?)}}/g,p=t.matchAll(d),u=t;for(let m of p){if(m.length<2)continue;let h=m[1].trim(),g;try{g=await Vn({orgId:e,code:h,fragment:!0,context:r,timeoutMs:l,logger:o,retries:s,localTools:n.localTools,signal:i,flagStore:a})}catch(S){throw o.error({err:S,value:t},"Error evaluating template string"),S}if(g===void 0&&!c)throw new R("UserConfigurationError",`Template fragment '${h}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let f=typeof g=="string"?g:`${g}`;f=f.replaceAll(/\$/g,"$$$$"),u=u.replace(m[0],f)}return u}async function ci(n){return VS(n)}async function VS({obj:n,bannedKeys:e,allowList:t,context:r,prefixPath:o=[],replacements:i=[],...a}){for(let s in n){if(e.includes(s))continue;let l=!1;if(t)if(t.includes(s))l=!0;else continue;let c=n[s],d=[...o,s];if(typeof c=="string"&&c.includes("{{")){let p=await Bt({s:c,context:r,...a});if(c===p)continue;i.push({path:d,original:c}),n[s]=p}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await VS({obj:c,bannedKeys:e,context:r,prefixPath:d,replacements:i,allowList:l?void 0:t,...a})}return i}function qS(n,e){for(let{path:t,original:r}of e)kP(n,t,r)}import _P from"fetch-retry";var hX=process.env.MAILINATOR_API_KEY,gX=_P(global.fetch,{retryOn:function(n,e,t){return n>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(n){return 500}});import FP from"fetch-cookie";import{cloneDeep as UP}from"lodash-es";var DP=3e4;async function ll({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??DP/1e3,i=Object.fromEntries(Object.entries(n.headers||{}).filter(([m,h])=>m&&h)),a=new URLSearchParams;Object.entries(n.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{a.append(m,h)});let s=a.toString(),l;if(Fo(n.url)&&(l=n.url),t&&Uo(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);e.debug({url:l,searchParams:s,headers:i,body:n.body,method:n.method},"Making HTTP request");let d=await _((async()=>{let m=s?`${l}?${s}`:l;try{return await r(m,{headers:i,method:n.method,body:n.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new R("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let m;try{m=await d.text()}catch(h){m=`Failed to read response body: ${h}`}throw new R("ActionFailureError",`Fetch request failed with status ${d.status}: ${m}`)}let p={};d.headers.forEach((m,h)=>{p[h]=m});let u={status:d.status,headers:p};if(d.headers.get("content-type")?.includes("json"))try{u.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(u.text=await d.text());return u}async function KS(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,a=UP(i);await ci({obj:a,orgId:o,bannedKeys:["code"],...e});let s=await BP(n);return a.envKey&&s.data&&r.setVariable(a.envKey,s.data),s}async function BP(n){let{fixtures:e,inputs:t}=n,{step:r,orgId:o,baseUrl:i}=t,{cookieJar:a}=e,s=new Date;switch(r.type){case"JAVASCRIPT":{let c=await Vn({code:r.code,orgId:o,fragment:!!r.fragment,timeoutMs:r.timeout?r.timeout*1e3:void 0,...e});try{JSON.stringify(c)}catch(d){return{...r,startedAt:s,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${d instanceof Error?d.message:`${d}`}`}}return{...r,startedAt:s,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=FP(fetch,a),d=await ll({command:r,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...r,startedAt:s,finishedAt:new Date,status:"SUCCESS",message:"Request executed successfully",data:d}}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}async function YS(n){let{inputs:e,fixtures:t,callbacks:r}=n,{signal:o}=t,{steps:i,orgId:a,baseUrl:s}=e,{test:l,step:c}=r,d={startedAt:new Date,status:"RUNNING",results:[]},p=d.results,u=new zP,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await KS({inputs:{step:h,baseUrl:s,orgId:a},fixtures:m})}catch(S){o?.aborted?f={...h,startedAt:g,finishedAt:new Date,status:"CANCELLED",message:"Step cancelled by user."}:f={...h,startedAt:g,finishedAt:new Date,status:"FAILED",message:`Step failed: ${S instanceof Error?S.message:`${S}`}`}}if(p.push(f),c.onFinished?.({result:f,cookies:ys(u,new URL(s).hostname)}),l.updateAttemptProgress?.({results:p}),f.status!=="SUCCESS"){d.status=f.status==="CANCELLED"?"CANCELLED":"FAILED";break}}return d.status==="RUNNING"&&(d.status="PASSED"),d.finishedAt=new Date,l.onFinished?.(),d}async function JS(n){let{socket:e,storage:t}=n,r=n.socket.id,{testId:o}=e.handshake.query;if(typeof o!="string")throw new Error(`Received invalid test ID that does not parse as a string: ${o}`);let i=await t.getOrgId({type:"api-test",testId:o}),{baseUrl:a,envName:s,environmentVariables:l}=await Yd({testId:o,orgId:i,logger:n.logger,storage:t,authorization:n.authorization}),c={type:"api-test",orgId:await n.storage.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new Rt({baseUrl:a||"",currentUrl:a||"",variablesFromEnvironment:l,envName:s})};return hr[r]=c,c}async function Yd({testId:n,orgId:e,logger:t,storage:r,authorization:o}){let i=await r.fetchApiTestMetadata(n,e,t);if(!i)throw new Error(`Failed to fetch API test metadata for test ID: ${n}`);let a;o?.type==="API_KEY"&&(a=new mr({httpClient:new Ot({...o,logger:t}),fakerSeed:void 0}));let s=i.envs?.find(p=>p.default),l;s&&(l=await r.fetchEnvironment(e,s.name,t));let c=i.baseUrl||l?.variables?.[Ge];if(!c)throw new Error("Base URL is empty in both API test options and the configured environment");let d={...l?.variables};return{baseUrl:c,envName:l?.name,environmentVariables:d,localCodeEvalTools:a}}var HP=n=>async(e,t)=>{let{steps:r}=e,{authorization:o,metadata:i,socket:a,storage:s,logger:l,flagStoreFactory:c}=n,{orgId:d,testId:p,sessionId:u}=i,m=l.child({testId:p,orgId:d,sessionId:u}),h=hr[u];if(!h)throw new Error(`No api testing session with id ${u} could be found. Please reconnect and try again.`);let g=new AbortController;h.abort=g;let f=h.latestContext,{localCodeEvalTools:S,baseUrl:w}=await Yd({testId:p,orgId:d,logger:m,storage:s,authorization:o}),v={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(d)},C=await YS({inputs:{steps:r,orgId:d,baseUrl:w},fixtures:v,callbacks:{test:{onFinished:()=>{a.emit("apiTestFinished")}},step:{onStarted:A=>{a.emit("apiStepStarted",A)},onFinished:A=>{a.emit("apiStepFinished",A)}}}});t({result:C})},XS={event:"executeApiTest",createHandler:HP};var $P=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{e.info({sessionId:t},"Cancel event received");let r=Q.getSession(t);if(!r)throw new Error("No active session found");try{r.controller.setClosed()}catch{}}},ZS={event:"cancel",createHandler:$P};var jP=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=Q.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let a=i.controller.browser;try{let l=(await a.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),o({a11yTree:l})}catch(s){e.error({err:s},"Error fetching a11y tree from the browser"),o({err:s.message})}}},QS={event:"fetchA11yTree",createHandler:jP};var GP=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=Q.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let a=i.controller.browser;try{let s=await a.html();o({html:s})}catch(s){e.error({err:s},"Error fetching DOM from the browser"),s.name==="TimeoutError"?o({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):o({err:s.message})}}},ey={event:"fetchDom",createHandler:GP};var WP=({metadata:n,logger:e})=>{let{sessionId:t,type:r}=n;return o=>{e.info({sessionId:t,reason:o},`Disconnect event received (${o})`),r==="e2e"?Q.removeSession(t,e):r==="api-test"&&delete hr[t]}},ty={event:"disconnect",createHandler:WP};function tn(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=VP(t);qP(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await KP(i,e,r,o)}catch(a){n.logger.error({result:n.result,err:a},"Error hoisting scalar result metadata")}})())}function VP(n){let e=n[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertion){t=e;break}break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!e.results.length){t=e;break}e=e.results[e.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"})(e)}if(t)break}let r=n[n.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!r.results.length){o=r;break}r=r.results[r.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"})(r)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function qP(n,e,t){e&&(n.beforeUrl=e.beforeUrl),t&&(n.afterUrl=t.afterUrl,n.data=t.data,t.status!=="SUCCESS"&&(n.message=t.message))}async function KP(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Ea from"os";import YP from"v8";var ny,In,JP=Ea.platform(),XP=Ea.cpus().map(n=>({model:n.model,speed:n.speed}));function ry(n){let e=()=>{try{let t=!1,r=ZP(),o=QP();r.freeMemory<1e6&&(t=!0);let i=YP.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(t=!0),t?n.warn({memory:r,cpu:o,heapStats:i},"Critical resource usage metrics detected"):n.debug({memory:r,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),{interval:setInterval(e,1e4),cpuMetadata:XP,platform:JP}}function ZP(){let n=Ea.totalmem(),e=Ea.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function QP(){let n=Ea.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of n)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,!In)return In=t,null;let r={user:t.user-In.user,nice:t.nice-In.nice,sys:t.sys-In.sys,idle:t.idle-In.idle,irq:t.irq-In.irq,total:t.total-In.total};return ny={measurementTime:e,intervalMs:e-In.measurementTime,user:r.user/r.total*100,nice:r.nice/r.total*100,sys:r.sys/r.total*100,idle:r.idle/r.total*100,irq:r.irq/r.total*100,total:100-r.idle/r.total*100},In=t,ny}import{hostname as oL}from"os";async function iy(n){let{command:e,tracer:t,timeoutMs:r,targetingWrapper:o,disableCache:i,fixtures:a}=n,{logger:s,abortSignal:l}=a;if(e.target&&!tr(e.target))throw new Error("Element assertion with x/y is not supported yet");let c=e.assertion.type==="ELEMENT_EXISTENCE"&&e.assertion.negated,d=Date.now(),p=0,u,m=500;for(;p<2||Date.now()-d<r;){p++,p>1&&await te(m,l),l?.throwIfAborted();try{let{newTarget:h,elementInteractedDisplayString:g,result:f}=await o({ctx:a.ctx,tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async S=>eL(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:Pr(e)}});if(u={success:f.success,data:f.data,err:f.err,newTarget:h,elementInteractedDisplayString:g},!f.success){u=f,m=Math.min(m*2,1e4);continue}return u}catch(h){if(l?.throwIfAborted(),c)return{success:!0,thoughts:`The element described does not exist on the page: ${h.message}`};if(s.warn({err:h},"Element assertion ended in error, retrying..."),!(h instanceof R)||h.reason!="ActionFailureError")throw h;u={success:!1,err:h}}}if(!u)throw new Error(`Failed to evaluate manual element assertion in ${r}ms.`);return u}async function eL(n,{command:e,fixtures:t}){let r=e.assertion;await t.browser.highlight(n);let o=!0,i,a;switch(r.type){case"ELEMENT_CONTENT":{let s=await n.textContent()??"";if(a={elementTextContent:ze(s,500,!0)},!oy(s,r.value,r.operation,!!r.negated)){let l=r.negated?ar[r.operation]:sr[r.operation];o=!1,i=new R("AssertionFailureError",`The content ${l} '${r.value}': ${s}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:ze(await n.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let s;try{s=await n.getAttribute(r.attr,{timeout:3e3})??""}catch(l){i=new R("AssertionFailureError",`The element does not have an attribute named ${r.attr}: ${l}`),o=!1;break}if(!oy(s,r.value,r.operation,!!r.negated)){let l=r.negated?ar[r.operation]:sr[r.operation];o=!1,r.operation==="EXISTS"?i=r.negated?new R("AssertionFailureError",`The attribute ${r.attr} ${l}: ${s}`):new R("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new R("AssertionFailureError",`The attribute ${r.attr} ${l} '${r.value}': ${s}`)}break}case"ELEMENT_EXISTENCE":{switch(r.condition){case"VISIBLE":{o=await n.evaluate(async(l,c)=>{let d=Date.now();for(;Date.now()-d<c;){let p=l.getBoundingClientRect();if(p.width>0&&p.height>0)return!0;await new Promise(u=>setTimeout(u,250))}return!1},Tn*1e3);break}case"EDITABLE":{o=await n.isEditable({timeout:Tn*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await n.isEnabled({timeout:Tn*1e3});break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.condition)}if(o=r.negated?!o:o,!o){let s=r.negated?ld[r.condition]:cd[r.condition];i=new R("AssertionFailureError",`The element ${s}`)}break}}return{success:o,data:a,err:i}}function oy(n,e,t,r){let o;switch(t){case"CONTAINS":{o=n.includes(e);break}case"EQUALS":{o=n.trim()===e.trim();break}case"STARTS_WITH":{o=n.trim().startsWith(e);break}case"EXISTS":{o=n.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 r?!o:o}import{Jimp as tL}from"jimp";async function Ca(n,e){let t=await n.screenshot(e),r=await tL.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as ay}from"jimp";import Jd from"jpeg-js";import nL from"pixelmatch";async function sy({ctx:n,tracer:e,command:t,disableCache:r,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!tr(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let l={clearHighlights:!0,hideCaret:!0},c;t.target?.elementDescriptor?c=(await i({ctx:n,tracer:e,command:t,target:t.target,cache:t.cache?.target??t.target?.a11yData,action:async F=>Ca(o,{locator:F.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await Ca(o,l);let d=await s.prepareGoldenScreenshotForComparison(a,t,c);if((c.height!==d.height||c.width!==d.width)&&a.debug({currHeight:c.height,currWidth:c.width,savedHeight:d.height,savedWidth:d.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-d.height)>10||Math.abs(c.width-d.width)>10){let H=`${c.width}x${c.height}`,F=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${H}) does not match saved screenshot dimensions (${F}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:d.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let p=await ay.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await ay.fromBuffer(d.buffer),h={width:d.width,height:d.height},g,f=u.width*u.height,S=h.width*h.height,w=Math.abs(u.height-h.height),v=Math.abs(u.width-h.width);if(f>S){let H=p.cover({w:h.width,h:h.height});c.buffer=await H.getBuffer("image/jpeg"),g="current",c.width=h.width,c.height=h.height}else if(S>f){let H=m.cover({w:u.width,h:u.height});d.buffer=await H.getBuffer("image/jpeg"),g="saved"}let b={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},x=t.threshold??.1,A=nL(Jd.decode(d.buffer).data,Jd.decode(c.buffer).data,b.data,c.width,c.height,{threshold:x,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,N=A>x*100,P=`Visual diff of ${A.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${x*100}%.`;if(g&&(P+=` The ${g} screenshot was cropped since it was taller by ${w} pixels and wider by ${v} pixels.`),N)throw new R("ActionFailureError",P);return{fail:N,thoughts:P,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:Jd.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var rL=5e3;async function cl({timeout:n=Tn,...e}){let t=Date.now(),r=n*1e3,o=r+1e4,i,a=0,s=500;for(;a-t<r;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal.throwIfAborted();let l=Date.now();i=await ly(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await te(s,e.signal),s=Math.min(Math.floor(s*1.5),rL);else return i}return i=await ly(e),i}async function ly({assertion:n,browser:e,flagStore:t}){switch(n.type){case"CONTENT":{let o,i=!1,a;try{let s;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(cy,{value:n.value,negated:!!n.negated,returnHtml:!1});i=n.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(cy,{value:n.value,negated:!!n.negated,returnHtml:!0},"checking page content"));if(!i){let l=n.negated?ar.CONTAINS:sr.CONTAINS;a=new R("AssertionFailureError",`The page ${l} '${n.value}'.`),o=s}}catch(s){a=new R("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"})(n.type)}}function cy({value:n,negated:e,returnHtml:t}){let r=document.documentElement.outerHTML,o=r.includes(n)===!e;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?r:void 0}}var Xd=async n=>{let{step:e,resolvedInputs:t}=n.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:a,controller:s}=n.fixtures,l=s.browser,{orgId:c,runId:d}=n.inputs,p=s.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),r.debug({inputs:t,moduleId:e.moduleId},"Set module inputs"));let u,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Bt({orgId:c,s:f,context:o,logger:r,localTools:a,signal:p,flagStore:s.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([v,b])=>`${v}:${b}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let w=Date.now();for(;Date.now()-w<Dh;){p?.throwIfAborted();let v=await i.getCacheResult(g);if(v){r.debug({cacheResult:v},"Got result from module execution cache"),u=dl(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(v),m=!0;break}else r.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${oL()};runId:${d}`},p);if(b.acquired){h=b.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await te(2500+Math.random()*1e4,p)}}try{if(!u)u=await iL(n);else if(e.autoAuth){let f=Ss.safeParse(u.data);if(!f.success)throw new R("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);r.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(f.data);let S=!1,w=e.advanced?.cacheInvalidation;if(w&&w.type==="PAGE_CHECK"){let v={type:"CONTENT",value:w.substring},b=await cl({timeout:Tn,assertion:v,browser:l,flagStore:s.flagStore,logger:r,signal:p});b.success?r.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(r.info({invalResult:b},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),Xd(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await aL({step:e,result:u,browser:s.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},iL=async n=>{let{step:e,tracer:t}=n.moduleParams,r=dl(e,n.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:a}=await gr(n.work,()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return r.results=a,r.status=i,r.finishedAt=new Date,tn({asyncTasks:n.work.asyncTasks,nestedResults:a,result:r,logger:n.fixtures.logger}),r};function dl(n,e,t){let r={};return Object.entries(e).forEach(([i,a])=>{r[i]=JSON.stringify(a)}),{type:"MODULE",id:n.id,moduleId:n.moduleId,moduleName:n.name,startedAt:new Date,cacheConfig:n.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:t}}async function dy({orgId:n,step:e,context:t,logger:r,flagStore:o,codeEvalTools:i,signal:a}){let s={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){r.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}s[l]=await Vn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:a,flagStore:o})}return s}catch(l){throw a?.throwIfAborted(),new R("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function aL({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let a=n.cacheConfig?.cacheExpiryMs;(!a||a===mg)&&(a=n.defaultCacheTtl??hg);let s;n.autoAuth?s=JSON.stringify(await t.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:r,ttlMs:a,truncatedCacheResultJson:zg(s)},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:r,ttlMs:a})}async function fr(n,e,t){let r=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 R?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=dl(n,{},"FAILED");return l.message=s,l.startedAt=r,l.finishedAt=i,l}return{...ks(n),startedAt:r,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function gr(n,e){let t=!1;try{return n&&!n.state.failureRecoveryDisabled&&(n.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{n&&t&&(n.state.failureRecoveryDisabled=void 0)}}import{randomUUID as py}from"crypto";import{cloneDeep as lL}from"lodash-es";function pl(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var ul=async n=>{let{step:e,tracer:t}=n.presetParams,{logger:r,controller:o,context:i,billingReporter:a}=n.fixtures,{collectDebugData:s}=n.options,{testMetadata:l,suiteMetadata:c}=n.inputs,d=e.command.type,p=r.child({commandType:d,stepId:e.id,commandId:e.command.id}),u=Xi(e.command);n.work.asyncTasks.push(a.reportCreditsUsed(p,d,u,{testId:l?.id,testName:l?.name,suiteId:c?.id,suiteName:c?.name}));let m=o.browser.url(),h=new Date,g,f=py(),S=py();if(s)try{g=await o.browser.screenshot({retries:1,clearHighlights:!0});let C=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:p,snapshotId:f,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(p,f,C))}catch(C){p.debug({err:C},"Failed to take screenshot before step, likely because the page is still loading. This is non-fatal and does not affect the test.")}let w,v,b,x=ms();try{let C=await o.executePresetCommand(x,t,e.command,i,l?.advanced.disableAICaching??!1);C.beforeScreenshotOverride&&(g=C.beforeScreenshotOverride),b=C.afterScreenshotOverride;let{proposedStep:A}=cL({work:n.work,step:e,newTargets:C.newTargets,logger:p}),N=new Date,P=o.browser.url();v={beforeUrl:m,afterUrl:P,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},w={...e,message:C.thoughts??dL(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:P,finishedAt:N,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[v],details:x.details,proposedStep:A},"assertion"in e.command&&(w.message=C.thoughts||"Assertion passed.")}catch(C){p.error({message:C.message,stack:C.stack},`Failed executing preset step ${zr(e.command)}`);let A=o.browser.url(),N=new Date,P=C instanceof Error?C.message:`${C}`;C instanceof R&&C.getLastScreenshotBuffer()&&(b=C.getLastScreenshotBuffer()),v={beforeUrl:m,afterUrl:A,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:P},w={...e,startedAt:h,finishedAt:N,beforeUrl:m,afterUrl:A,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:P,failureReason:C instanceof R?C.reason:void 0,results:[v],details:x.details}}if(s)try{b||(b=await o.browser.screenshot({retries:1}));let C=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:p,snapshotId:S,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(p,S,C))}catch(C){p.debug({err:C},"Failed store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return v.beforeSnapshot=f,w.beforeSnapshot=f,v.afterSnapshot=S,w.afterSnapshot=S,g&&(t.attachBeforeScreenshot({logger:p,snapshotId:f,screenshot:g}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(p,f,g))),b&&(t.attachAfterScreenshot({logger:p,snapshotId:S,screenshot:b}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(p,S,b))),w};function cL({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;Ng(o,t,r);let i=t[0]?.description;if(i&&"target"in o&&o.target&&o.target.type==="description"){let a={...o,target:{...o.target,elementDescriptor:i}},s={...lL(e),command:a};return pl(n,{type:"DESCRIPTION_UPDATE",thoughts:`Updated element description after the original element could not be found on the page. New element location reasoning: ${t[0]?.thoughts}`}),{proposedStep:s}}return{proposedStep:void 0}}function dL(n){if(n?.length){if(n.length===1&&n[0]?.thoughts)return n[0].thoughts;if(n.length===2&&n.every(e=>e.thoughts))return`Located first element: ${n[0]?.thoughts}
|
|
53
|
-
Located second element: ${n[1]?.thoughts}`}}async function
|
|
54
|
-
${A}`}),u;case"RIGHT_TRACK":{v=void 0,S===0?c.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:A}):
|
|
55
|
-
${C.feedback}`,w++,w>=
|
|
52
|
+
${n.code}`;throw n.logger.error({err:e.error,code:n.code,env:n.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,r]of Object.entries(e.variableUpdates))n.context.setVariable(t,r);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await n.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,r]of Object.entries(e.persistentVariableUpdates))n.context.setVariable(t,r)}return e.result}import{set as KP}from"lodash-es";async function Ht(n){let{orgId:e,s:t,context:r,logger:o,signal:i,flagStore:a,retries:s=2,timeoutMs:l=ar,allowUndefined:c=!1}=n,d=/{{(.*?)}}/g,p=t.matchAll(d),u=t;for(let m of p){if(m.length<2)continue;let h=m[1].trim(),g;try{g=await Kn({orgId:e,code:h,fragment:!0,context:r,timeoutMs:l,logger:o,retries:s,localTools:n.localTools,signal:i,flagStore:a})}catch(S){throw o.error({err:S,value:t},"Error evaluating template string"),S}if(g===void 0&&!c)throw new R("UserConfigurationError",`Template fragment '${h}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let f=typeof g=="string"?g:`${g}`;f=f.replaceAll(/\$/g,"$$$$"),u=u.replace(m[0],f)}return u}async function pi(n){return oy(n)}async function oy({obj:n,bannedKeys:e,allowList:t,context:r,prefixPath:o=[],replacements:i=[],...a}){for(let s in n){if(e.includes(s))continue;let l=!1;if(t)if(t.includes(s))l=!0;else continue;let c=n[s],d=[...o,s];if(typeof c=="string"&&c.includes("{{")){let p=await Ht({s:c,context:r,...a});if(c===p)continue;i.push({path:d,original:c}),n[s]=p}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await oy({obj:c,bannedKeys:e,context:r,prefixPath:d,replacements:i,allowList:l?void 0:t,...a})}return i}function iy(n,e){for(let{path:t,original:r}of e)KP(n,t,r)}import YP from"fetch-retry";var DX=process.env.MAILINATOR_API_KEY,FX=YP(global.fetch,{retryOn:function(n,e,t){return n>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(n){return 500}});import XP from"fetch-cookie";import{cloneDeep as ZP}from"lodash-es";var JP=3e4;async function ml({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??JP/1e3,i=Object.fromEntries(Object.entries(n.headers||{}).filter(([m,h])=>m&&h)),a=new URLSearchParams;Object.entries(n.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{a.append(m,h)});let s=a.toString(),l;if(Bo(n.url)&&(l=n.url),t&&zo(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);e.debug({url:l,searchParams:s,headers:i,body:n.body,method:n.method},"Making HTTP request");let d=await D((async()=>{let m=s?`${l}?${s}`:l;try{return await r(m,{headers:i,method:n.method,body:n.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new R("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let m;try{m=await d.text()}catch(h){m=`Failed to read response body: ${h}`}throw new R("ActionFailureError",`Fetch request failed with status ${d.status}: ${m}`)}let p={};d.headers.forEach((m,h)=>{p[h]=m});let u={status:d.status,headers:p};if(d.headers.get("content-type")?.includes("json"))try{u.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(u.text=await d.text());return u}async function ay(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,a=ZP(i);await pi({obj:a,orgId:o,bannedKeys:["code"],...e});let s=await QP(n);return a.envKey&&s.data&&r.setVariable(a.envKey,s.data),s}async function QP(n){let{fixtures:e,inputs:t}=n,{step:r,orgId:o,baseUrl:i}=t,{cookieJar:a}=e,s=new Date;switch(r.type){case"JAVASCRIPT":{let c=await Kn({code:r.code,orgId:o,fragment:!!r.fragment,timeoutMs:r.timeout?r.timeout*1e3:void 0,...e});try{JSON.stringify(c)}catch(d){return{...r,startedAt:s,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${d instanceof Error?d.message:`${d}`}`}}return{...r,startedAt:s,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=XP(fetch,a),d=await ml({command:r,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...r,startedAt:s,finishedAt:new Date,status:"SUCCESS",message:"Request executed successfully",data:d}}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}async function sy(n){let{inputs:e,fixtures:t,callbacks:r}=n,{signal:o}=t,{steps:i,orgId:a,baseUrl:s}=e,{test:l,step:c}=r,d={startedAt:new Date,status:"RUNNING",results:[]},p=d.results,u=new eL,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await ay({inputs:{step:h,baseUrl:s,orgId:a},fixtures:m})}catch(S){o?.aborted?f={...h,startedAt:g,finishedAt:new Date,status:"CANCELLED",message:"Step cancelled by user."}:f={...h,startedAt:g,finishedAt:new Date,status:"FAILED",message:`Step failed: ${S instanceof Error?S.message:`${S}`}`}}if(p.push(f),c.onFinished?.({result:f,cookies:Es(u,new URL(s).hostname)}),l.updateAttemptProgress?.({results:p}),f.status!=="SUCCESS"){d.status=f.status==="CANCELLED"?"CANCELLED":"FAILED";break}}return d.status==="RUNNING"&&(d.status="PASSED"),d.finishedAt=new Date,l.onFinished?.(),d}async function ly(n){let{socket:e,storage:t}=n,r=n.socket.id,{testId:o}=e.handshake.query;if(typeof o!="string")throw new Error(`Received invalid test ID that does not parse as a string: ${o}`);let i=await t.getOrgId({type:"api-test",testId:o}),{baseUrl:a,envName:s,environmentVariables:l}=await ep({testId:o,orgId:i,logger:n.logger,storage:t,authorization:n.authorization}),c={type:"api-test",orgId:await n.storage.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new It({baseUrl:a||"",currentUrl:a||"",variablesFromEnvironment:l,envName:s})};return fr[r]=c,c}async function ep({testId:n,orgId:e,logger:t,storage:r,authorization:o}){let i=await r.fetchApiTestMetadata(n,e,t);if(!i)throw new Error(`Failed to fetch API test metadata for test ID: ${n}`);let a;o?.type==="API_KEY"&&(a=new gr({httpClient:new Nt({...o,logger:t}),fakerSeed:void 0}));let s=i.envs?.find(p=>p.default),l;s&&(l=await r.fetchEnvironment(e,s.name,t));let c=i.baseUrl||l?.variables?.[Ge];if(!c)throw new Error("Base URL is empty in both API test options and the configured environment");let d={...l?.variables};return{baseUrl:c,envName:l?.name,environmentVariables:d,localCodeEvalTools:a}}var tL=n=>async(e,t)=>{let{steps:r}=e,{authorization:o,metadata:i,socket:a,storage:s,logger:l,flagStoreFactory:c}=n,{orgId:d,testId:p,sessionId:u}=i,m=l.child({testId:p,orgId:d,sessionId:u}),h=fr[u];if(!h)throw new Error(`No api testing session with id ${u} could be found. Please reconnect and try again.`);let g=new AbortController;h.abort=g;let f=h.latestContext,{localCodeEvalTools:S,baseUrl:w}=await ep({testId:p,orgId:d,logger:m,storage:s,authorization:o}),v={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(d)},C=await sy({inputs:{steps:r,orgId:d,baseUrl:w},fixtures:v,callbacks:{test:{onFinished:()=>{a.emit("apiTestFinished")}},step:{onStarted:A=>{a.emit("apiStepStarted",A)},onFinished:A=>{a.emit("apiStepFinished",A)}}}});t({result:C})},cy={event:"executeApiTest",createHandler:tL};var nL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{e.info({sessionId:t},"Cancel event received");let r=Q.getSession(t);if(!r)throw new Error("No active session found");try{r.controller.setClosed()}catch{}}},dy={event:"cancel",createHandler:nL};var rL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=Q.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let a=i.controller.browser;try{let l=(await a.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),o({a11yTree:l})}catch(s){e.error({err:s},"Error fetching a11y tree from the browser"),o({err:s.message})}}},py={event:"fetchA11yTree",createHandler:rL};var oL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=Q.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let a=i.controller.browser;try{let s=await a.html();o({html:s})}catch(s){e.error({err:s},"Error fetching DOM from the browser"),s.name==="TimeoutError"?o({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):o({err:s.message})}}},uy={event:"fetchDom",createHandler:oL};var iL=({metadata:n,logger:e})=>{let{sessionId:t,type:r}=n;return o=>{e.info({sessionId:t,reason:o},`Disconnect event received (${o})`),r==="e2e"?Q.removeSession(t,e):r==="api-test"&&delete fr[t]}},my={event:"disconnect",createHandler:iL};function rn(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=aL(t);sL(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await lL(i,e,r,o)}catch(a){n.logger.error({result:n.result,err:a},"Error hoisting scalar result metadata")}})())}function aL(n){let e=n[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertion){t=e;break}break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!e.results.length){t=e;break}e=e.results[e.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"})(e)}if(t)break}let r=n[n.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!r.results.length){o=r;break}r=r.results[r.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"})(r)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function sL(n,e,t){e&&(n.beforeUrl=e.beforeUrl),t&&(n.afterUrl=t.afterUrl,n.data=t.data,t.status!=="SUCCESS"&&(n.message=t.message))}async function lL(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Ia from"os";import cL from"v8";var hy,Ln,dL=Ia.platform(),pL=Ia.cpus().map(n=>({model:n.model,speed:n.speed}));function gy(n){let e=()=>{try{let t=!1,r=uL(),o=mL();r.freeMemory<1e6&&(t=!0);let i=cL.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(t=!0),t?n.warn({memory:r,cpu:o,heapStats:i},"Critical resource usage metrics detected"):n.debug({memory:r,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),{interval:setInterval(e,1e4),cpuMetadata:pL,platform:dL}}function uL(){let n=Ia.totalmem(),e=Ia.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function mL(){let n=Ia.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of n)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,!Ln)return Ln=t,null;let r={user:t.user-Ln.user,nice:t.nice-Ln.nice,sys:t.sys-Ln.sys,idle:t.idle-Ln.idle,irq:t.irq-Ln.irq,total:t.total-Ln.total};return hy={measurementTime:e,intervalMs:e-Ln.measurementTime,user:r.user/r.total*100,nice:r.nice/r.total*100,sys:r.sys/r.total*100,idle:r.idle/r.total*100,irq:r.irq/r.total*100,total:100-r.idle/r.total*100},Ln=t,hy}import{hostname as yL}from"os";async function Sy(n){let{command:e,tracer:t,timeoutMs:r,targetingWrapper:o,disableCache:i,fixtures:a}=n,{logger:s,abortSignal:l}=a;if(e.target&&!rr(e.target))throw new Error("Element assertion with x/y is not supported yet");let c=e.assertion.type==="ELEMENT_EXISTENCE"&&e.assertion.negated&&(e.assertion.condition==="EXISTS"||e.assertion.condition==="VISIBLE"),d=Date.now(),p=0,u,m=500;for(;p<2||Date.now()-d<r;){p++,p>1&&await ne(m,l),l?.throwIfAborted();try{let{newTarget:h,elementInteractedDisplayString:g,result:f}=await o({ctx:a.ctx,tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async S=>hL(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:Or(e)}});if(u={success:f.success,data:f.data,err:f.err,newTarget:h,elementInteractedDisplayString:g},!f.success){u=f,m=Math.min(m*2,1e4);continue}return u}catch(h){if(l?.throwIfAborted(),c)return{success:!0,thoughts:`The element described does not exist on the page: ${h.message}`};if(s.warn({err:h},"Element assertion ended in error, retrying..."),!(h instanceof R)||h.reason!="ActionFailureError")throw h;u={success:!1,err:h}}}if(!u)throw new Error(`Failed to evaluate manual element assertion in ${r}ms.`);return u}async function hL(n,{command:e,fixtures:t}){let r=e.assertion;await t.browser.highlight(n);let o=!0,i,a;switch(r.type){case"ELEMENT_CONTENT":{let s=await n.textContent()??"";if(a={elementTextContent:ze(s,500,!0)},!fy(s,r.value,r.operation,!!r.negated)){let l=r.negated?lr[r.operation]:cr[r.operation];o=!1,i=new R("AssertionFailureError",`The content ${l} '${r.value}': ${s}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:ze(await n.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let s;try{s=await n.getAttribute(r.attr,{timeout:3e3})??""}catch(l){i=new R("AssertionFailureError",`The element does not have an attribute named ${r.attr}: ${l}`),o=!1;break}if(!fy(s,r.value,r.operation,!!r.negated)){let l=r.negated?lr[r.operation]:cr[r.operation];o=!1,r.operation==="EXISTS"?i=r.negated?new R("AssertionFailureError",`The attribute ${r.attr} ${l}: ${s}`):new R("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new R("AssertionFailureError",`The attribute ${r.attr} ${l} '${r.value}': ${s}`)}break}case"ELEMENT_EXISTENCE":{switch(r.condition){case"VISIBLE":{o=await n.evaluate(async(l,c)=>{let d=Date.now();for(;Date.now()-d<c;){let p=l.getBoundingClientRect();if(p.width>0&&p.height>0)return!0;await new Promise(u=>setTimeout(u,250))}return!1},En*1e3);break}case"EDITABLE":{o=await n.isEditable({timeout:En*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await n.isEnabled({timeout:En*1e3});break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.condition)}if(o=r.negated?!o:o,!o){let s=r.negated?md[r.condition]:hd[r.condition];i=new R("AssertionFailureError",`The element ${s}`)}break}}return{success:o,data:a,err:i}}function fy(n,e,t,r){let o;switch(t){case"CONTAINS":{o=n.includes(e);break}case"EQUALS":{o=n.trim()===e.trim();break}case"STARTS_WITH":{o=n.trim().startsWith(e);break}case"EXISTS":{o=n.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 r?!o:o}import{Jimp as gL}from"jimp";async function Pa(n,e){let t=await n.screenshot(e),r=await gL.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as yy}from"jimp";import tp from"jpeg-js";import fL from"pixelmatch";async function by({ctx:n,tracer:e,command:t,disableCache:r,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!rr(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let l={clearHighlights:!0,hideCaret:!0},c;t.target?.elementDescriptor?c=(await i({ctx:n,tracer:e,command:t,target:t.target,cache:t.cache?.target??t.target?.a11yData,action:async U=>Pa(o,{locator:U.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await Pa(o,l);let d=await s.prepareGoldenScreenshotForComparison(a,t,c);if((c.height!==d.height||c.width!==d.width)&&a.debug({currHeight:c.height,currWidth:c.width,savedHeight:d.height,savedWidth:d.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-d.height)>10||Math.abs(c.width-d.width)>10){let j=`${c.width}x${c.height}`,U=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${j}) does not match saved screenshot dimensions (${U}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:d.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let p=await yy.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await yy.fromBuffer(d.buffer),h={width:d.width,height:d.height},g,f=u.width*u.height,S=h.width*h.height,w=Math.abs(u.height-h.height),v=Math.abs(u.width-h.width);if(f>S){let j=p.cover({w:h.width,h:h.height});c.buffer=await j.getBuffer("image/jpeg"),g="current",c.width=h.width,c.height=h.height}else if(S>f){let j=m.cover({w:u.width,h:u.height});d.buffer=await j.getBuffer("image/jpeg"),g="saved"}let b={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},T=t.threshold??.1,A=fL(tp.decode(d.buffer).data,tp.decode(c.buffer).data,b.data,c.width,c.height,{threshold:T,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,k=A>T*100,L=`Visual diff of ${A.toFixed(2)}% detected, which is ${k?"over":"under"} the threshold of ${T*100}%.`;if(g&&(L+=` The ${g} screenshot was cropped since it was taller by ${w} pixels and wider by ${v} pixels.`),k)throw new R("ActionFailureError",L);return{fail:k,thoughts:L,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:tp.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var SL=5e3;async function hl({timeout:n=En,...e}){let t=Date.now(),r=n*1e3,o=r+1e4,i,a=0,s=500;for(;a-t<r;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal.throwIfAborted();let l=Date.now();i=await wy(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await ne(s,e.signal),s=Math.min(Math.floor(s*1.5),SL);else return i}return i=await wy(e),i}async function wy({assertion:n,browser:e,flagStore:t}){switch(n.type){case"CONTENT":{let o,i=!1,a;try{let s;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(vy,{value:n.value,negated:!!n.negated,returnHtml:!1});i=n.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(vy,{value:n.value,negated:!!n.negated,returnHtml:!0},"checking page content"));if(!i){let l=n.negated?lr.CONTAINS:cr.CONTAINS;a=new R("AssertionFailureError",`The page ${l} '${n.value}'.`),o=s}}catch(s){a=new R("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"})(n.type)}}function vy({value:n,negated:e,returnHtml:t}){let r=document.documentElement.outerHTML,o=r.includes(n)===!e;return r.length>1e4&&(r=r.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?r:void 0}}var np=async n=>{let{step:e,resolvedInputs:t}=n.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:a,controller:s}=n.fixtures,l=s.browser,{orgId:c,runId:d}=n.inputs,p=s.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),r.debug({inputs:t,moduleId:e.moduleId},"Set module inputs"));let u,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Ht({orgId:c,s:f,context:o,logger:r,localTools:a,signal:p,flagStore:s.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([v,b])=>`${v}:${b}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let w=Date.now();for(;Date.now()-w<Kh;){p?.throwIfAborted();let v=await i.getCacheResult(g);if(v){r.debug({cacheResult:v},"Got result from module execution cache"),u=gl(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(v),m=!0;break}else r.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${yL()};runId:${d}`},p);if(b.acquired){h=b.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await ne(2500+Math.random()*1e4,p)}}try{if(!u)u=await bL(n);else if(e.autoAuth){let f=Ts.safeParse(u.data);if(!f.success)throw new R("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);r.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(f.data);let S=!1,w=e.advanced?.cacheInvalidation;if(w&&w.type==="PAGE_CHECK"){let v={type:"CONTENT",value:w.substring},b=await hl({timeout:En,assertion:v,browser:l,flagStore:s.flagStore,logger:r,signal:p});b.success?r.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(r.info({invalResult:b},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),np(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await wL({step:e,result:u,browser:s.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},bL=async n=>{let{step:e,tracer:t}=n.moduleParams,r=gl(e,n.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:a}=await Sr(n.work,()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return r.results=a,r.status=i,r.finishedAt=new Date,rn({asyncTasks:n.work.asyncTasks,nestedResults:a,result:r,logger:n.fixtures.logger}),r};function gl(n,e,t){let r={};return Object.entries(e).forEach(([i,a])=>{r[i]=JSON.stringify(a)}),{type:"MODULE",id:n.id,moduleId:n.moduleId,moduleName:n.name,startedAt:new Date,cacheConfig:n.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:t}}async function xy({orgId:n,step:e,context:t,logger:r,flagStore:o,codeEvalTools:i,signal:a}){let s={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){r.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}s[l]=await Kn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:a,flagStore:o})}return s}catch(l){throw a?.throwIfAborted(),new R("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function wL({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let a=n.cacheConfig?.cacheExpiryMs;(!a||a===Cg)&&(a=n.defaultCacheTtl??Rg);let s;n.autoAuth?s=JSON.stringify(await t.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:r,ttlMs:a,truncatedCacheResultJson:Zg(s)},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:r,ttlMs:a})}async function yr(n,e,t){let r=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 R?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=gl(n,{},"FAILED");return l.message=s,l.startedAt=r,l.finishedAt=i,l}return{...zs(n),startedAt:r,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Sr(n,e){let t=!1;try{return n&&!n.state.failureRecoveryDisabled&&(n.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{n&&t&&(n.state.failureRecoveryDisabled=void 0)}}import{randomUUID as Ty}from"crypto";import{cloneDeep as xL}from"lodash-es";function fl(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var Sl=async n=>{let{step:e,tracer:t}=n.presetParams,{logger:r,controller:o,context:i,billingReporter:a}=n.fixtures,{collectDebugData:s}=n.options,{testMetadata:l,suiteMetadata:c}=n.inputs,d=e.command.type,p=r.child({commandType:d,stepId:e.id,commandId:e.command.id}),u=Qi(e.command);n.work.asyncTasks.push(a.reportCreditsUsed(p,d,u,{testId:l?.id,testName:l?.name,suiteId:c?.id,suiteName:c?.name}));let m=o.browser.url(),h=new Date,g,f=Ty(),S=Ty();if(s)try{g=await o.browser.screenshot({retries:1,clearHighlights:!0});let C=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:p,snapshotId:f,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(p,f,C))}catch(C){p.debug({err:C},"Failed to take screenshot before step, likely because the page is still loading. This is non-fatal and does not affect the test.")}let w,v,b,T=bs();try{let C=await o.executePresetCommand(T,t,e.command,i,l?.advanced.disableAICaching??!1);C.beforeScreenshotOverride&&(g=C.beforeScreenshotOverride),b=C.afterScreenshotOverride;let{proposedStep:A}=TL({work:n.work,step:e,newTargets:C.newTargets,logger:p}),k=new Date,L=o.browser.url();v={beforeUrl:m,afterUrl:L,startedAt:h,finishedAt:k,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},w={...e,message:C.thoughts??EL(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:L,finishedAt:k,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[v],details:T.details,proposedStep:A},"assertion"in e.command&&(w.message=C.thoughts||"Assertion passed.")}catch(C){p.error({message:C.message,stack:C.stack},`Failed executing preset step ${jr(e.command)}`);let A=o.browser.url(),k=new Date,L=C instanceof Error?C.message:`${C}`;C instanceof R&&C.getLastScreenshotBuffer()&&(b=C.getLastScreenshotBuffer()),v={beforeUrl:m,afterUrl:A,startedAt:h,finishedAt:k,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:L},w={...e,startedAt:h,finishedAt:k,beforeUrl:m,afterUrl:A,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:L,failureReason:C instanceof R?C.reason:void 0,results:[v],details:T.details}}if(s)try{b||(b=await o.browser.screenshot({retries:1}));let C=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:p,snapshotId:S,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(p,S,C))}catch(C){p.debug({err:C},"Failed store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return v.beforeSnapshot=f,w.beforeSnapshot=f,v.afterSnapshot=S,w.afterSnapshot=S,g&&(t.attachBeforeScreenshot({logger:p,snapshotId:f,screenshot:g}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(p,f,g))),b&&(t.attachAfterScreenshot({logger:p,snapshotId:S,screenshot:b}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(p,S,b))),w};function TL({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;Wg(o,t,r);let i=t[0]?.description;if(i&&"target"in o&&o.target&&o.target.type==="description"){let a={...o,target:{...o.target,elementDescriptor:i}},s={...xL(e),command:a};return fl(n,{type:"DESCRIPTION_UPDATE",thoughts:`Updated element description after the original element could not be found on the page. New element location reasoning: ${t[0]?.thoughts}`}),{proposedStep:s}}return{proposedStep:void 0}}function EL(n){if(n?.length){if(n.length===1&&n[0]?.thoughts)return n[0].thoughts;if(n.length===2&&n.every(e=>e.thoughts))return`Located first element: ${n[0]?.thoughts}
|
|
53
|
+
Located second element: ${n[1]?.thoughts}`}}async function Ey({codePath:n,screenshotBuff:e,storage:t,logger:r}){if(e)try{let o=await t.uploadScreenshot(e);return r.debug({screenshotUrl:o,codePath:n},"Saved screenshot for debugging"),o}catch(o){r.error({err:o,codePath:n},"Failed to save screenshot for debugging")}}async function On({frameConfig:n,action:e,browser:t}){let r=t.getActiveFrameConfig();n?t.setActiveFrameConfig(n):r?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(r)}}var CL=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Cy({beforeUrl:n,beforePages:e,browser:t,command:r,logger:o}){if(CL.includes(r.type))return;let s=("cache"in r&&r.cache&&"target"in r.cache?r.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,l=Date.now(),c=0;for(;c===0||Date.now()-l<s;){await ne(250),c++;let d=(await t.getOpenPages()).map(u=>u.url),p=t.url();if(d.length!==e.length)for(let u=d.length-1;u>=e.length;u--){let m=d[u];if(qr(m,o)&&m!==n&&m!==p){o.info({beforePages:e,afterPages:d,beforeUrl:n},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(u)});break}}}}var Ry="MOMENTIC_RUN_ID",Ay="FINAL_SCREENSHOT_URL";import{cloneDeep as kL}from"lodash-es";async function Iy(n){let{step:e,tracer:t}=n.conditionalParams,{logger:r,controller:o}=n.fixtures,i=new Date,a=zs(e),s=e.elseSteps,l=!0,c=[],d,p=bs();for(let f=0;f<e.blocks.length;f++){r.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let w=await Sl({...n,presetParams:{tracer:t,step:S.assertion}});c.push(w),r.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),l=!1,s=S.steps,d=w}catch(w){r.info({err:w},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(s)l&&r.info("No conditions resolved to true, executing the else block steps");else return r.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped"),{...a,status:"SUCCESS",startedAt:i,data:c[c.length-1]?.data,message:c[c.length-1]?.message,results:[],finishedAt:new Date,details:p.details};r.info(`Executing ${s.length} steps in the selected conditional block`);let u=await n.conditionalParams.tracer.startSubSteps(),m=await n.executeStepList({...n,listParams:{steps:s,containerName:"conditional block",tracer:u}}),g={...a,assertion:d,...m,startedAt:i,finishedAt:new Date};return rn({asyncTasks:n.work.asyncTasks,nestedResults:[...c,...m.results],result:g,logger:r}),g}import{randomUUID as Py}from"crypto";var Ly=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await RL(n);r.finishedAt=new Date,rn({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=Py();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let a=Py();return r.afterSnapshot=a,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,a,o)),r},RL=async n=>{let{step:e,tracer:t}=n.aiStepParams,{controller:r,context:o,logger:i}=n.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 R("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let l=await t.startSubSteps(),{status:c}=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:l}});return a.finishedAt=new Date,a.status=c,a}catch(l){i.warn({err:l},"Failed executing saved deprecated AI action steps");let c=r.executeAbortController.signal.aborted;a.message=l instanceof Error?l.message:`${l}`,a.status=c?"CANCELLED":"FAILED"}return a};import{randomUUID as rp}from"crypto";var Oy=15,AL=7,My=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await IL(n);r.finishedAt=new Date,rn({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=rp();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let a=rp();return r.afterSnapshot=a,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,a,o)),r},IL=async n=>{let{step:e,tracer:t}=n.aiStepParams,{testMetadata:r,orgId:o}=n.inputs,{controller:i,context:a,logger:s,codeEvalTools:l}=n.fixtures,{step:c}=n.callbacks,d=`${e.id}-${Date.now()}`,p=s.child({stepId:e.id,langfuseSessionId:d}),u={...e,startedAt:new Date,beforeTestContext:a.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await Ht({orgId:o,s:e.text,context:a,logger:p,localTools:l,flagStore:i.flagStore});await i.browser.waitForDOMStability({logger:p});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,w=0,v,b;for(;;){if(S>Oy)return u.message=`Exceeded the maximum number of commands allowed per AI step (${Oy})`,u.status="FAILED",u;if(i.executeAbortController.signal.aborted)return u.message="Test execution was cancelled",u.status="CANCELLED",u;c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let T=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:p,langfuseSessionId:d,lastError:b}),{evaluation:C,reasoning:A,summary:k}=T;p.info(T,"Got AI evaluation");let L=u.results[S-1]?.id;switch(C.type){case"DONE":return u.message=`Our AI evaluator confirmed all tasks are complete: ${A}`,u.status="SUCCESS",L&&c.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:`${k}
|
|
54
|
+
${A}`}),u;case"RIGHT_TRACK":{v=void 0,S===0?c.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:A}):L&&c.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:A});break}case"WRONG_TRACK":{if(v=`${A}
|
|
55
|
+
${C.feedback}`,w++,w>=AL)return u.message=`Our AI agent requires additional information to achieve this goal:
|
|
56
56
|
${A}
|
|
57
|
-
${C.feedback}`,u.status="FAILED",c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:u.message}),u;P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return u.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,u.status="FAILED",c.onDynamicAIActionEvaluatingEvent?.({stepId:P??e.id,status:"FAILED",message:u.message}),u}let H=setTimeout(()=>{c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);p.info({commandIndex:S,lastActionHint:v},`Generating new sub-command ${S} within AI action`);let F,O;try{({command:F,reasoning:O}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:r?.advanced.disableAICaching??!1,logger:p,actionHint:v,langfuseSessionId:d})),p.info({command:F,reasoning:O},"Got proposed command")}finally{clearTimeout(H)}if(F.type==="FAILURE")return clearTimeout(H),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${O}`,u;let B={id:Zd(),type:"PRESET_ACTION",command:F},L={substepIndex:S+1,message:O||"Generated new command."};c.onDynamicCommandGenerated?.({...L,step:B,parentStepId:e.id}),p.info({commandId:F.id},`Executing sub-command ${S} within AI step: ${zr(F)}`);let K=await t.startSubSteps(),J=(await n.executeStepList({...n,options:{...n.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[B],tracer:K}})).results[0];c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:p});let Z=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(J),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Z.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:zr(F),elementInteracted:J.results[0]?.elementInteracted,thoughts:O});let gt={substepIndex:S,output:{...J,message:J.message??"Successfully executed preset action."},step:B,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(gt),await t.finish({output:ns.parse(J),step:J,message:J.message}),J.status==="FAILED")if(u.status="FAILED",u.message=J.message,w<3)w++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${J.message}`;else return u;else if(J.status==="CANCELLED")return u.status="CANCELLED",u.message=J.message,u;S++}};async function Ty(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=fL(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await gL(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function vy({screenshot:n,controller:e,currentPageState:t,newStep:r,patch:o,logger:i}){if(r.aiSuggested=!0,r.type==="PRESET_ACTION"&&"cache"in r.command&&r.command.cache&&"target"in r.command.cache&&"target"in r.command&&r.command.target?.type==="description")try{let a=r.command.cache.target.id,s=await e.getReverseMappedDescription({browserState:t,targetId:a,disableCache:!1,screenshot:n});r.command.target.elementDescriptor=s}catch(a){i.error({err:a},"Error while reverse mapping target in failure recovery")}r.type==="PRESET_ACTION"&&(r.command.thoughts=o.thoughts)}async function gL(n){let{fixtures:e,work:t,failureRecoveryParams:r}=n,{controller:o,logger:i}=e,{results:a,failedStep:s,nextSteps:l,tracer:c}=r;if(!a.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")}`,u=(await o.browser.getBrowserState({skipWait:!0})).serialize(),{results:m}=await Is(i,e.debugDataStorage,a,{numScreenshots:3,addIndices:!0}),h=l.map(v=>dn(v)),g=await o.runFailureRecovery({currentUrl:d,currentScreenshot:p,failedResults:m,currentPageState:u,nextStepsSerialized:h});if(g.scenario==="INELIGIBLE"||!g.patch)return null;let f=[];if(g.patch.op==="add"){let v=g.patch.value;if(!v)throw new Error("No value in add patch in failure recovery");await vy({screenshot:p,controller:o,currentPageState:u,newStep:v,patch:g.patch,logger:i}),f=[v,s]}else if(g.patch.op==="replace"){let v=g.patch.value;if(!v)throw new Error("No value in replace patch in failure recovery");await vy({screenshot:p,controller:o,currentPageState:u,newStep:v,patch:g.patch,logger:i}),f=[v]}else if(g.patch.op==="remove"&&s.type==="PRESET_ACTION"&&["AI_ASSERTION","PAGE_CHECK","ELEMENT_CHECK"].includes(s.command.type))throw new Error("Cannot modify assertion step in failure recovery");let S=await c.startSubSteps(),w;if(f.length){w=await gr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let v of w.results)v.aiSuggested&&v.type==="PRESET_ACTION"&&(v.message=`AI suggested step: ${v.command.thoughts}`)}else w={status:"SUCCESS",results:[],proposedSteps:[]};return pl(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,w}function fL(n){if(!n)return"No failed result";if(n.type!=="PRESET_ACTION")return"Not a preset action";let e=n.message;return e?e.includes("AbortError:")?"AbortError":Nm.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function xy(n){let{step:e,tracer:t}=n.frameParams,{logger:r,controller:o}=n.fixtures,i=new Date,a=o.browser.getActiveFrameConfig();o.browser.setActiveFrameConfig(e.identifier);let s;try{let d=await t.startSubSteps();s=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"frame step list",tracer:d}})}finally{o.browser.setActiveFrameConfig(a)}let c={...e,...s,startedAt:i,finishedAt:new Date};return tn({asyncTasks:n.work.asyncTasks,nestedResults:s.results,result:c,logger:r}),c}import{randomUUID as ml}from"crypto";import SL from"fast-json-patch";import{cloneDeep as yL}from"lodash-es";async function Ey(n){let e=n.failedResults,t=[],{sectionParams:r,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:l}=n,{step:c}=r,{controller:d,logger:p,debugDataStorage:u}=o,m=c?.autohealingConfig,h=m?.restartBehavior??{type:"GO_TO_SECTION_START"},g=m?.attempts??1;for(let f=0;f<g;f++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let S=yL(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:w}=await Is(p,u,e.results,{numScreenshots:4}),v=await d.runSectionAutohealing({results:w,errorMessage:e.terminalResult?.message,goal:c.description});S=SL.applyPatch(S,v.patches).newDocument;let b=Rt.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await bL({logger:p,controller:d,tracer:l,context:b,restartConfig:h,startingUrl:a});let x=await gr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures,context:b},listParams:{steps:S,containerName:"auto-healed step list",tracer:l}}));if(t.push(x.results),x.status==="SUCCESS")return{successfulHealing:{proposedStep:{...c,steps:S},listResult:x,context:b},healingAttempts:t};e=x}return{healingAttempts:t}}async function bL({logger:n,controller:e,tracer:t,restartConfig:r,context:o,startingUrl:i}){switch(r.type){case"NAVIGATE_URL":{let a={id:ml(),type:"PRESET_ACTION",command:{id:ml(),type:"NAVIGATE",url:r.url}},s=await t.startStep({logger:n,step:a});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:ml(),type:"PRESET_ACTION",command:{id:ml(),type:"NAVIGATE",url:i}},s=await t.startStep({logger:n,step:a});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function Cy(n,e){switch(n||(n="ON_FAILURE"),n){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Du(e.command.type))}}async function Ry(n){let{step:e,tracer:t}=n.sectionParams,{logger:r,controller:o,context:i}=n.fixtures,a=new Date,s=o.browser.url(),l=i.toObjectCopy(),c=await t.startSubSteps(),d=async()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:"section step list",tracer:c}}),p=e.autohealingConfig?await gr(n.work,d):await d(),u,m;if(p.status==="FAILED"&&e.autohealingConfig&&!n.work.state.autoHealingDisabled&&Cy(e.autohealingConfig.trigger,p.terminalResult)){let g=await t.startSubSteps(),f=await Ey({...n,startingContextSnapshot:l,startingUrl:s,failedResults:p,tracer:g});f.successfulHealing&&(u=f.successfulHealing.proposedStep,p=f.successfulHealing.listResult,n.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...p,startedAt:a,finishedAt:new Date,proposedStep:u,healingAttempts:m};return tn({asyncTasks:n.work.asyncTasks,nestedResults:p.results,result:h,logger:r}),h}async function Ln(n){let{results:e=[],containerName:t,steps:r,tracer:o}=n.listParams,{logger:i,context:a,controller:s,codeEvalTools:l,billingReporter:c,analytics:d}=n.fixtures,p=o.getParentStepIdChain(),{orgId:u,fromStep:m,toStep:h}=n.inputs,g=n.work,f=[],S="SUCCESS",w,v=0;for(v;v<r.length;v++){let b=r[v],x,C=dn(b);if(b.skipped)continue;if(g.fastForwardingToStep&&m){let re=JSON.stringify(p);if(b.id===m.fromStepId&&re===JSON.stringify(m.parentStepIdChain))g.fastForwardingToStep=!1;else if(!Rg(b,p,m.fromStepId,m.parentStepIdChain))continue}let A=new Date,N=d.child({step_id:b.id});N.track({type:"execution:step_start",step_type:b.type==="RESOLVED_MODULE"?"MODULE":b.type,command_type:"command"in b?b.command.type:void 0}),i.info({step:b},`Executing step ${v+1}/${r.length} in ${t}: ${C}`);let P=await o.startStep({logger:i,step:b}),H=wL(b),F=a.toRedactedDisplayCopy(),O=s.browser.url(),B=s.executeAbortController.signal,L=Ji(b.type);g.asyncTasks.push(c.reportCreditsUsed(i,b.type,L,{testId:n.inputs.testMetadata?.id,testName:n.inputs.testMetadata?.name,suiteId:n.inputs.suiteMetadata?.id,suiteName:n.inputs.suiteMetadata?.name}));let K,U;switch(b.type){case"PRESET_ACTION":{K="Preset action",U=await fr(b,async()=>await ul({...n,presetParams:{tracer:P,step:b}}),B),"proposedStep"in U&&U.proposedStep&&(x=U.proposedStep,U.proposedStep=void 0);break}case"AI_ACTION":{K="AI action",U=await fr(b,()=>yy({...n,aiStepParams:{step:b,tracer:P},executeStepList:Ln}),B);break}case"AI_ACTION_DYNAMIC":{K="AI action",U=await fr(b,()=>wy({...n,aiStepParams:{step:b,tracer:P},executeStepList:Ln}),B);break}case"RESOLVED_MODULE":{K=`Module (${b.name})`,U=await fr(b,async()=>{let re=await dy({orgId:u,step:b,context:a,logger:i,flagStore:s.flagStore,codeEvalTools:l,signal:B});return Xd({...n,executeStepList:Ln,moduleParams:{step:b,resolvedInputs:re,tracer:P}})},B);break}case"CONDITIONAL":{K="Conditional step",U=await fr(b,()=>fy({...n,conditionalParams:{step:b,tracer:P},executeStepList:Ln}),B);break}case"IFRAME":{K="Frame step",U=await fr(b,()=>xy({...n,frameParams:{step:b,tracer:P},executeStepList:Ln}),B);break}case"SECTION":{K="Section";let re=await fr(b,()=>Ry({...n,sectionParams:{step:b,tracer:P},executeStepList:Ln}),B);"proposedStep"in re&&re.proposedStep&&(x=re.proposedStep,re.proposedStep=void 0),U=re;break}default:return(ve=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(b)}U.beforeUrl=U.beforeUrl??O,U.beforeTestContext=F,b.envKey&&a.setVariable(b.envKey,U.data);let J=s.browser.url();a.setCurrentUrl(J),U.afterUrl=U.afterUrl??J,U.afterTestContext=a.toRedactedDisplayCopy(),e.push(U),await vL({startedAt:A,stepTypeName:K,result:U,callbacks:n.callbacks,analytics:N,globalWorkRef:n.work,tracer:P});let Z;if(U.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let re=await Ty({...n,executeStepList:Ln,failureRecoveryParams:{failedStep:H,nextSteps:r.slice(v+1),results:e,tracer:P}});re&&re.status==="SUCCESS"&&(Z=re.proposedSteps,e.push(...re.results))}if(Z?f.push(...Z):x?f.push(x):f.push(b),g.fastForwardingToStep&&m&&m.fromStepId===b.id&&JSON.stringify(p)===JSON.stringify(m.parentStepIdChain)&&(g.fastForwardingToStep=!1),U.status!=="SUCCESS"&&!Z||s.closed){S=U.status,w=U;break}else if(h&&b.id===h.toStepId&&JSON.stringify(p)===JSON.stringify(h.parentStepIdChain)){s.setClosed();break}}return{status:S,results:e,terminalResult:w,proposedSteps:f}}async function vL({startedAt:n,stepTypeName:e,result:t,analytics:r,tracer:o}){let i=e.toLowerCase(),a=e.charAt(0).toUpperCase()+e.slice(1),s=new Date,l="";switch(t.status){case"SUCCESS":l=t.message??`${a} executed successfully.`,r.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-n.getTime()});break;case"FAILED":l=t.message??`${a} failed.`,r.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-n.getTime(),fail_reason:t.message??`${a} failed.`});break;case"CANCELLED":l=t.message??`${a} cancelled.`,r.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-n.getTime()});break;default:throw new Error(`Unexpected ${i} status: ${t.status}`)}await o.finish({step:t,message:l,output:ns.parse(t)})}import{randomUUID as Ay}from"crypto";async function Iy({browser:n,signal:e}){let t=new Date;try{return await n.navigate({url:n.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(r){let o={id:Ay(),type:"PRESET_ACTION",status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:r.message,startedAt:t,finishedAt:new Date,results:[],command:{id:Ay(),type:"NAVIGATE",url:n.baseUrl}};return{status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var hl=async n=>{let{orgId:e,runId:t,runAttemptId:r,testMetadata:o,steps:i,beforeSteps:a,afterSteps:s}=n.inputs;n.fixtures.logger=n.fixtures.logger.child({orgId:e,runId:t,runAttemptId:r,testId:o?.id}),n.fixtures.analytics=n.fixtures.analytics.child({run_id:t,test_id:o?.id,test_name:o?.name});let{logger:l,controller:c}=n.fixtures,{onTestComplete:d,onTestSuccess:p}=n.callbacks.test,u=ry(l);if(n.options.reinitializeBrowser){let h=await Iy({browser:c.browser,signal:c.executeAbortController.signal});if(h.status!=="PASSED")return await d?.(),clearInterval(u?.interval),h}let m;try{return l.info({platform:u?.platform,cpuMetadata:u?.cpuMetadata},`Starting run for Momentic test '${o?.name??"Unnamed test"}'`),m=await TL(n),m}finally{if(l.info({status:m?.status},"Momentic test final result"),clearInterval(u?.interval),await d?.(),m?.status==="PASSED")try{await p?.({steps:i,beforeSteps:a,afterSteps:s})}catch(h){l.warn({err:h},"Error running test success handler, continuing...")}}},TL=async n=>{let{tracer:e}=n.testParams,{runId:t,runAttemptId:r,testMetadata:o,fromStep:i,toStep:a,steps:s,beforeSteps:l,afterSteps:c,orgId:d}=n.inputs,{logger:p,controller:u,context:m,storage:h}=n.fixtures,{collectDebugData:g,disableHealing:f}=n.options;m.setCurrentUrl(u.browser.url());let S="test",w=s,v=[],b=f||i!==void 0||a!==void 0||void 0,x={results:v,state:{failureRecoveryDisabled:b,autoHealingDisabled:b},asyncTasks:[]},C=!1;i?.fromStepId&&i.fromStepId===a?.toStepId?(S="filtered step",x.fastForwardingToStep=!0):i?.fromStepId?(S="partial steps list from step",x.fastForwardingToStep=!0):a?S="partial steps list until step":(S="entire test",C=!0);let A;if(C&&l&&l.length>0){let{status:L,results:K}=await Py(l,"beforeSteps",n);if(L!=="PASSED")return g&&Ly({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:x,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:L}),x.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({beforeResults:K,results:[]}))),{status:L,beforeResults:K,results:[]}}p.debug({stepsToExecute:w,fromStep:i,toStep:a},`Starting step execution for ${S}`);let N=await e.startStepList(),{status:P,terminalResult:H,proposedSteps:F}=await Ln({...n,work:x,listParams:{steps:w,containerName:S,results:v,tracer:N}}),O;if(C&&c&&c.length>0){p.debug("Starting step execution for after step list");try{let{results:L}=await Py(c,"afterSteps",n);O=L}catch(L){p.error({err:L},"Failed to execute after steps list, continuing...")}}if(g&&Ly({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:x,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:P}),await Promise.allSettled(x.asyncTasks),x.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({results:v,beforeResults:A,afterResults:O}))),P==="FAILED")return{status:"FAILED",results:v,beforeResults:A,afterResults:O,failedStepResult:H};if(P==="CANCELLED")return{status:"CANCELLED",results:v,beforeResults:A,afterResults:O};let B;if(F&&x.state.healingDetails&&o){let L=DS(3);await n.callbacks.test.onProposedTestSteps?.({name:L,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:F,details:x.state.healingDetails,purpose:"AUTO_HEALING"}),B={orgId:n.inputs.orgId,name:L}}return{proposedTest:B,status:"PASSED",results:v,beforeResults:A,afterResults:O}};async function Py(n,e,t){let r=t.fixtures.logger,o=await t.testParams.tracer.startStepList();r.debug({stepsToExecute:n},`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0}},a={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0,onProposedTestSteps:void 0}},{status:s,results:l}=await Ln({...t,work:i,callbacks:a,listParams:{steps:n,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let c;return s==="SUCCESS"?c="PASSED":s==="CANCELLED"?c="CANCELLED":c="FAILED",{status:c,results:l}}function Ly({tracer:n,debugDataStorage:e,work:t,controller:r,storage:o,logger:i,context:a,runId:s,runAttemptId:l,status:c}){let d=r.browser.retrieveAndClearDebugData(),p=kg(d.logsPerPage),u=Kc(d.harPages||{},d.harEntries||{});n.attachConsoleLogs({logger:i,logs:p}),n.attachNetworkLogs({logger:i,logs:u}),t.asyncTasks.push((async()=>{try{let m=await r.browser.screenshot({}),h=await uy({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await _(r.browser.html(),{milliseconds:2e3});a.setVariable(gy,h),c!=="PASSED"&&c!=="SUCCESS"&&(i.debug({finalPageHtml:g},"Final page state HTML"),i.debug({finalScreenshotUrl:h},"Uploaded final screenshot URL"))}catch{}})(),l?e.storeConsoleLogsForRunAttempt(i,s,l,p):Promise.resolve(null),l?e.storeNetworkLogsForRunAttempt(i,s,l,u):Promise.resolve(null))}async function gl({settings:n,customHeaders:e,envVariables:t,envName:r,baseUrl:o,logger:i,localTools:a,orgId:s,flagStore:l}){let c=ls.parse(n);e&&(c.extraHeaders={...c.extraHeaders,...e});let d=new Rt({baseUrl:o,envName:r,variablesFromEnvironment:t,currentUrl:o});await ci({obj:c,context:d,bannedKeys:[],allowList:Um,localTools:a,logger:i,orgId:s,flagStore:l});try{return ls.parse(c)}catch(p){throw new R("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${p.message}`)}}import{cloneDeep as MM}from"lodash-es";var Oy={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/cache-generation.ts
|
|
57
|
+
${C.feedback}`,u.status="FAILED",c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:u.message}),u;L&&c.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"FAILED",message:C.feedback});break}case"IMPOSSIBLE":return u.message=`Our AI evaluator determined this task cannot be achieved: ${A}`,u.status="FAILED",c.onDynamicAIActionEvaluatingEvent?.({stepId:L??e.id,status:"FAILED",message:u.message}),u}let j=setTimeout(()=>{c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);p.info({commandIndex:S,lastActionHint:v},`Generating new sub-command ${S} within AI action`);let U,M;try{({command:U,reasoning:M}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:r?.advanced.disableAICaching??!1,logger:p,actionHint:v,langfuseSessionId:d})),p.info({command:U,reasoning:M},"Got proposed command")}finally{clearTimeout(j)}if(U.type==="FAILURE")return clearTimeout(j),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${M}`,u;let z={id:rp(),type:"PRESET_ACTION",command:U},O={substepIndex:S+1,message:M||"Generated new command."};c.onDynamicCommandGenerated?.({...O,step:z,parentStepId:e.id}),p.info({commandId:U.id},`Executing sub-command ${S} within AI step: ${jr(U)}`);let K=await t.startSubSteps(),J=(await n.executeStepList({...n,options:{...n.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[z],tracer:K}})).results[0];c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:p});let Z=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(J),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Z.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:jr(U),elementInteracted:J.results[0]?.elementInteracted,thoughts:M});let St={substepIndex:S,output:{...J,message:J.message??"Successfully executed preset action."},step:z,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(St),await t.finish({output:ls.parse(J),step:J,message:J.message}),J.status==="FAILED")if(u.status="FAILED",u.message=J.message,w<3)w++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${J.message}`;else return u;else if(J.status==="CANCELLED")return u.status="CANCELLED",u.message=J.message,u;S++}};async function ky(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=LL(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await PL(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function Ny({screenshot:n,controller:e,currentPageState:t,newStep:r,patch:o,logger:i}){if(r.aiSuggested=!0,r.type==="PRESET_ACTION"&&"cache"in r.command&&r.command.cache&&"target"in r.command.cache&&"target"in r.command&&r.command.target?.type==="description")try{let a=r.command.cache.target.id,s=await e.getReverseMappedDescription({browserState:t,targetId:a,disableCache:!1,screenshot:n});r.command.target.elementDescriptor=s}catch(a){i.error({err:a},"Error while reverse mapping target in failure recovery")}r.type==="PRESET_ACTION"&&(r.command.thoughts=o.thoughts)}async function PL(n){let{fixtures:e,work:t,failureRecoveryParams:r}=n,{controller:o,logger:i}=e,{results:a,failedStep:s,nextSteps:l,tracer:c}=r;if(!a.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")}`,u=(await o.browser.getBrowserState({skipWait:!0})).serialize(),{results:m}=await ks(i,e.debugDataStorage,a,{numScreenshots:3,addIndices:!0}),h=l.map(v=>un(v)),g=await o.runFailureRecovery({currentUrl:d,currentScreenshot:p,failedResults:m,currentPageState:u,nextStepsSerialized:h});if(g.scenario==="INELIGIBLE"||!g.patch)return null;let f=[];if(g.patch.op==="add"){let v=g.patch.value;if(!v)throw new Error("No value in add patch in failure recovery");await Ny({screenshot:p,controller:o,currentPageState:u,newStep:v,patch:g.patch,logger:i}),f=[v,s]}else if(g.patch.op==="replace"){let v=g.patch.value;if(!v)throw new Error("No value in replace patch in failure recovery");await Ny({screenshot:p,controller:o,currentPageState:u,newStep:v,patch:g.patch,logger:i}),f=[v]}else if(g.patch.op==="remove"&&s.type==="PRESET_ACTION"&&["AI_ASSERTION","PAGE_CHECK","ELEMENT_CHECK"].includes(s.command.type))throw new Error("Cannot modify assertion step in failure recovery");let S=await c.startSubSteps(),w;if(f.length){w=await Sr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let v of w.results)v.aiSuggested&&v.type==="PRESET_ACTION"&&(v.message=`AI suggested step: ${v.command.thoughts}`)}else w={status:"SUCCESS",results:[],proposedSteps:[]};return fl(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,w}function LL(n){if(!n)return"No failed result";if(n.type!=="PRESET_ACTION")return"Not a preset action";let e=n.message;return e?e.includes("AbortError:")?"AbortError":Hm.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function _y(n){let{step:e,tracer:t}=n.frameParams,{logger:r,controller:o}=n.fixtures,i=new Date,a=o.browser.getActiveFrameConfig();o.browser.setActiveFrameConfig(e.identifier);let s;try{let d=await t.startSubSteps();s=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"frame step list",tracer:d}})}finally{o.browser.setActiveFrameConfig(a)}let c={...e,...s,startedAt:i,finishedAt:new Date};return rn({asyncTasks:n.work.asyncTasks,nestedResults:s.results,result:c,logger:r}),c}import{randomUUID as yl}from"crypto";import OL from"fast-json-patch";import{cloneDeep as ML}from"lodash-es";async function Dy(n){let e=n.failedResults,t=[],{sectionParams:r,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:l}=n,{step:c}=r,{controller:d,logger:p,debugDataStorage:u}=o,m=c?.autohealingConfig,h=m?.restartBehavior??{type:"GO_TO_SECTION_START"},g=m?.attempts??1;for(let f=0;f<g;f++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let S=ML(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:w}=await ks(p,u,e.results,{numScreenshots:4}),v=await d.runSectionAutohealing({results:w,errorMessage:e.terminalResult?.message,goal:c.description});S=OL.applyPatch(S,v.patches).newDocument;let b=It.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await NL({logger:p,controller:d,tracer:l,context:b,restartConfig:h,startingUrl:a});let T=await Sr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures,context:b},listParams:{steps:S,containerName:"auto-healed step list",tracer:l}}));if(t.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...c,steps:S},listResult:T,context:b},healingAttempts:t};e=T}return{healingAttempts:t}}async function NL({logger:n,controller:e,tracer:t,restartConfig:r,context:o,startingUrl:i}){switch(r.type){case"NAVIGATE_URL":{let a={id:yl(),type:"PRESET_ACTION",command:{id:yl(),type:"NAVIGATE",url:r.url}},s=await t.startStep({logger:n,step:a});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:yl(),type:"PRESET_ACTION",command:{id:yl(),type:"NAVIGATE",url:i}},s=await t.startStep({logger:n,step:a});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function Fy(n,e){switch(n||(n="ON_FAILURE"),n){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Gu(e.command.type))}}async function Uy(n){let{step:e,tracer:t}=n.sectionParams,{logger:r,controller:o,context:i}=n.fixtures,a=new Date,s=o.browser.url(),l=i.toObjectCopy(),c=await t.startSubSteps(),d=async()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:"section step list",tracer:c}}),p=e.autohealingConfig?await Sr(n.work,d):await d(),u,m;if(p.status==="FAILED"&&e.autohealingConfig&&!n.work.state.autoHealingDisabled&&Fy(e.autohealingConfig.trigger,p.terminalResult)){let g=await t.startSubSteps(),f=await Dy({...n,startingContextSnapshot:l,startingUrl:s,failedResults:p,tracer:g});f.successfulHealing&&(u=f.successfulHealing.proposedStep,p=f.successfulHealing.listResult,n.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...p,startedAt:a,finishedAt:new Date,proposedStep:u,healingAttempts:m};return rn({asyncTasks:n.work.asyncTasks,nestedResults:p.results,result:h,logger:r}),h}async function Mn(n){let{results:e=[],containerName:t,steps:r,tracer:o}=n.listParams,{logger:i,context:a,controller:s,codeEvalTools:l,billingReporter:c,analytics:d}=n.fixtures,p=o.getParentStepIdChain(),{orgId:u,fromStep:m,toStep:h}=n.inputs,g=n.work,f=[],S="SUCCESS",w,v=0;for(v;v<r.length;v++){let b=r[v],T,C=un(b);if(b.skipped)continue;if(g.fastForwardingToStep&&m){let re=JSON.stringify(p);if(b.id===m.fromStepId&&re===JSON.stringify(m.parentStepIdChain))g.fastForwardingToStep=!1;else if(!Ug(b,p,m.fromStepId,m.parentStepIdChain))continue}let A=new Date,k=d.child({step_id:b.id});k.track({type:"execution:step_start",step_type:b.type==="RESOLVED_MODULE"?"MODULE":b.type,command_type:"command"in b?b.command.type:void 0}),i.info({step:b},`Executing step ${v+1}/${r.length} in ${t}: ${C}`);let L=await o.startStep({logger:i,step:b}),j=kL(b),U=a.toRedactedDisplayCopy(),M=s.browser.url(),z=s.executeAbortController.signal,O=Zi(b.type);g.asyncTasks.push(c.reportCreditsUsed(i,b.type,O,{testId:n.inputs.testMetadata?.id,testName:n.inputs.testMetadata?.name,suiteId:n.inputs.suiteMetadata?.id,suiteName:n.inputs.suiteMetadata?.name}));let K,B;switch(b.type){case"PRESET_ACTION":{K="Preset action",B=await yr(b,async()=>await Sl({...n,presetParams:{tracer:L,step:b}}),z),"proposedStep"in B&&B.proposedStep&&(T=B.proposedStep,B.proposedStep=void 0);break}case"AI_ACTION":{K="AI action",B=await yr(b,()=>Ly({...n,aiStepParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"AI_ACTION_DYNAMIC":{K="AI action",B=await yr(b,()=>My({...n,aiStepParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"RESOLVED_MODULE":{K=`Module (${b.name})`,B=await yr(b,async()=>{let re=await xy({orgId:u,step:b,context:a,logger:i,flagStore:s.flagStore,codeEvalTools:l,signal:z});return np({...n,executeStepList:Mn,moduleParams:{step:b,resolvedInputs:re,tracer:L}})},z);break}case"CONDITIONAL":{K="Conditional step",B=await yr(b,()=>Iy({...n,conditionalParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"IFRAME":{K="Frame step",B=await yr(b,()=>_y({...n,frameParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"SECTION":{K="Section";let re=await yr(b,()=>Uy({...n,sectionParams:{step:b,tracer:L},executeStepList:Mn}),z);"proposedStep"in re&&re.proposedStep&&(T=re.proposedStep,re.proposedStep=void 0),B=re;break}default:return(Te=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(b)}B.beforeUrl=B.beforeUrl??M,B.beforeTestContext=U,b.envKey&&a.setVariable(b.envKey,B.data);let J=s.browser.url();a.setCurrentUrl(J),B.afterUrl=B.afterUrl??J,B.afterTestContext=a.toRedactedDisplayCopy(),e.push(B),await _L({startedAt:A,stepTypeName:K,result:B,callbacks:n.callbacks,analytics:k,globalWorkRef:n.work,tracer:L});let Z;if(B.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let re=await ky({...n,executeStepList:Mn,failureRecoveryParams:{failedStep:j,nextSteps:r.slice(v+1),results:e,tracer:L}});re&&re.status==="SUCCESS"&&(Z=re.proposedSteps,e.push(...re.results))}if(Z?f.push(...Z):T?f.push(T):f.push(b),g.fastForwardingToStep&&m&&m.fromStepId===b.id&&JSON.stringify(p)===JSON.stringify(m.parentStepIdChain)&&(g.fastForwardingToStep=!1),B.status!=="SUCCESS"&&!Z||s.closed){S=B.status,w=B;break}else if(h&&b.id===h.toStepId&&JSON.stringify(p)===JSON.stringify(h.parentStepIdChain)){s.setClosed();break}}return{status:S,results:e,terminalResult:w,proposedSteps:f}}async function _L({startedAt:n,stepTypeName:e,result:t,analytics:r,tracer:o}){let i=e.toLowerCase(),a=e.charAt(0).toUpperCase()+e.slice(1),s=new Date,l="";switch(t.status){case"SUCCESS":l=t.message??`${a} executed successfully.`,r.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-n.getTime()});break;case"FAILED":l=t.message??`${a} failed.`,r.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-n.getTime(),fail_reason:t.message??`${a} failed.`});break;case"CANCELLED":l=t.message??`${a} cancelled.`,r.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-n.getTime()});break;default:throw new Error(`Unexpected ${i} status: ${t.status}`)}await o.finish({step:t,message:l,output:ls.parse(t)})}import{randomUUID as By}from"crypto";async function zy({browser:n,signal:e}){let t=new Date;try{return await n.navigate({url:n.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(r){let o={id:By(),type:"PRESET_ACTION",status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:r.message,startedAt:t,finishedAt:new Date,results:[],command:{id:By(),type:"NAVIGATE",url:n.baseUrl}};return{status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var bl=async n=>{let{orgId:e,runId:t,runAttemptId:r,testMetadata:o,steps:i,beforeSteps:a,afterSteps:s}=n.inputs;n.fixtures.logger=n.fixtures.logger.child({orgId:e,runId:t,runAttemptId:r,testId:o?.id}),n.fixtures.analytics=n.fixtures.analytics.child({run_id:t,test_id:o?.id,test_name:o?.name});let{logger:l,controller:c}=n.fixtures,{onTestComplete:d,onTestSuccess:p}=n.callbacks.test,u=gy(l);if(n.options.reinitializeBrowser){let h=await zy({browser:c.browser,signal:c.executeAbortController.signal});if(h.status!=="PASSED")return await d?.(),clearInterval(u?.interval),h}let m;try{return l.info({platform:u?.platform,cpuMetadata:u?.cpuMetadata},`Starting run for Momentic test '${o?.name??"Unnamed test"}'`),m=await DL(n),m}finally{if(l.info({status:m?.status},"Momentic test final result"),clearInterval(u?.interval),await d?.(),m?.status==="PASSED")try{await p?.({steps:i,beforeSteps:a,afterSteps:s})}catch(h){l.warn({err:h},"Error running test success handler, continuing...")}}},DL=async n=>{let{tracer:e}=n.testParams,{runId:t,runAttemptId:r,testMetadata:o,fromStep:i,toStep:a,steps:s,beforeSteps:l,afterSteps:c,orgId:d}=n.inputs,{logger:p,controller:u,context:m,storage:h}=n.fixtures,{collectDebugData:g,disableHealing:f}=n.options;m.setCurrentUrl(u.browser.url());let S="test",w=s,v=[],b=f||i!==void 0||a!==void 0||void 0,T={results:v,state:{failureRecoveryDisabled:b,autoHealingDisabled:b},asyncTasks:[]},C=!1;i?.fromStepId&&i.fromStepId===a?.toStepId?(S="filtered step",T.fastForwardingToStep=!0):i?.fromStepId?(S="partial steps list from step",T.fastForwardingToStep=!0):a?S="partial steps list until step":(S="entire test",C=!0);let A;if(C&&l&&l.length>0){let{status:O,results:K}=await Hy(l,"beforeSteps",n);if(O!=="PASSED")return g&&jy({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:T,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:O}),T.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({beforeResults:K,results:[]}))),{status:O,beforeResults:K,results:[]}}p.debug({stepsToExecute:w,fromStep:i,toStep:a},`Starting step execution for ${S}`);let k=await e.startStepList(),{status:L,terminalResult:j,proposedSteps:U}=await Mn({...n,work:T,listParams:{steps:w,containerName:S,results:v,tracer:k}}),M;if(C&&c&&c.length>0){p.debug("Starting step execution for after step list");try{let{results:O}=await Hy(c,"afterSteps",n);M=O}catch(O){p.error({err:O},"Failed to execute after steps list, continuing...")}}if(g&&jy({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:T,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:L}),await Promise.allSettled(T.asyncTasks),T.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({results:v,beforeResults:A,afterResults:M}))),L==="FAILED")return{status:"FAILED",results:v,beforeResults:A,afterResults:M,failedStepResult:j};if(L==="CANCELLED")return{status:"CANCELLED",results:v,beforeResults:A,afterResults:M};let z;if(U&&T.state.healingDetails&&o){let O=KS(3);await n.callbacks.test.onProposedTestSteps?.({name:O,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:U,details:T.state.healingDetails,purpose:"AUTO_HEALING"}),z={orgId:n.inputs.orgId,name:O}}return{proposedTest:z,status:"PASSED",results:v,beforeResults:A,afterResults:M}};async function Hy(n,e,t){let r=t.fixtures.logger,o=await t.testParams.tracer.startStepList();r.debug({stepsToExecute:n},`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{autoHealingDisabled:!0,failureRecoveryDisabled:!0}},a={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0,onProposedTestSteps:void 0}},{status:s,results:l}=await Mn({...t,work:i,callbacks:a,listParams:{steps:n,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let c;return s==="SUCCESS"?c="PASSED":s==="CANCELLED"?c="CANCELLED":c="FAILED",{status:c,results:l}}function jy({tracer:n,debugDataStorage:e,work:t,controller:r,storage:o,logger:i,context:a,runId:s,runAttemptId:l,status:c}){let d=r.browser.retrieveAndClearDebugData(),p=Vg(d.logsPerPage),u=Qc(d.harPages||{},d.harEntries||{});n.attachConsoleLogs({logger:i,logs:p}),n.attachNetworkLogs({logger:i,logs:u}),t.asyncTasks.push((async()=>{try{let m=await r.browser.screenshot({}),h=await Ey({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await D(r.browser.html(),{milliseconds:2e3});a.setVariable(Ay,h),c!=="PASSED"&&c!=="SUCCESS"&&(i.debug({finalPageHtml:g},"Final page state HTML"),i.debug({finalScreenshotUrl:h},"Uploaded final screenshot URL"))}catch{}})(),l?e.storeConsoleLogsForRunAttempt(i,s,l,p):Promise.resolve(null),l?e.storeNetworkLogsForRunAttempt(i,s,l,u):Promise.resolve(null))}async function wl({settings:n,customHeaders:e,envVariables:t,envName:r,baseUrl:o,logger:i,localTools:a,orgId:s,flagStore:l}){let c=hs.parse(n);e&&(c.extraHeaders={...c.extraHeaders,...e});let d=new It({baseUrl:o,envName:r,variablesFromEnvironment:t,currentUrl:o});await pi({obj:c,context:d,bannedKeys:[],allowList:Vm,localTools:a,logger:i,orgId:s,flagStore:l});try{return hs.parse(c)}catch(p){throw new R("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${p.message}`)}}import{cloneDeep as VM}from"lodash-es";var $y={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/cache-generation.ts
|
|
58
58
|
function generateHtmlCacheAttributes(ele, opts) {
|
|
59
59
|
const customWindow = window;
|
|
60
60
|
if (!customWindow.generateCssSelectors || !customWindow.serializeElementWithContext || !customWindow.serializeElementOnlyWithText) {
|
|
@@ -3778,59 +3778,59 @@ function registerAllMomenticListeners() {
|
|
|
3778
3778
|
|
|
3779
3779
|
// src/html/index.ts
|
|
3780
3780
|
registerAllMomenticListeners();
|
|
3781
|
-
`};import{execSync as JO}from"child_process";import{randomUUID as Fb}from"crypto";import{existsSync as Rl,mkdirSync as XO,readFileSync as ZO,writeFileSync as QO}from"fs";import{Jimp as Ub}from"jimp";import eM from"js-beautify";import{cloneDeep as tM}from"lodash-es";var My={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(My);var Ny=My;var ky={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(ky);var _y=ky;var nn=function(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)},di,Ra,Qr,Qd=class{constructor(...e){di.set(this,new Map),Ra.set(this,new Map),Qr.set(this,new Map);for(let t of e)this.define(t)}define(e,t=!1){for(let[r,o]of Object.entries(e)){r=r.toLowerCase(),o=o.map(s=>s.toLowerCase()),nn(this,Qr,"f").has(r)||nn(this,Qr,"f").set(r,new Set);let i=nn(this,Qr,"f").get(r),a=!0;for(let s of o){let l=s.startsWith("*");if(s=l?s.slice(1):s,i?.add(s),a&&nn(this,Ra,"f").set(r,s),a=!1,l)continue;let c=nn(this,di,"f").get(s);if(c&&c!=r&&!t)throw new Error(`"${r} -> ${s}" conflicts with "${c} -> ${s}". Pass \`force=true\` to override this definition.`);nn(this,di,"f").set(s,r)}}return this}getType(e){if(typeof e!="string")return null;let t=e.replace(/^.*[/\\]/,"").toLowerCase(),r=t.replace(/^.*\./,"").toLowerCase(),o=t.length<e.length;return!(r.length<t.length-1)&&o?null:nn(this,di,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&nn(this,Ra,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:nn(this,Qr,"f").get(e.toLowerCase())??null}_freeze(){this.define=()=>{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let e of nn(this,Qr,"f").values())Object.freeze(e);return this}_getTestState(){return{types:nn(this,di,"f"),extensions:nn(this,Ra,"f")}}};di=new WeakMap,Ra=new WeakMap,Qr=new WeakMap;var ep=Qd;var Dy=new ep(_y,Ny)._freeze();import{homedir as Cp,hostname as nM,platform as rM}from"os";import{basename as oM,extname as iM,join as mi,resolve as aM}from"path";import{chromium as zb,devices as sM}from"playwright";import{addExtra as lM}from"playwright-extra";import cM from"puppeteer-extra-plugin-recaptcha";import{v4 as dM}from"uuid";import{rmSync as xb}from"fs";import{basename as xO,join as EO}from"path";import{errors as CO}from"playwright-core";var qn={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-aria-hidden","data-hidden","data-automation-id","data-overlay","data-content-editable-leaf","data-wf-icon","data-tns","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],stronglyIdentifyingAttributes:["aria-label","data-testid","id","name","href","aria-labelledby","aria-description"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"]};var EL=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),CL=new Set(["a","e","i","o","u","y"]);function Fy(n){if(n.length>75)return!1;if(n[0]?.match(/[0-9a-zA-Z]/)===null)return!0;if(n.length>10){let u=Math.floor(n.length/8);if((n.match(/[-_:A-Z/ ]/g)??[]).length<u)return!0}if((n.match(/[^0-9a-zA-Z-_.]/g)??[]).length/n.length>.2)return!0;let t=(n.match(/[0-9]/g)??[]).length;if(t/n.length>.3)return!0;let r=(n.toLowerCase().match(/[aeiou]/gi)??[]).length;if((n.toLowerCase().match(/[bcdfghjklmnpqrstvwxyz]/gi)??[]).length/r>5)return!0;let i=0,a=0;for(let u of n.toLowerCase())EL.has(u)?(a++,a>i&&(i=a)):a=0;if(i>4)return!0;let s=0,l=0;for(let u of n.toLowerCase())u>="a"&&u<="z"&&!CL.has(u)?(l++,l>s&&(s=l)):l=0;if(s>4)return!0;let c=(n.match(/[A-Z]/g)??[]).length,d=(n.match(/[a-z]/g)??[]).length,p=Math.ceil(n.length*.3);return!!(d&&t&&Math.abs(d-t)<p||d&&c&&Math.abs(d-c)<p)}function Uy(n,e,t){if(n.length<t)return n;let r=n.indexOf(e);if(r===-1)return n;let o=Math.max(0,r-t/3),i=Math.min(r+t/3,n.length),a=n.indexOf(`
|
|
3781
|
+
`};import{execSync as dM}from"child_process";import{randomUUID as Yb}from"crypto";import{existsSync as Ol,mkdirSync as pM,readFileSync as uM,writeFileSync as mM}from"fs";import{Jimp as Jb}from"jimp";import hM from"js-beautify";import{cloneDeep as gM}from"lodash-es";var Gy={"application/prs.cww":["cww"],"application/prs.xsf+xml":["xsf"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["*xfdf"],"application/vnd.age":["age"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["*fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["*mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.pwg-xhtml-print+xml":["xhtm"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml","uo"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["*prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["*sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["*aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif","btf"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.cld":["cld"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.pytha.pyox":["pyo","pyox"],"model/vnd.sap.vds":["vds"],"model/vnd.usda":["usda"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.familysearch.gedcom":["ged"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};Object.freeze(Gy);var Wy=Gy;var Vy={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(Vy);var qy=Vy;var on=function(n,e,t,r){if(t==="a"&&!r)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?n!==e||!r:!e.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?r:t==="a"?r.call(n):r?r.value:e.get(n)},ui,La,to,op=class{constructor(...e){ui.set(this,new Map),La.set(this,new Map),to.set(this,new Map);for(let t of e)this.define(t)}define(e,t=!1){for(let[r,o]of Object.entries(e)){r=r.toLowerCase(),o=o.map(s=>s.toLowerCase()),on(this,to,"f").has(r)||on(this,to,"f").set(r,new Set);let i=on(this,to,"f").get(r),a=!0;for(let s of o){let l=s.startsWith("*");if(s=l?s.slice(1):s,i?.add(s),a&&on(this,La,"f").set(r,s),a=!1,l)continue;let c=on(this,ui,"f").get(s);if(c&&c!=r&&!t)throw new Error(`"${r} -> ${s}" conflicts with "${c} -> ${s}". Pass \`force=true\` to override this definition.`);on(this,ui,"f").set(s,r)}}return this}getType(e){if(typeof e!="string")return null;let t=e.replace(/^.*[/\\]/,"").toLowerCase(),r=t.replace(/^.*\./,"").toLowerCase(),o=t.length<e.length;return!(r.length<t.length-1)&&o?null:on(this,ui,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&on(this,La,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:on(this,to,"f").get(e.toLowerCase())??null}_freeze(){this.define=()=>{throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances")},Object.freeze(this);for(let e of on(this,to,"f").values())Object.freeze(e);return this}_getTestState(){return{types:on(this,ui,"f"),extensions:on(this,La,"f")}}};ui=new WeakMap,La=new WeakMap,to=new WeakMap;var ip=op;var Ky=new ip(qy,Wy)._freeze();import{homedir as Lp,hostname as fM,platform as SM}from"os";import{basename as yM,extname as bM,join as gi,resolve as wM}from"path";import{chromium as Zb,devices as vM}from"playwright";import{addExtra as xM}from"playwright-extra";import TM from"puppeteer-extra-plugin-recaptcha";import{v4 as EM}from"uuid";import{rmSync as _b}from"fs";import{basename as FO,join as UO}from"path";import{errors as BO}from"playwright-core";var Yn={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-aria-hidden","data-hidden","data-automation-id","data-overlay","data-content-editable-leaf","data-wf-icon","data-tns","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],stronglyIdentifyingAttributes:["aria-label","data-testid","id","name","href","aria-labelledby","aria-description"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"]};var UL=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),BL=new Set(["a","e","i","o","u","y"]);function Yy(n){if(n.length>75)return!1;if(n[0]?.match(/[0-9a-zA-Z]/)===null)return!0;if(n.length>10){let u=Math.floor(n.length/8);if((n.match(/[-_:A-Z/ ]/g)??[]).length<u)return!0}if((n.match(/[^0-9a-zA-Z-_.]/g)??[]).length/n.length>.2)return!0;let t=(n.match(/[0-9]/g)??[]).length;if(t/n.length>.3)return!0;let r=(n.toLowerCase().match(/[aeiou]/gi)??[]).length;if((n.toLowerCase().match(/[bcdfghjklmnpqrstvwxyz]/gi)??[]).length/r>5)return!0;let i=0,a=0;for(let u of n.toLowerCase())UL.has(u)?(a++,a>i&&(i=a)):a=0;if(i>4)return!0;let s=0,l=0;for(let u of n.toLowerCase())u>="a"&&u<="z"&&!BL.has(u)?(l++,l>s&&(s=l)):l=0;if(s>4)return!0;let c=(n.match(/[A-Z]/g)??[]).length,d=(n.match(/[a-z]/g)??[]).length,p=Math.ceil(n.length*.3);return!!(d&&t&&Math.abs(d-t)<p||d&&c&&Math.abs(d-c)<p)}function Jy(n,e,t){if(n.length<t)return n;let r=n.indexOf(e);if(r===-1)return n;let o=Math.max(0,r-t/3),i=Math.min(r+t/3,n.length),a=n.indexOf(`
|
|
3782
3782
|
`,o);a>0&&a<r&&(o=a);let s=i,l=0;for(;l<1e3&&s>r&&n[s]!==`
|
|
3783
3783
|
`;)l++,s--;return s>r&&n[s]===`
|
|
3784
|
-
`&&(i=s),n.slice(o,i)}import{randomUUID as _L}from"crypto";import{cloneDeep as ip}from"lodash-es";import{randomUUID as OL}from"crypto";var By=new Set(["about:blank","chrome-error://chromewebdata/"]);var Mt="data-momentic-id";var tp=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],np=1e4,Aa=500;function Sr(n,e){let t=n.findIndex(r=>r===e);if(!(t===-1||!n[t+1]))return n[t+1]}import{createHash as RL}from"crypto";var AL="v1";function fl(n,e){if(n.tagName.toLowerCase()==="svg"&&!PL(n))try{let t=zy(n,e),r=IL(JSON.stringify(t));return{version:AL,json:t,hash:r}}catch{return}}function IL(n){return RL("md5").update(n).digest("hex")}function zy(n,e){let t=n.tagName.toLowerCase(),r=LL(n);if(t==="image"&&r["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:r,children:[]};for(let i of n.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=zy(a,e);s&&o.children.push(s)}}return o}function PL(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function LL(n){let e={},t=n.attributes;for(let r of Object.keys(t))qn.visualAttributesForSvgSerialization.includes(r)&&(e[r]=t[r]);return t.id&&n.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var eo={r:147,g:196,b:125,a:.55},jy={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:eo,paddingColor:eo,borderColor:eo,marginColor:eo,eventTargetColor:eo,shapeColor:eo,shapeMarginColor:eo,showInfo:!0,showAccessibilityInfo:!0},Sl=["display","opacity","visibility","height","position"];function Gy({snapshot:n,devicePixelRatio:e,logger:t}){let r=n.strings,o=n.documents,i={},a={},s={roots:[],backendIdToNode:i,frameIndexToIframeNode:a};return o.forEach((l,c)=>{let d=ML({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:a,logger:t});s.roots.push(d)}),s}function ML({allDocuments:n,stringConstants:e,devicePixelRatio:t,frameIndex:r,frameIndexToIframeNode:o,backendIdToNode:i,logger:a}){let s=n[r],l=s.layout,c={};l.nodeIndex.forEach((C,A)=>{c[C]=A});let d=l.styles,p=l.bounds??[],u=s.nodes,m=u.contentDocumentIndex??{index:[],value:[]},h=u.backendNodeId??[],g=u.attributes??[],f=u.parentIndex??[],S=u.nodeName??[],w=u.nodeType??[],v=u.pseudoType??{index:[],value:[]},b=u.inputChecked??{index:[]},x=e[s.frameId];for(let C=0;C<h.length;C++){let A=h[C],N=w[C],P=g[C]??[],H=f[C]!==void 0&&f[C]>=0?f[C]:void 0,F=H!==void 0?h[H]:void 0,O=F!==void 0?i[F]:void 0,B=v.index.indexOf(C),L=B!==-1?e[v.value[B]]:void 0,K=c[C],U;K?U=p[K]??[]:U=[];let J=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!J){a.warn({backendNodeId:A,frameId:x,frameIndex:r,nodeBounds:U},"DOM node has no tag name");continue}let Z={backendNodeId:A,psuedoType:L,nodeType:N,frameIndex:r,parentFrameId:x,ownedFrameId:void 0,bounds:{x:U[0]??null,y:U[1]??null,width:U[2]??null,height:U[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:F??null,tagName:J,parent:O??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};O&&O.childrenBackendIds.push(A);let gt=m.index.indexOf(C);if(gt!==-1){let ve=m.value[gt];o[ve]=Z;let Oe=n[ve]?.frameId;Z.ownedFrameId=Oe!==void 0?e[Oe]:void 0}for(let ve of Object.keys(Z.bounds)){let Oe=ve;Z.bounds[Oe]!==null&&(Z.bounds[Oe]/=t)}let re=K!==void 0?d[K]??[]:[];for(let ve=0;ve<re.length&&!(ve>=Sl.length);ve++){let Oe=re[ve];if(Oe===void 0||isNaN(Oe))continue;let _t=e[Oe];if(_t===void 0)continue;let an=Sl[ve];Z.computedStyles[an]=_t}for(let ve=0;ve<P.length;ve+=2){let Oe=P[ve],_t=P[ve+1];if(!Oe||!_t)continue;let an=e[Oe],Dn=e[_t];!an||!Dn||(Z.attributes[an]=Dn)}b.index.includes(C)&&(Z.attributes.checked="true"),i[Z.backendNodeId]=Z}return i[h[0]]}function op(n,e){if(n.mPathSelector)return n.mPathSelector;let t=n.parent,r;if(!t)r=n.tagName;else if(n.tagName==="body")r="body";else{let i=t.childrenBackendIds.filter(l=>e.backendIdToNode[l]?.nodeType===1&&!e.backendIdToNode[l]?.psuedoType).indexOf(n.backendNodeId),a=` > ${n.tagName}:nth-child(${i+1})`;r=`${op(t,e)}${a}`}return n.mPathSelector=r,r}function Hy({originalNode:n,candidate:e,logKey:t,logger:r}){if(!e.bounds)return r.debug({candidate:e},"Filtering out click candidate since it has no bounding box"),!1;let o=n.bounds,i=o.x??0,a=o.width??0,s=o.height??0,l=i+a,c=o.y??0,d=c+(o.height??0),p=e.bounds,u=p.width??0,m=p.height??0,h=p.x??0,g=h+(p.width??0),f=p.y??0,S=f+(p.height??0);return h<l&&g>i&&f<d&&S>c?Math.abs(a-u)<200||Math.abs(s-m)<200?!0:(Ur({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(Ur({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e},"Filtering out click candidate since it does not intersect with the original node"),!1)}function yl(n,e,t){let r=Object.values(e.backendIdToNode),o,i=OL();for(let c of r)if(c.attributes?.[Mt]===n){o=c;break}if(!o)return[];let a=[],s=e.backendIdToNode[o.parentBackendNodeId??-1];for(;s&&(s?.momenticIgnored||!Hy({originalNode:o,candidate:s,logKey:i,logger:t}));)s=e.backendIdToNode[s.parentBackendNodeId??-1];s&&a.push(s);let l=[o];for(;l.length;){let c=l.shift();for(let d of c.childrenBackendIds??[]){let p=e.backendIdToNode[d];p&&!p.momenticIgnored&&Hy({originalNode:o,candidate:p,logKey:i,logger:t})?a.push(p):p&&l.push(p)}}return a}function $y(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var NL=["html","#document","#document-fragment"];function Wy({node:n,domGraph:e}){let t=[],r=n,o=$y(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=$y(o,e),!o&&r.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,NL.includes(r.tagName)){i();continue}if(r.tagName==="body")t.push("body");else{let l=!1,c=1;for(let d=0;d<o.childrenBackendIds.length;d++){let p=o.childrenBackendIds[d],u=e.backendIdToNode[p];if(p===r.backendNodeId){t.push(`${r.tagName}:nth-child(${c})`),l=!0;break}else u?.nodeType===1&&!u.psuedoType&&c++}if(!l)throw new Error(`Could not find child (${r.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function Vy(n,e){let t=n.locator("html"),r=[];for(let o=0;o<e.length;o++){let i=e[o];if(r.push(i),i.startsWith("iframe")){let a=r.join(" > ");r=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(r.length&&(t=t.locator(r.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function qy(n,e){await n.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let t=await n.send({method:"DOM.requestNode",params:{objectId:e},timeout:2e3}),o=(await n.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:2e3})).attributes,i=Sr(o,Mt);if(!i)throw new Error(`Could not find attribute ${Mt} for object ${e}`);return i}function Ky(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=kL({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function kL(n){let{root:e,domGraph:t,existingHashes:r}=n,o=[],i=[e];for(;i.length;){let a=i.pop();if(a.nodeType===1&&a.tagName.toLowerCase()==="svg"){let s=fl(a,t);s&&!r[s.hash]&&o.push(s)}for(let s of a.childrenBackendIds){let l=t.backendIdToNode[s];l&&i.push(l)}}return o}var DL=["focusable","keyshortcuts","controls","live","relevant","orientation"],FL=["selected","readonly","modal","required","invalid"],UL=["id","name","role","content"],Yy=["absolute","fixed","sticky"],BL=["path"],zL=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator"],Zy=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],Qy=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],HL=["menulistpopup","statictext","inlinetextbox"],$L=80,Jy=100,bl=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],jL=["cite"],GL={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},WL={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},Xy={indentLevel:0},ap=class n{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;pathFromRoot;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&!Fy(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),YL(this.properties,e.domNode)}XL(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(){if(this.domNode&&this.domNode.tagName==="div"&&!this.domNode.bounds.x&&!this.domNode.bounds.y&&!this.domNode.bounds.width&&!this.domNode.bounds.height||this.domNode&&BL.includes(this.domNode.tagName))return!1;if(zL.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(t=>Qy.includes(t)))return!1;if(this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||qn.alwaysInterestingTruthyPropertyNames.some(t=>!!this.properties[t]))return!0;let e=this.properties.class;return typeof e=="string"&&e.split(" ").some(t=>rb(t))?!0:this.children.every(t=>t.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(t=>t.role==="StaticText")?!0:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(t=>t.startsWith("data"))}serialize(e=Xy){let t=Object.assign({},Xy,e),{indentLevel:r,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:l}=t,c=ip(this.properties),d=" ".repeat(r),p=this.role||"",u=this.tagName??"unknown",m=this.name;p==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(x=>!x.superseded&&x.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(x=>!x.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let x=g.attributeValue?.relatedNodes??[];x.length===1&&x[0].text&&x[0].text===m&&(m="")}let f=bl.includes(this.role)||jL.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${d}${m}
|
|
3785
|
-
`;let S=`${d}<${u}`;!a&&!f&&(S+=` id="${this.id}"`);let w=s??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(w=!0),p&&p!=="generic"&&p!==u&&!(
|
|
3786
|
-
`;else{let
|
|
3784
|
+
`&&(i=s),n.slice(o,i)}import{randomUUID as YL}from"crypto";import{cloneDeep as dp}from"lodash-es";import{randomUUID as WL}from"crypto";var Xy=new Set(["about:blank","chrome-error://chromewebdata/"]);var kt="data-momentic-id";var ap=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],sp=1e4,Oa=500;function br(n,e){let t=n.findIndex(r=>r===e);if(!(t===-1||!n[t+1]))return n[t+1]}import{createHash as zL}from"crypto";var HL="v1";function vl(n,e){if(n.tagName.toLowerCase()==="svg"&&!$L(n))try{let t=Zy(n,e),r=jL(JSON.stringify(t));return{version:HL,json:t,hash:r}}catch{return}}function jL(n){return zL("md5").update(n).digest("hex")}function Zy(n,e){let t=n.tagName.toLowerCase(),r=GL(n);if(t==="image"&&r["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:r,children:[]};for(let i of n.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=Zy(a,e);s&&o.children.push(s)}}return o}function $L(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function GL(n){let e={},t=n.attributes;for(let r of Object.keys(t))Yn.visualAttributesForSvgSerialization.includes(r)&&(e[r]=t[r]);return t.id&&n.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var no={r:147,g:196,b:125,a:.55},tb={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:no,paddingColor:no,borderColor:no,marginColor:no,eventTargetColor:no,shapeColor:no,shapeMarginColor:no,showInfo:!0,showAccessibilityInfo:!0},xl=["display","opacity","visibility","height","position"];function nb({snapshot:n,devicePixelRatio:e,logger:t}){let r=n.strings,o=n.documents,i={},a={},s={roots:[],backendIdToNode:i,frameIndexToIframeNode:a};return o.forEach((l,c)=>{let d=VL({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:a,logger:t});s.roots.push(d)}),s}function VL({allDocuments:n,stringConstants:e,devicePixelRatio:t,frameIndex:r,frameIndexToIframeNode:o,backendIdToNode:i,logger:a}){let s=n[r],l=s.layout,c={};l.nodeIndex.forEach((C,A)=>{c[C]=A});let d=l.styles,p=l.bounds??[],u=s.nodes,m=u.contentDocumentIndex??{index:[],value:[]},h=u.backendNodeId??[],g=u.attributes??[],f=u.parentIndex??[],S=u.nodeName??[],w=u.nodeType??[],v=u.pseudoType??{index:[],value:[]},b=u.inputChecked??{index:[]},T=e[s.frameId];for(let C=0;C<h.length;C++){let A=h[C],k=w[C],L=g[C]??[],j=f[C]!==void 0&&f[C]>=0?f[C]:void 0,U=j!==void 0?h[j]:void 0,M=U!==void 0?i[U]:void 0,z=v.index.indexOf(C),O=z!==-1?e[v.value[z]]:void 0,K=c[C],B;K?B=p[K]??[]:B=[];let J=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!J){a.warn({backendNodeId:A,frameId:T,frameIndex:r,nodeBounds:B},"DOM node has no tag name");continue}let Z={backendNodeId:A,psuedoType:O,nodeType:k,frameIndex:r,parentFrameId:T,ownedFrameId:void 0,bounds:{x:B[0]??null,y:B[1]??null,width:B[2]??null,height:B[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:U??null,tagName:J,parent:M??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};M&&M.childrenBackendIds.push(A);let St=m.index.indexOf(C);if(St!==-1){let Te=m.value[St];o[Te]=Z;let Me=n[Te]?.frameId;Z.ownedFrameId=Me!==void 0?e[Me]:void 0}for(let Te of Object.keys(Z.bounds)){let Me=Te;Z.bounds[Me]!==null&&(Z.bounds[Me]/=t)}let re=K!==void 0?d[K]??[]:[];for(let Te=0;Te<re.length&&!(Te>=xl.length);Te++){let Me=re[Te];if(Me===void 0||isNaN(Me))continue;let Ft=e[Me];if(Ft===void 0)continue;let ln=xl[Te];Z.computedStyles[ln]=Ft}for(let Te=0;Te<L.length;Te+=2){let Me=L[Te],Ft=L[Te+1];if(!Me||!Ft)continue;let ln=e[Me],Un=e[Ft];!ln||!Un||(Z.attributes[ln]=Un)}b.index.includes(C)&&(Z.attributes.checked="true"),i[Z.backendNodeId]=Z}return i[h[0]]}function cp(n,e){if(n.mPathSelector)return n.mPathSelector;let t=n.parent,r;if(!t)r=n.tagName;else if(n.tagName==="body")r="body";else{let i=t.childrenBackendIds.filter(l=>e.backendIdToNode[l]?.nodeType===1&&!e.backendIdToNode[l]?.psuedoType).indexOf(n.backendNodeId),a=` > ${n.tagName}:nth-child(${i+1})`;r=`${cp(t,e)}${a}`}return n.mPathSelector=r,r}function Qy({originalNode:n,candidate:e,logKey:t,logger:r}){if(!e.bounds)return r.debug({candidate:e},"Filtering out click candidate since it has no bounding box"),!1;let o=n.bounds,i=o.x??0,a=o.width??0,s=o.height??0,l=i+a,c=o.y??0,d=c+(o.height??0),p=e.bounds,u=p.width??0,m=p.height??0,h=p.x??0,g=h+(p.width??0),f=p.y??0,S=f+(p.height??0);return h<l&&g>i&&f<d&&S>c?Math.abs(a-u)<200||Math.abs(s-m)<200?!0:(zr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(zr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e},"Filtering out click candidate since it does not intersect with the original node"),!1)}function Tl(n,e,t){let r=Object.values(e.backendIdToNode),o,i=WL();for(let c of r)if(c.attributes?.[kt]===n){o=c;break}if(!o)return[];let a=[],s=e.backendIdToNode[o.parentBackendNodeId??-1];for(;s&&(s?.momenticIgnored||!Qy({originalNode:o,candidate:s,logKey:i,logger:t}));)s=e.backendIdToNode[s.parentBackendNodeId??-1];s&&a.push(s);let l=[o];for(;l.length;){let c=l.shift();for(let d of c.childrenBackendIds??[]){let p=e.backendIdToNode[d];p&&!p.momenticIgnored&&Qy({originalNode:o,candidate:p,logKey:i,logger:t})?a.push(p):p&&l.push(p)}}return a}function eb(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var qL=["html","#document","#document-fragment"];function rb({node:n,domGraph:e}){let t=[],r=n,o=eb(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=eb(o,e),!o&&r.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,qL.includes(r.tagName)){i();continue}if(r.tagName==="body")t.push("body");else{let l=!1,c=1;for(let d=0;d<o.childrenBackendIds.length;d++){let p=o.childrenBackendIds[d],u=e.backendIdToNode[p];if(p===r.backendNodeId){t.push(`${r.tagName}:nth-child(${c})`),l=!0;break}else u?.nodeType===1&&!u.psuedoType&&c++}if(!l)throw new Error(`Could not find child (${r.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function ob(n,e){let t=n.locator("html"),r=[];for(let o=0;o<e.length;o++){let i=e[o];if(r.push(i),i.startsWith("iframe")){let a=r.join(" > ");r=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(r.length&&(t=t.locator(r.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function ib(n,e){await n.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let t=await n.send({method:"DOM.requestNode",params:{objectId:e},timeout:2e3}),o=(await n.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:2e3})).attributes,i=br(o,kt);if(!i)throw new Error(`Could not find attribute ${kt} for object ${e}`);return i}function ab(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=KL({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function KL(n){let{root:e,domGraph:t,existingHashes:r}=n,o=[],i=[e];for(;i.length;){let a=i.pop();if(a.nodeType===1&&a.tagName.toLowerCase()==="svg"){let s=vl(a,t);s&&!r[s.hash]&&o.push(s)}for(let s of a.childrenBackendIds){let l=t.backendIdToNode[s];l&&i.push(l)}}return o}var JL=["focusable","keyshortcuts","controls","live","relevant","orientation"],XL=["selected","readonly","modal","required","invalid"],ZL=["id","name","role","content"],sb=["absolute","fixed","sticky"],QL=["path"],eO=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator"],db=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],pb=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],tO=["menulistpopup","statictext","inlinetextbox"],nO=80,lb=100,El=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],rO=["cite"],oO={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},iO={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},cb={indentLevel:0},pp=class n{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;pathFromRoot;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&!Yy(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),cO(this.properties,e.domNode)}pO(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(){if(this.domNode&&this.domNode.tagName==="div"&&!this.domNode.bounds.x&&!this.domNode.bounds.y&&!this.domNode.bounds.width&&!this.domNode.bounds.height||this.domNode&&QL.includes(this.domNode.tagName))return!1;if(eO.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(t=>pb.includes(t)))return!1;if(this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Yn.alwaysInterestingTruthyPropertyNames.some(t=>!!this.properties[t]))return!0;let e=this.properties.class;return typeof e=="string"&&e.split(" ").some(t=>gb(t))?!0:this.children.every(t=>t.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(t=>t.role==="StaticText")?!0:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(t=>t.startsWith("data"))}serialize(e=cb){let t=Object.assign({},cb,e),{indentLevel:r,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:l}=t,c=dp(this.properties),d=" ".repeat(r),p=this.role||"",u=this.tagName??"unknown",m=this.name;p==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(T=>!T.superseded&&T.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(T=>!T.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let T=g.attributeValue?.relatedNodes??[];T.length===1&&T[0].text&&T[0].text===m&&(m="")}let f=El.includes(this.role)||rO.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${d}${m}
|
|
3785
|
+
`;let S=`${d}<${u}`;!a&&!f&&(S+=` id="${this.id}"`);let w=s??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(w=!0),p&&p!=="generic"&&p!==u&&!(oO[p]??[]).includes(u)&&(S+=` role=${JSON.stringify(p)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!w&&(S+=` content=${JSON.stringify(this.content)}`);let v=Date.now();if(Object.keys(c).length>0&&!i){if(Date.now()-v>1e3)throw new Error(`Serialization for the HTML element with tag ${u} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(c).forEach(([T,C])=>{if(!JL.includes(T)){{if(XL.includes(T)&&(!C||C==="false"))return;if(T==="value"&&w&&(c.type==="text"||this.role==="textbox"))return;if(T==="level"&&`${C}`=="1")return;if(T==="url"&&c.src&&u==="img")return;if(T==="url"&&c.href&&u==="a")return;if(T==="editable"&&C==="plaintext")return;if(T==="type"&&C===u)return;if(l&&!iO[T])return}typeof C=="string"?S+=` ${T}="${ze(C,lb,!0)}"`:typeof C=="boolean"?C?S+=` ${T}`:S+=` ${T}={false}`:typeof C<"u"&&(S+=` ${T}={${ze(JSON.stringify(C),lb,!0)}}`)}})}if(u==="::before"||u==="::after"){let T="";for(let C of this.children)T+=C.serialize({...e,indentLevel:r,neighbors:0});return T}let b=e.maxLevel!==void 0&&r/2>=e.maxLevel;if(this.children.length===0||o||b)S+=` />
|
|
3786
|
+
`;else{let T="";for(let A of this.children)T+=A.serialize({...e,indentLevel:r+2,neighbors:0});let C=T.trim();C.length<=nO&&!C.includes(`
|
|
3787
3787
|
`)?S+=`>${C}</${u}>
|
|
3788
3788
|
`:S+=`>
|
|
3789
|
-
${
|
|
3790
|
-
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let
|
|
3789
|
+
${T}${d}</${u}>
|
|
3790
|
+
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let T=this.parent.children.findIndex(k=>k.id===this.id),C=T>0?this.parent.children[T-1]?.serialize({...e,neighbors:0}):"",A=T<this.parent.children.length-1?this.parent.children[T+1]?.serialize({...e,neighbors:0}):"";return`${C||""}
|
|
3791
3791
|
${S}
|
|
3792
|
-
${A||""}`}return S}shallowClone(){let e=new n({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:ip(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=ip(this.properties),e}},sp=class n{constructor(e,t,r,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=r;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function r(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,l=i.shallowClone(),c=i.children,d=!1,p=[];for(let u of c){let m=r(u,s||d);m&&(p.push(m),m.parent=l,d=!0)}if(l.children=p,s||d)return l;if(bl.includes(i.role)&&a)return l}let o=r(t);return new n(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function VL(n){return n.name?.value?`"${n.name.value}"`:n.role?.value&&n.role.value!=="none"&&n.role.value!=="generic"?`"${n.role.value}"`:`"${n.nodeId}"`}function qL(n,e,t,r){return n.bounds.x===null||n.bounds.y===null||n.bounds.height===null||n.bounds.width===null||n.bounds.width===0||n.bounds.height===0?!0:n.bounds.x+n.bounds.width<e.leftBound||n.bounds.x>e.rightBound?(Ur({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport horizontally"),!1):n.bounds.y+n.bounds.height<e.upperBound||n.bounds.y>e.lowerBound?(Ur({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport vertically"),!1):n.computedStyles.display==="none"?(t.debug({domNode:n},"Filtering out node since it has display none"),!1):!0}async function eb({node:n,parent:e,frameId:t,frameContext:r,axGraph:o,domGraph:i,inputNodeMap:a,showZeroOpacityElements:s,filterByViewport:l,viewportDetails:c,useMPaths:d,cdpClient:p,logger:u,callId:m}){if(!e&&n.parentId)throw new Error(`Got no parent for accessibility node ${n.nodeId}: ${JSON.stringify(n)}`);let h=(O,B={})=>{},g=n.backendDOMNodeId,f=HL.includes((n.role?.value).toLowerCase());if(!f&&g===void 0)return h("Filtering out node since it doesn't exist in the DOM"),[];let S=g?i.backendIdToNode[g]:void 0;if(!f&&!S)try{let O=await _(p.send({method:"DOM.describeNode",params:{backendNodeId:g}}),{milliseconds:750,fallback:()=>{u.debug("Timeout getting node from CDP while processing a11y tree")}});if(O&&O.node.nodeName.toLowerCase()==="slot"&&O.node.distributedNodes?.length)u.debug({redirectedDomNode:S,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:n,cdpResult:O},"Redirecting node to assigned slot");else return h("Filtering out node since it doesn't exist in the DOM",{cdpResult:O}),[]}catch(O){return h("Filtering out node since it doesn't exist in the DOM",{err:O}),[]}if(S&&e&&l&&c&&n.backendDOMNodeId&&!qL(S,c,u,m))return S.momenticIgnored=!0,[];if(S&&S.computedStyles.display==="none")return u.debug({domNode:S},"Filtering out node since it has display none"),S.momenticIgnored=!0,[];if(S&&!s&&S.computedStyles.opacity==="0")return S.momenticIgnored=!0,[];if(S&&S.attributes.tabindex==="-1"&&S.tagName.toLowerCase()==="input"&&(S.bounds.width??0)<10&&(S.bounds.height??0)<10)return Ur({logger:u,logKey:m,maxCount:5,intervalMs:3e3},{attributes:S.attributes},"Filtering out node since it is likely an invisible input that is non-interactive"),S.momenticIgnored=!0,[];let w=n.name?.value?typeof n.name.value=="string"?n.name.value:`${n.name.value}`:"",v=n.value?.value?typeof n.value.value=="string"?n.value.value:`${n.value.value}`:"",b=new ap({domNode:S,id:parseInt(n.nodeId),role:n.role?.value||"",name:w,nameSources:n.name?.sources,content:v,properties:n.properties,children:[],ignoredReasons:n.ignoredReasons?.filter(O=>Zy.includes(O.name)||Qy.includes(O.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+VL(n),backendNodeID:n.backendDOMNodeId,ignoredByCDP:n.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:r.type==="root"?void 0:r}),x=r,C=a[t],A=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let O=r.childFrames.find(K=>K.frameId===S.ownedFrameId),B=o[O?.frameId??""]?.root,L=a[O?.frameId??""];if(O&&B&&L){n.childIds&&n.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let K=B;n.childIds=K.childIds,x=O,C=L,A=O.frameId}}let N=S?.childrenBackendIds?.length??0,P=n.childIds?.length??0;if(N>P){let O=n.childIds?.map(L=>C.get(parseInt(L))).filter(Boolean).map(L=>L?.backendDOMNodeId).filter(L=>L!==void 0)??[],B=0;for(let L of S?.childrenBackendIds??[]){if(O.includes(L)){B=(n.childIds?.findIndex(gt=>C.get(parseInt(gt))?.backendDOMNodeId===L)??0)+1;continue}let K=i.backendIdToNode[L];if(!K||K?.tagName.toLowerCase()!=="svg")continue;let U=Math.floor(-1*Math.random()*1e7),J={nodeId:U.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:L,frameId:A,role:{type:"string",value:"graphics-symbol"}};C.set(U,J),n.childIds||(n.childIds=[]),n.childIds.splice(B,0,U.toString()),B++}}for(let O of n.childIds??[]){if(!O)continue;let B=C.get(parseInt(O));if(!B)continue;let L=await eb({node:B,parent:b,domGraph:i,axGraph:o,frameId:A,frameContext:x,inputNodeMap:a,cdpClient:p,logger:u,callId:m,filterByViewport:l,showZeroOpacityElements:s,viewportDetails:c,useMPaths:d});L.length&&(b.children=b.children.concat(L))}if(b.role==="StaticText"&&(b.children=[]),b.children.length===1&&b.children[0].role==="StaticText"){let O=b.name,B=b.children[0]?.name;(O===B||!B)&&(b.children=[])}let H=[];for(let O=b.children.length-1;O>=0;O--){let B=b.children[O];if(B.role!=="StaticText"){H.push(B);continue}if(O===0||b.children[O-1].role!=="StaticText"){H.push(B);continue}b.children[O-1].name+=B.name}if(b.children=H.reverse(),b.role==="generic"&&b.children.length===1){let O=b.children[0];if(b.name&&!bl.includes(O.role)&&b.name===O.name)return S&&(S.momenticIgnored=!0),b.children}if(!b.isInteresting()&&n.parentId)return S&&(S.momenticIgnored=!0),b.children;for(let O of b.children)O.parent=b;return JL(b),S&&d&&op(S,i),[b]}function tb({node:n,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:l,startId:c=1}){n.id=c,c+=1,e[n.id]=n,n.dataMomenticId?t[n.dataMomenticId]=n:bl.includes(n.role);let d=n.backendNodeId,p=d!==void 0?i.backendIdToNode[d]:void 0;if(a&&p&&p.mPathSelector&&(s[p.mPathSelector]=n),l&&p&&p.tagName?.toLowerCase()==="svg"){let u=fl(p,i),m=u?l[u.hash]:void 0,h=m?m.description:void 0;m&&(n.properties["data-momentic-description"]=h)}for(let u of n.children)c=tb({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:l});return c}async function nb({rawA11yGraph:n,domGraph:e,startingFrameId:t,logger:r,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,viewportDetails:s,useMPaths:l,frameContext:c,iconKnowledgeBase:d}){let p=t??"root",u=n[p]?.root;if(!u)throw new Error("A11y tree has no root");let m=_L(),h=b=>{let x=b.allNodes.filter(A=>!A.ignoredReasons?.find(P=>Zy.includes(P.name))),C=new Map;return x.forEach(A=>{C.set(parseInt(A.nodeId),A)}),C},g={};Object.entries(n).forEach(([b,x])=>{g[b]=h(x)});let f=await eb({node:u,domGraph:e,parent:null,inputNodeMap:g,axGraph:n,frameId:p,frameContext:c,cdpClient:o,logger:r,callId:m,showZeroOpacityElements:a,filterByViewport:i,viewportDetails:s,useMPaths:l});if(f.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(f)}`);if(f.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let S={},w={},v={};return tb({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:w,selectorToNodeMap:v,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:d}),new sp(f[0],S,w,v)}function KL(n,e,t){if(n==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(i=>i.length<50&&!qn.bannedClassSubstrings.some(a=>i.includes(a))).slice(0,3).join(" ");let r=e.split(" "),o=[];for(let i of r)if(rb(i)){o.push(i);continue}return o.length?o.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let r=parseInt(e);if(!isNaN(r))return r}catch{}return n==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function YL(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,a])=>{if(qn.relevantElementAttributes.includes(i)&&!UL.includes(i)&&!n[i]&&!i.startsWith("aria")){let s=KL(i,a,e);s!==null&&(n[i]=s)}});let t,r=[];if(e.computedStyles.position&&Yy.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of Yy)if(e.attributes.style.includes(`position: ${i}`)){t=i;break}}t&&r.push(`position: ${t}`);let o;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(o="opacity: 0"),o&&r.push(o),r.length>0&&(n.style=r.join("; "))}function JL(n){let e=n.properties.class;if(typeof e=="string"&&e.includes("cm-content")){n.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){n.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),n.children.length>0&&(n.children[n.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(n.tagName==="table"){let i=[],a=n.children.find(l=>l.tagName==="thead");if(a){let l=a.children.find(c=>c.tagName==="tr");if(l){let c=l.children.filter(d=>d.tagName==="th");c.forEach((d,p)=>{d.properties["col-index"]||(d.properties["col-index"]=p+1),i?.push(ze(d.name,100,!1))}),i?.length!==c.length&&(i=void 0)}}let s=0;for(let l of n.children)if(l.tagName==="tbody")for(let c=0;c<l.children.length;c++){let d=l.children[c];if(d.tagName!=="tr")continue;if(c===0&&!i?.length){let m=d.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>ze(h.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,d.properties["row-index"]||(d.properties["row-index"]=s);let p=d.children.filter(m=>m.tagName==="td"||m.tagName==="th"),u=p.length===i?.length;p.forEach((m,h)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=h+1),u&&(m.properties.col||(m.properties.col=i[h])))})}}}function XL(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function rb(n){if(qn.bannedClassSubstrings.some(e=>n.includes(e)))return!1;if(qn.alwaysInterestingClassNames.includes(n))return!0;for(let e of qn.alwaysInterestingClassPrefixes)if(n.startsWith(e))return!0;return!1}var wl=class n{constructor(e,t,r,o,i){this.session=e;this.logger=t;this.contextGetter=r;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:r,defaultTimeoutMs:o}){let i=t(),a=r(),s,l;for(let d=0;d<2;d++)try{s=await _(i.newCDPSession(a),{milliseconds:o*d,fallback:()=>{throw new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(p){await te(500),l=p}if(!s)throw l;let c=new n(s,e,t,r,o);try{await _(c.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(d){throw c.cdpFullyDead=!0,new R("UserInfrastructureError",`Failed to initialize CDP client: ${d}`)}return c}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 e.send("Accessibility.enable"),await e.send("Page.enable"),await e.send("DOM.enable"),await e.send("Overlay.enable"),await e.send("DOMSnapshot.enable"),await e.send("CSS.enable")}async send({method:e,params:t,timeout:r=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await _(this.cdpInitializingPromise,{milliseconds:r});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new R("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 _(this.session.send(e,t),{milliseconds:r,message:o??`Chrome command ${e} timed out after ${r}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,r=this.pageGetter(),o=await _(this.contextGetter().newCDPSession(r),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${r.url()})`),new R("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${r.url()})`)}});return this.logger.debug(`Created new CDP session for ${r.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 _(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 _(t.detach(),{milliseconds:1e3})}catch(r){this.logger.warn({err:r},"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}};import{mkdirSync as ZL,rmSync as ob,statSync as QL}from"fs";import*as dp from"node:fs";import eO from"nodejs-file-downloader";import{tmpdir as tO}from"os";import yr,{basename as nO,dirname as rO}from"path";var pp="file://",cp=yr.join(tO(),"momentic","downloads"),lp=1e4,oO=50*1024*1024;async function ib(n){let{uri:e}=n;return e.startsWith(pp)?aO(n):e.startsWith("http")?lO(n):sO(n)}function iO(n,e){let t=yr.join(cp,n,e.slice(pp.length)),r=yr.join(cp,n),o=t.startsWith(r);if(!dp.existsSync(t)||!o)throw new R("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function aO({uri:n,orgId:e}){let t=iO(e,n);return{filePath:t,cleanup:()=>{ob(rO(t),{recursive:!0,force:!0})}}}async function sO({uri:n}){let e=yr.resolve(n);if(!dp.existsSync(e))throw new R("UserConfigurationError",`The referenced file (${n}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function lO({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=nO(r.href),i=mp(o),a=yr.extname(i);if(xh.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=up(t),l=new eO({url:n,fileName:i,directory:s,maxAttempts:2,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:lp}),{downloadStatus:c,filePath:d}=await _(l.download(),{milliseconds:lp,message:`Download timed out after ${lp}ms`});if(c!=="COMPLETE")throw new Error(`Download ended in non-success status: ${c}`);if(!d)throw new Error("File path of successfully downloaded file was empty");let u=QL(d).size;if(u>oO)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:u,filePath:d,fileName:i},"Downloaded file to disk");let m;return{filePath:d,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>ob(s,{recursive:!0,force:!0}),10*60*1e3)}}}function ab(n,e){return`${pp}${n}/${e}`}function up(n){let e=Math.random().toString(36).substring(4),t=yr.join(cp,n,e);return ZL(t,{recursive:!0}),t}function mp(n){let e=yr.extname(n),t=yr.basename(n,e);return n=(t.length>100?t.slice(t.length-100):t)+e,n=n.trim().replaceAll(" ","_"),n}async function Sn(n,e){try{return await n.evaluate(r=>window.serializeElementOnlyWithText?.(r,{truncateToLength:500}),void 0,{timeout:1e3})}catch(t){e.debug({err:t},"Failed to get HTML from locator for Playwright error translation");return}}async function sb(n,e){let t=n.evaluate(async()=>{let i=window,a={};try{let s=await indexedDB.databases();for(let l of s){if(!l.name)continue;let c=await i.exportIdbToObject?.(l.name,l.version);c&&(a[l.name]=c)}return[a,void 0]}catch(s){return[void 0,s.message]}}),[r,o]=await _(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),r}async function lb(n,e,t){if(e){t.debug("Importing indexedDB data");try{let r=n.evaluate(async o=>{let i=window;for(let[a,s]of Object.entries(o))await i.importObjectToIdb?.(a,s)},e);await _(r,{milliseconds:3e3})}catch(r){t.warn({err:r},"Failed to import indexedDB data")}}}async function cb(n,e){try{let t=n.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(r=>{r.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await _(t,{milliseconds:3e3})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function db(n,e,t,r,o){try{await cO(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function cO(n,e,t,r){let o=r.text();o.length>Aa&&(o=o.slice(0,Aa)+"...(TRUNCATED)");let i=[];for(let a of r.args())try{let s=await a.jsonValue(),l=JSON.stringify(s);l.length>Aa?i.push(l.slice(0,Aa)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}hp(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function hp(n,e,t,r){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let a=0;a<t;a++)i[a]===void 0&&(i[a]=[])}i[t].length>np&&(i[t]=i[t].slice(Math.floor(np/2)),i[t]?.push({url:n.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...r,tabIndex:t,timestamp:o})}async function rn({fn:n,codePath:e,logObject:t,signal:r,logger:o}){r?.throwIfAborted();let i=Date.now(),a=await ra({promiseGenerator:n,signal:r,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import{randomUUID as dO}from"crypto";var pO="[redacted due to size]",uO=1e4;async function gb(n,e,t){let r=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[n]={id:n,startedDateTime:r,title:void 0,pageTimings:{}}}async function fb(n,e,t,r){try{await mO(n,e,t)}catch(o){o.message.includes("browser has been closed")||r.warn({err:o,pageId:n},"Error handling new network request, skipping...")}}function to(n){return n<0?0:n}function pb(n){return{timings:{blocked:to(n.domainLookupStart),dns:to(n.domainLookupEnd-n.domainLookupStart),connect:to(n.connectEnd-n.connectStart),send:to(n.responseStart-n.requestStart),wait:0,receive:to(n.responseEnd-n.responseStart),ssl:to(n.connectEnd-n.secureConnectionStart)},total:to(n.responseEnd)}}async function mO(n,e,t){let r=dO(),o=t.timing(),i=new URL(t.url()),a=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),s={...await hb(t),url:i.toString(),method:t.method(),queryString:a,postData:await gO(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:s,timings:pb(o).timings};ub(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await fO(c)}catch{}let g={...await hb(c),status:c.status(),statusText:c.statusText(),content:h,redirectURL:c.headers().location};l.response=g}let d;try{d=await t.sizes(),l.request.bodySize=d.requestBodySize,l.request.headersSize=d.requestHeadersSize}catch{}l.response&&d&&(l.response.bodySize=d.responseBodySize,l.response.headersSize=d.responseHeadersSize,l.response.content.size=d.responseBodySize);let p=t.timing(),{timings:u,total:m}=pb(p);l.time=m,l.timings=u,ub(e,l,r)}function ub(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function mb(n){try{return new Date(n).toISOString()}catch{return}}function hO(n){let e={name:"",value:""},t=!0;for(let r of n.split(/; */)){let o=r.indexOf("="),i=o!==-1?r.substring(0,o).trim():r.trim(),a=o!==-1?r.substring(o+1,r.length).trim():"";if(t){t=!1,e.name=On(i),e.value=On(a);continue}i==="Domain"&&(e.domain=On(a)),i==="Expires"&&(e.expires=mb(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=mb(Date.now()+ +a*1e3)),i==="Path"&&(e.path=On(a)),i==="Secure"&&(e.secure=!0)}return e}async function hb(n){let e=await n.allHeaders(),t=e.cookie?.split(";").map(hO)??[];return{headers:Object.entries(e).map(([r,o])=>({name:On(r),value:On(o)})),cookies:t}}async function gO(n){let e=n.postData();if(!e)return;let t=await n.headerValue("content-type"),r={mimeType:t??"application/octet-stream",text:On(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,a]of o.entries())r.params.push({name:On(i),value:a?On(a):void 0})}return r}async function fO(n){return{mimeType:await n.headerValue("content-type")??void 0,text:On(await n.text()),encoding:await n.headerValue("content-encoding")??void 0}}function On(n){return n.length>uO?pO:n}function Sb(){return async n=>{let{fragment:e,code:t,context:r}=n,{env:o}=r||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function $e({root:n,fn:e,arg:t,timeout:r,waitForPageLoad:o,codePath:i}){return await o(),await _(n.evaluate(e,t),{milliseconds:r,message:`Timed out ${i} after ${r}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}function gp(){return window.lastCursorPos}import{errors as SO}from"playwright-core";async function no({func:n,action:e,logger:t,callbacks:r,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),s;for(;Date.now()-a<o;)try{return await n(i)}catch(l){let c=l;if(Zi(c)){t.warn("Attempting to recover from removed data-momentic-ids by re-adding ids to DOM");let[d]=await Promise.all([n(i),r.getBrowserState({skipWaitForPageLoad:!0,skipWait:!0})]);return d}else if(c instanceof SO.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await yO(c,i.locator,r,t);else throw c}throw s instanceof R?s:new R("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function yO(n,e,t,r){return n.message.includes("attempt #")?bO(n,e,t,r):wO(n)}async function bO(n,e,t,r){let o=n.message.split(/- retrying \w+ action, attempt #\d+/).filter(l=>l.length>0);if(!o.length)return r.warn({err:n},"Failed to parse Playwright error message for translation, returning raw message"),n;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
|
|
3793
|
-
`,";").replace(/\s+/g," ");let a="",s=await
|
|
3794
|
-
${l}`,{errOptions:{cause:n}})}if(i.includes("element is not visible")){let l="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let c=await e.boundingBox({timeout:1e3});c?c.height===0?l="The element you attempted to interact with has zero height.":c.width===0&&(l="The element you attempted to interact with has zero width."):l="The element you attempted to interact with has no bounding box."}catch{}return new R("ActionFailureError",`${l} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:n}})}return i.includes("element is outside of the viewport")?new R("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):n}function wO(n){let e=n.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new R("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:n}});return n}async function yb(n){try{return await vO(n)}catch(e){n.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function vO({locator:n,logger:e}){let[t,r]=await n.evaluate(l=>[l.id,l.tagName.toLowerCase()],{timeout:1e3}),o=await Sn(n,e),i=await n.boundingBox({timeout:1e3});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5)return;if(r==="input"&&t)try{let l=n.page().locator(`label[for=${JSON.stringify(t)}]`);return await l.waitFor({state:"visible",timeout:1e3}),{locator:l,relativePoint:void 0}}catch{}let a=await n.evaluate(l=>{let c=window,d=l.parentElement;if(!d)return{type:"error",error:"Input click target has no parent for redirection"};let p=l.getBoundingClientRect(),u=d.getBoundingClientRect();if(u.width===0||u.height===0)return{type:"error",error:"Parent element has no width or height"};let m={x:Math.min(Math.max(1,p.left-u.left),u.width-1),y:Math.min(Math.max(1,p.top-u.top),u.height-1)},g=c._MOMENTIC_FEATURE_FLAGS?.visual_actions?`[data-momentic-id=${JSON.stringify(l.getAttribute("data-momentic-id"))}]`:c.getMPath?.(l)?.join(" >");return g?{type:"result",selector:g,relativePoint:m,serializedForm:d.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:1e3});if(a.type==="error")throw new Error(a.error);let s=n.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:1e3}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var wb=["date","datetime-local","month","time","week"],bb={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function vb(n){try{await _(TO(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function TO({root:n,text:e,options:t,logger:r,callbacks:o}){let i=(await $e({root:n,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:1e3,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!bb[i])return;bb[i].test(e)&&r.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,r.debug("Transforming datetime input to use sequential key presses")}async function vl({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await fp(e,r);let o=n.evaluate(i=>{let a=window;a.momenticIsEligible=p=>{let m=window.getComputedStyle(p,null).getPropertyValue("display");if(m==="none"||m==="contents")return!1;let h=p.getBoundingClientRect();return!(!h.height||!h.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let l=i.style.getPropertyValue("outline"),c=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let d=`momentic${Math.floor(Math.random()*1e7)}`;a[d]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",l,c),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[d](),a.removeHighlightFunctions?.[d]&&delete a.removeHighlightFunctions[d]},5e3)),a.removeHighlightFunctions[d]=a[d]},void 0,{timeout:r});return await _(o,{milliseconds:r}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function fp(n,e=1e3){let t=await n.state.getRoot();await $e({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:n.waitForPageLoad,codePath:"removing element highlights"})}async function yp(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return no({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>Sp({...n,targetingResult:t,useVisualClick:e})})}async function RO(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await AO(n,e)}catch(r){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:r,originalError:n},"Error handling click error, rethrowing original error"),n):r}}async function AO(n,e){let{logger:t,redirectionAttempts:r=0,browserCallbacks:o,actionSource:i}=e,a=e.targetingResult.locator,s=o.state.getDomGraph();if(n.message.includes("label")&&n.message.includes("for=")&&n.message.includes("intercepts pointer events")){let l=await a.getAttribute("id",{timeout:1e3});if(!l)throw n;let c=a.page().locator(`[for=${JSON.stringify(l)}]`);return await c.waitFor({state:"visible",timeout:1e3}),t.warn({err:n},"Attempting locator redirection due to input being covered by label"),Sp({...e,targetingResult:{locator:c},redirectionAttempts:r+1})}else if(i==="click"&&s&&n.message.includes("intercepts pointer events")){t.warn({err:n},"Attempting locator redirection due to covering error");let l=await MO(a,s,t);if(l)return Sp({...e,targetingResult:{locator:l},redirectionAttempts:r+1});throw t.error({err:n},"No updated locator could be found to fix covering error, rethrowing"),n}else throw t.error({err:n},"Click error does not match any known recoverable patterns, rethrowing"),n}async function IO(n){let{browserCallbacks:e,logger:t,targetingResult:r,position:o,options:i}=n,a=await e.state.getRoot(),s=a&&a!==r.locator.page()&&"frameElement"in a?await a.frameElement():null,l;try{l=s?await Gr({promiseGenerator:async()=>s.boundingBox(),timeoutMs:3e3,logger:t}):null}catch(m){throw new R("UserInfrastructureError",`The frame containing the element Momentic was instructed to interact with was removed. Error: ${m.message}`)}finally{await s?.dispose()}let c=Date.now(),{clickX:d,clickY:p,reason:u}=await OO({frameCoordinates:l,logger:t,targetingResult:r,position:o,options:i});t.debug({frameCoordinates:l,position:o,targetingResultHints:r.hints,options:i,clickLocation:{clickX:d,clickY:p,reason:u},duration:Date.now()-c},"Visual click")}async function PO(n){let{actionSource:e,targetingResult:t,options:r,logger:o}=n,i=n.targetingResult.locator,a=r?.relativePosition??n.position;if(e==="click"&&!a){let l=await yb({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=r?.force||t.hints?.force||!1;try{r?.doubleClick?await i.dblclick({button:r.rightClick?"right":"left",timeout:3e3,position:a,delay:r?.delayMs??25,force:s}):await i.click({button:r?.rightClick?"right":"left",timeout:3e3,position:a,delay:r?.delayMs??25,force:s})}catch(l){let c=l;if(kO(c))o.warn({err:c},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:c},"Error clicking on locator, attempting to recover..."),RO(c,{...n,targetingResult:{...i,locator:i}})}}async function Sp(n){let{options:e,logger:t,browserCallbacks:r,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=n,s;e?.waitForDownload&&(s=(async()=>{let l=e.downloadTimeoutMs??3e4;try{return await a.locator.page().waitForEvent("download",{timeout:l})}catch(c){return c instanceof CO.TimeoutError?new R("ActionFailureError",`Download did not complete in ${l}ms`):new R("ActionFailureError",`Download failed: ${c.message}`)}})());try{await vl({locator:a.locator,callbacks:r,logger:t,timeoutMs:1e3})}catch(l){t.warn({err:l},"Error highlighting locator in click, continuing...")}if(i?await IO(n):await PO(n),e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new R("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let l=await _(s,{milliseconds:e.downloadTimeoutMs??3e4});if(l instanceof Error)throw l;return{downloadedFile:await NO(l,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function LO(n,e){if(e.hints?.clickableXY){let i=(n?.x??0)+e.hints.clickableXY.x,a=(n?.y??0)+e.hints.clickableXY.y;return[{x:i,y:a},"targeting hint"]}let t=await e.locator.boundingBox({timeout:1e3});if(!t)throw new R("ActionFailureError","Element does not have a bounding box");let r=t.x+t.width/2,o=t.y+t.height/2;return[{x:r,y:o},"halfway point of the bounding box"]}async function OO({frameCoordinates:n,logger:e,options:t,targetingResult:r,position:o}){let i,a,s;if(o){let p=await r.locator.boundingBox({timeout:3e3});i=(n?.x??0)+(p?.x??0)+o.x,a=(n?.y??0)+(p?.y??0)+o.y,s="predefined position"}else{let[p,u]=await LO(n,r);i=p.x,a=p.y,s=u}let l=r.locator.page(),c=t?.rightClick?"right":"left",d=t?.delayMs??25;return t?.doubleClick?await l.mouse.dblclick(i,a,{button:c,delay:d}):await l.mouse.click(i,a,{button:c,delay:d}),{clickX:i,clickY:a,reason:s}}async function MO(n,e,t){let r=await n.evaluate(s=>s.getAttribute("data-momentic-id"));if(!r)return;let o=yl(r,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[Mt]??"");if(isNaN(i))return;n=n.page().locator(`[data-momentic-id="${i}"]`);let a=await Sn(n,t);return t.warn({candidateMomenticId:i,serializedHtml:a},"Trying new locator based on parent-direction after covering error"),n}async function NO(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=mp(n.suggestedFilename()),i=e();await n.saveAs(EO(i,o)),xb(r,{force:!0}),setTimeout(()=>{xb(i,{recursive:!0,force:!0})},5*60*1e3);let a=ab(xO(i),o);return t.debug({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function kO(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as _O}from"os";var DO={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function FO(){let n=_O();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function Eb(n){return JSON.stringify(n.split("+").sort())}function Cb(n){let e=FO(),t=Eb(n);for(let r of Object.values(DO))if(Object.values(r).some(o=>Eb(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function bp({frame:n,page:e,deltaX:t,directionX:r,deltaY:o,directionY:i,signal:a,callbacks:s,logger:l}){if(!t&&!o)return;let c=r==="left"?-1:1,d=i==="up"?-1:1;if(n)await $e({root:n,fn:([p,u,m,h])=>window.scrollTo(window.scrollX+(p??window.innerWidth)*m,window.scrollY+(u??window.innerHeight)*h),arg:[t,o,c,d],waitForPageLoad:s.waitForPageLoad,timeout:2e3,codePath:"scrolling page"});else{let p=e.viewportSize()||Gt,u=await $e({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:2e3,codePath:"computing page height"}),[m,h,g]=await $e({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:2e3,codePath:"computing active element position"});await e.mouse.wheel((t??p.width)*c,(o??p.height)*d);try{let f=Date.now();for(;Date.now()-f<2e3;){a?.throwIfAborted();let S=await _(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[w,v,b]=await _(e.evaluate(()=>{let x=document.activeElement;if(!x)return[void 0,void 0,void 0];let C=x.getBoundingClientRect();return[x.scrollTop,C.x,C.y]}),{milliseconds:1e3});if(S===u&&w===m&&v===h&&b===g)break;u=S,m=w,h=v,g=b,await te(500)}}catch(f){l.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function wp(n,e){let t,r;for(let o=0;o<4;o++)try{return t=n.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){r=i,await te(500)}throw new Error(`Failed to get tab titles after all retries: ${r?.message}`)}var pi="<empty>";function UO(n){return n.includes("doubleclick.net")||n.includes("googletagmanager.com")||n.includes("googlesyndication.com")||n.includes("s.amazon-adsystem.com")||n.includes("smartadserver.com")||n.includes("omnitagjs.com")||n.includes("x.adroll.com")}function Ab(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||UO(n.url)}async function BO(n,e){let t=await n.send({timeout:3e3,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await n.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await n.send({timeout:3e3,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function ui({cdpClient:n,page:e,logger:t}){let r={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([n.send({timeout:3e3,method:"Page.getFrameTree",params:{}}),n.send({timeout:3e3,method:"DOM.getDocument",params:{depth:0}})]),c=(i.frameTree.childFrames??[]).map(async(p,u)=>{if(Ab(p.frame))return null;try{return await Ib({cdpClient:n,rawFrameTree:p,indices:[u],parent:r,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),d=await Promise.all(c);return r.childFrames=d.filter(p=>p!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),r}async function Ib({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o,logger:i}){let a=e.frame.id,s=await BO(n,a),l=s.attributes??[],c=null,d=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=Sr(l,h);g&&(d.push(`${h}=${JSON.stringify(g)}`),h==="src"&&(c=g))}let p={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:d},src:c,childFrames:[],parent:r,domNode:s},m=(e.childFrames??[]).map(async(h,g)=>{if(Ab(h.frame))return null;try{return await Ib({cdpClient:n,rawFrameTree:h,indices:[...t,g],parent:p,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${g} of frame with url ${e.frame.url}): ${f}`),null}});return p.childFrames=(await Promise.all(m)).filter(h=>h!==null),p}async function zO(n){try{return await n.owner().count()===1}catch{return!1}}async function HO(n){try{return await n.count()===1}catch{return!1}}async function Mn(n,e){let t=[],r=n;for(;r.parent.type==="frame";)t.push(r.parent),r=r.parent;t.reverse();let o=e,i=[];for(let c of t){let d=!1;for(let p of[...c.locationData.attributeSelectors,pi]){let u=o.frameLocator(p===pi?"iframe":`iframe[${p}]`);if(await zO(u)){d=!0,o=u,i.push(p);break}}if(!d)throw new R("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${c.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let c of[...n.locationData.attributeSelectors,pi]){let d=o.locator(c===pi?"iframe":`iframe[${c}]`);if(await HO(d)){a=d,i.push(c);break}}if(!a)throw new R("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${n.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(c=>c,{timeout:1e3}),l=await s.asElement().contentFrame();if(!l)throw new R("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${n.url}'`);return await s.dispose(),{frame:l,mPathSelectorTokens:i}}function Rb(n,e){let t=[...n],r=[];for(;t.length;){let o=t.shift();e(o)&&r.push(o),t.push(...o.childFrames)}return r}async function Pb({page:n,frameTree:e,cache:t}){let r,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let d=0;d<t.mPathSelectorTokens.length-1;d++){let p=t.mPathSelectorTokens[d];p===pi?s=s.length===1?s[0].childFrames:[]:s=s.filter(u=>u.locationData.attributeSelectors.includes(p)).map(u=>u.childFrames).flat()}let l=[],c=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(c===pi?l=s:l=s.filter(d=>d.locationData.attributeSelectors.includes(c)),l.length===1)return r=l[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Mn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),l=Rb(o,c=>!!c.src&&s.test(c.src));if(l.length===1)return r=l[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Mn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),l=Rb(o,c=>!!c.url&&s.test(c.url));if(l.length===1)return r=l[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Mn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.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(r=a[t.indices[t.indices.length-1]],r)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Mn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new xn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function Tl(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function vp(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function Lb(n){let e=vp(n),t=n.src??"",r=n.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:r}}function Ob(n){return n.type==="auto"?{type:"auto",frameId:n.handle.frameId,url:n.handle.url,src:n.handle.src??"",mPathSelectorTokens:n.mPathSelectorTokens.join(" > ")}:{type:"url",url:n.url}}async function Mb({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await $O({frameElementHandle:r,logger:e,signal:t})}catch(o){e.warn({err:o},"Failed to scroll iframe into view, continuing...")}finally{await r?.dispose()}}async function $O({frameElementHandle:n,logger:e,signal:t}){let r=await n.boundingBox();if(!r){e.warn("Active frame element has null bounding box, skipping scroll");return}await Gr({promiseGenerator:async()=>n.evaluate(async(i,{x:a,y:s})=>{window.scrollTo(window.scrollX+a,window.scrollY+s);let l=Date.now(),c,d,p;for(;Date.now()-l<1500;){let u=document.activeElement,m,h,g;if(!u)m=void 0,h=void 0,g=void 0;else{let f=u.getBoundingClientRect();m=u.scrollTop,h=f.x,g=f.y}if(c!==void 0&&d!==void 0&&p!==void 0&&m===c&&h===d&&g===p)break;c=m,d=h,p=g,await new Promise(f=>setTimeout(f,250))}},r),timeoutMs:2e3,codePath:"scrollIframeIntoView",signal:t}),e.info({bb:r},"Successfully scrolled iframe into view")}async function Nb({event:n,transformer:e,enricher:t,frame:r,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:l}=n.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"),!l)return;let c=r.parentFrame()?r.url():void 0,p=r.page().frames().map(h=>h.url());i.debug({frameUrl:c,...n},"Passive click event captured on element");let u,m;if(c)try{let h=await r.frameElement();u=await _(h?.boundingBox(),{milliseconds:1e3})??void 0;let g=await t.constructIframeRegex({urls:p,srcs:[],desiredUrl:c});if(g.urlRegex)m={type:"url",url:`/${g.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(g)}`)}catch(h){i.warn({err:h},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:c}}(async()=>{try{await e.recordElementAction({...n,screenshotBase64:o,frameConfig:m,frameBoundingBox:u})}catch(h){i.error({err:h},"Failed to transform passive click action")}})()}import{randomUUID as Nn}from"crypto";import jO from"js-beautify";var GO=["Shift","CapsLock","Dead","Meta","AudioVolumeUp","AudioVolumeDown"];var xl=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:r,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,l)=>{this.recordedSteps.set(l,{step:s}),t.onStepRecorded(s,l)},onActionReceived:(s,l)=>{this.recordedSteps.set(l,{step:s}),t.onActionReceived?.(s,l)}},this.generator=r}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:Nn(),type:"PRESET_ACTION",command:Un(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:r,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=r.properties.attributes.nodeOnlySerializedHtml.trim(),l=s,c;switch(e.frameConfig?e.frameBoundingBox?c={x:e.frameBoundingBox.x+r.properties.boundingBox.x,y:e.frameBoundingBox.y+r.properties.boundingBox.y,width:r.properties.boundingBox.width,height:r.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):c=r.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=Un(i);a={id:Nn(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}case"SELECT":{i="SELECT_OPTION";let g=Un(i);a={id:Nn(),type:"PRESET_ACTION",command:{...g,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:l},cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=Un(i);a={id:Nn(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let d;e.offset===void 0?(d=this.nextStepOffset,this.nextStepOffset++):d=e.offset,this.callbacks.onActionReceived?.(a,d);let p=e.target.browserState;try{p=jO.html(p,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),p=Uy(p,"data-momentic-interacted",4e4)}catch{}let u;try{u=(await this.generator.getReverseMappedDescription({target:p,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:r.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...Ue(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),u=s}let m=this.recordedSteps.get(d)?.step??a,h=m?.command;h&&"target"in h&&h.target?(h.target={type:"description",elementDescriptor:u},this.callbacks.onStepRecorded({...m,command:h},d)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:r}=e;if(GO.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let p=Un("TYPE");i={id:Nn(),type:"PRESET_ACTION",command:{...p,target:void 0,value:t,clearContent:!1}}}else{let p=Un("PRESS");i={id:Nn(),type:"PRESET_ACTION",command:{...p,value:t}}}let a,s=this.nextStepOffset-1,l=this.recordedSteps.get(s),c=l?.step,d=c?.command;if(r){if(d?.type===i.command.type){let p=d.value,u=i.command.value;i={id:Nn(),type:"PRESET_ACTION",command:{...d,value:i.command.type==="PRESS"?`${p}+${u}`:`${p}${u}`}},a=s}else if(d?.type==="CLICK"&&i.command.type==="TYPE")c.command={...i.command,target:d.target,cache:d.cache},i=l.step,a=s;else if(d?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let p=d.value;i={id:Nn(),type:"PRESET_ACTION",command:{...d,value:p.slice(0,p.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,l;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,l=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,l=a):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_DOWN":"SCROLL_UP",d=Un(c);d.deltaY=Math.abs(i);let p={id:Nn(),type:"PRESET_ACTION",command:d};this.callbacks.onStepRecorded(p,l)},r=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,l;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,l=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,l=a):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",d=Un(c);d.deltaX=Math.abs(i);let p={id:Nn(),type:"PRESET_ACTION",command:d};this.callbacks.onStepRecorded(p,l)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(r(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&r())}};var El=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;showZeroOpacityElements;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;flagStore;enricher;iconKnowledgeBase;activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,showZeroOpacityElements:r,allowPartialAccessibilityTree:o,logger:i,cdpClient:a,pageGetter:s,flagStore:l,abortSignalGetter:c,enricher:d,iconKnowledgeBase:p}){this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.showZeroOpacityElements=r,this.allowPartialAccessibilityTree=o,this.logger=i,this.cdpClient=a,this.pageGetter=s,this.flagStore=l,this.abortSignalGetter=c,this.enricher=d,this.iconKnowledgeBase=p}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))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(),r=vp(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:r,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),r=await ui({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await Pb({page:t,frameTree:r,cache:e});return this.logger.debug({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(Tl(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 r;return this.frameConfig.type==="url"?r=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):r={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Tl(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await Mb({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await ui({cdpClient:this.cdpClient,page:r,logger:this.logger}),i=[_(r.evaluate(e,t),{milliseconds:2e3})],a=Array.from(o.childFrames);for(;a.length>0;){let l=a.shift(),c=l.url;c==="about:blank"||c.startsWith("chrome-error://")||(a.push(...l.childFrames),i.push(Mn(l,r).then(({frame:d})=>_(d.evaluate(e,t),{milliseconds:2e3})).catch(d=>(this.logger.warn({err:d,frameUrl:l.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(l=>l!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await ui({cdpClient:this.cdpClient,page:e,logger:this.logger}),r=Array.from(t.childFrames),o=[];for(;r.length>0;){let i=r.shift();r.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:r}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:r??this.logger})}async getA11yTree(e){let t={},r=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,l=null;if(this.frameConfig?.type==="url"){if(a=await rn({fn:()=>this.resolveActiveFrameConfig({logger:r,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:r})??void 0,!a)throw new R("ActionFailureError","Got null frame details despite active frame config");s=a.handle,l=s.frameId}else this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")?(s=await rn({fn:()=>ui({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:r}),l=null):(s={type:"root",page:i,childFrames:[]},l=null);await rn({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:r}),codePath:"addIdsToElement",logObject:t,signal:o,logger:r});let c=await rn({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:r}),codePath:"domFetch",logObject:t,signal:o,logger:r}),d=await rn({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:l,childFrames:s.childFrames,logTimings:t,logger:r,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:r}),{tree:p}=await rn({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:d,domGraph:c,startingFrameId:l,frameContext:s,logger:r,iconKnowledgeBase:this.iconKnowledgeBase}),codePath:"a11yProcess",logObject:t,signal:o,logger:r});return Object.values(t).some(u=>u>750)&&r.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=p.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=p.dataMomenticIdMap,this.lastA11yTreeRoot=p.root,this.lastDomGraph=c,this.lastSelectorToNodeMap=p.selectorToNodeMap,p}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:Fr,filterByViewport:!1}),Math.random()<.1){let r=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:r&&r.length>4e5?"REDACTED_DUE_TO_SIZE":r},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:r}){if(r.backendNodeId===void 0)throw new Error(`Node with a11y id ${r.id} has no backend node ID: ${r.getNodeOnlySerializedForm()}`);if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let o=this.domGraph?.backendIdToNode[r.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${r.backendNodeId}`);let i=Wy({node:o,domGraph:this.domGraph});return Vy(e,i)}else return this.getLocatorFromBackendId(t,r.backendNodeId)}async getLocatorFromBackendId(e,t){let r=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:2e3});if(!r||!r.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await qy(this.cdpClient,r.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(r.object)},"Failed to get ID attribute"),i}return e.locator(`[${Mt}="${o}"]`)}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let r=e.split(" > "),o="";for(let i=r.length-1;i>=0;i--){let a=r.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:r=this.logger}){let o=Date.now(),i,a,s,l=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await ui({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),a=await this.getMatchingFrameByUrlWithCdp(i,e),r.debug({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(c){if(s=c,c instanceof R&&c.reason==="UserInfrastructureError")throw c;l%3===0&&this.logger.debug({attempt:l,err:c},"Failed to resolve active frame, retrying..."),await te(500,t)}finally{l++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Tl(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let r=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),l=s.domNode;i.push(...s.childFrames);let c=Sr(l.attributes??[],"src"),d=l.contentDocument?.documentURL;if(!c&&!d){this.logger.debug("Skipping frame with no URL or src");continue}for(let p of[c,d])if(p){if(r.startsWith("/")&&r.endsWith("/")){if(new RegExp(r.slice(1,-1)).test(p)){a.push({handle:s,matchType:"regex",...await Mn(s,o)});break}}else if(r.trim()===p.trim()){a.push({handle:s,matchType:"url",...await Mn(s,o)});break}}}if(a.length===1){let s=a[0];return this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${r}'. Please use a more specific selector.`):new R("ActionFailureError",`Failed to find frame with src matching: ${r}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:r,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s}){let l=await nb({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:r,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:this.showZeroOpacityElements,filterByViewport:e.filterByViewport,viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.flagStore.isBooleanFlagEnabled("visual_actions")});if(!l||!l.root)throw new Error("Accessibility tree appears empty");return{tree:l}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:r,logger:o}){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return;let i=await this.addMomenticIdsHelper(r??e,1);if(!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||r)return;let a=Array.from(t),s=[];for(;a.length>0;){let l=a.shift();a.push(...l.childFrames);let c=async()=>{try{let{frame:d}=await Mn(l,e);i=await this.addMomenticIdsHelper(d,i)}catch(d){l.url!=="about:blank"&&o.warn({err:d},"Error adding momentic IDs to child frame, continuing...")}};s.push(c())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return t;let r=this.logger;return await $e({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:2e3,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){r.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 r=t.hostname.split("."),o=r.length>2?r.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:r}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:r.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 ${r.frameId} with url ${r.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(Sr(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let r=Sr(t,"style");if(r?.includes("display: none")||r?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:3e3,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:3e3,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:r,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 l,c;for(let m=0;m<3;m++)try{c=await rn({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,signal:a,logger:i});break}catch(h){l=h,i.warn({err:h},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!c)throw new Error(`Failed to fetch accessibility tree for root page: ${l}`);let d={};if(d[t??"root"]=c,!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))return d;let p=Array.from(r),u=[];for(;p.length>0;){let m=p.shift();try{let{shouldUnroll:g}=await this.decideChildFrameUnrollEligibility({handle:m,warnings:s});if(!g)continue}catch(g){if(g.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: ${g}`)}p.push(...m.childFrames);let h=async()=>{try{let g=await rn({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,signal:a,logger:i});d[m.frameId]=g}catch(g){i.warn({err:g,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};u.push(h())}return await Promise.all(u),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),d}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:r}){let o;if(this.allowPartialAccessibilityTree)o=(await rn({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:r,signal:this.abortSignalGetter(),logger:this.logger})).nodes;else{let a=(await rn({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:2e3}),codePath:"cdp-get-root-ax-node",logObject:r,signal:this.abortSignalGetter(),logger:this.logger})).node.backendDOMNodeId;o=(await rn({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:r,signal:this.abortSignalGetter(),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:r}){let o,i=0;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:Sl},timeout:3e3}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(a){await te(500,t),r.debug({err:a},"Error fetching DOM tree"),i++}if(!o||!o.documents.length)throw new R("InternalWebAgentError","Got empty DOM snapshot with no documents");return Gy({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=Lb(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(r);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:r},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function kb(n){return async(e,t)=>{let r=await t.allHeaders();for(let{key:o,value:i,matcher:a}of n)(!a||a.test(t.url()))&&(r[o]=i);await e.continue({headers:r})}}var xp=mi(Cp(),"momentic","chromium"),pM=mi(Cp(),"video"),Al=process.env.TWO_CAPTCHA_KEY,Ep=lM(zb);Ep.use(cM({provider:{id:"2captcha",token:Al},visualFeedback:!0}));var kn=class n{static USER_AGENT=sM["Desktop Chrome"].userAgent;abortSignal=void 0;contextInitialized=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;lastIconKnowledgeBaseUpdateTime=0;mockedServices;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};recentFrameNavigations={};requestRecorders={};customHeaders=[];enricher;storage;flagStore;logger;stateManager;transformer;lastScreenshotForRecording=void 0;baseUrl;originsVisited=new Set;viewport;videos=[];constructor({storage:e,flagStore:t,enricher:r,browser:o,context:i,page:a,baseUrl:s,logger:l,mockedServices:c,userBrowserSettings:d,viewport:p,properties:u,clientCallbacks:m,iconKnowledgeBase:h}){if(bg(d),this.mockedServices=c,this.storage=e,this.flagStore=t,this.enricher=r,this.browser=o,this.context=i,this.page=a,this.baseUrl=s,this.logger=l,this.userControlledBrowserSettings=d,this.viewport=p||Gt,this.properties=u,this.clientCallbacks=m,u.recordVideo){let g=this.page.video();g&&this.videos.push(g)}this.iconKnowledgeBase=h}registerAbortSignal(e){this.abortSignal=e}async initialize(){if(this.contextInitialized)return;this.userControlledBrowserSettings.extraHeaders&&await this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders),await this.context.grantPermissions(["clipboard-read","clipboard-write","microphone","camera","geolocation"]);let e=this.flagStore.getAllFlags(),t=[this.context.addInitScript({content:Oy.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(e)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`})];await this.context.route("**/*",kb(this.customHeaders));let r=Promise.all(Object.entries(this.mockedServices).map(([a,s])=>this.context.route(a,l=>s.handle(l)))),o=a=>this.handleNewPageEvent(a);this.context.on("page",o),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",o)});let i=Promise.all(t);await Promise.all([i,r]),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&rM()==="darwin"&&JO("system_profiler SPDisplaysDataType").toString().includes("Retina")?(y.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2):this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio)),this.cdpClient=await wl.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),await this.initializeScreencast(),this.stateManager=new El({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,flagStore:this.flagStore,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,showZeroOpacityElements:this.userControlledBrowserSettings.showZeroOpacityElements??!1,iconKnowledgeBase:this.iconKnowledgeBase}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&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&&(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,r=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=r,this.clientCallbacks?.onScreencastFrame?.(r,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init({baseUrl:e,logger:t,storage:r,flagStore:o,enricher:i,mockedServices:a,userBrowserSettings:s,contextArgs:l,browserbaseConnectUrl:c,recordVideo:d,iconKnowledgeBase:p,callbacks:u}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let m;switch(s.browserType){case"Google Chrome":m="chrome";break;case"Chrome for Testing":m=void 0;break;case"Chromium":m="chromium";break;default:m="chromium";break}let h={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:m},g={...l??{},geolocation:l?.geolocation||Lo,locale:l?.locale||Io,timezoneId:l?.timezoneId||Po,colorScheme:l?.colorScheme,httpCredentials:s.basicAuthorization?{username:s.basicAuthorization.username??"",password:s.basicAuthorization.password??""}:void 0,javaScriptEnabled:s.disableJavaScript?!1:void 0,userAgent:s.userAgent??n.USER_AGENT,viewport:l?.viewport??Gt},f=["--disable-dev-shm-usage","--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream"],S=null,w,v,b={systemDevicePixelRatio:l?.deviceScaleFactor,recordVideo:d,isNewHeadless:!1};(s.browserType==="Chromium"||s.browserType==="Google Chrome")&&(b.isNewHeadless=!0,h.headless&&f.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&f.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`),s.disableGpu&&f.push("--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-audio-input","--disable-audio-output");let x=s.localChromeExtensionPaths?.map(A=>A.startsWith("~")?mi(Cp(),A.slice(1)):A);if(x?.length){if(s.browserType==="Chrome for Testing")throw new R("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let H of x){let F=mi(H,"manifest.json");if(!Rl(F))throw new R("UserConfigurationError",`Chrome extension path ${F} does not exist.`)}let A=mi(xp,`momentic-session-${Date.now()}`);if(!Rl(A))try{XO(A,{recursive:!0})}catch(H){throw new R("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${xp} folder: ${H}`)}let N=[...f],P=x.map(H=>aM(H)).join(",");N.push(`--disable-extensions-except=${P}`),g?.deviceScaleFactor&&N.push(`--force-device-scale-factor=${g.deviceScaleFactor}`,`--device-scale-factor=${g.deviceScaleFactor}`),g.viewport&&N.push(`--window-size=${g.viewport.width},${g.viewport.height}`),w=await zb.launchPersistentContext(mi(xp,`momentic-session-${Date.now()}`),{...h,...g,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:N,baseURL:e}),t.debug({sharedContextOptions:g,sharedBrowserOptions:h,userBrowserSettings:s,chromeArgs:N,flags:o.getAllFlags()},"Browser initialization context args (persistent)"),v=w.pages()[0]}else if(c){S=await Ep.connectOverCDP(c);let A=S.contexts()[0];if(!A)throw new Error("Failed to get browserbase default context");let N=A.pages()[0];if(!N)throw new Error("Failed to get browserbase default page");w=A,v=N}else{S=await Ep.launch({...h,args:f});let A={...g,baseURL:e,recordVideo:d?{dir:pM}:void 0};w=await S.newContext(A),t.debug({contextArgs:A,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:s,flags:o.getAllFlags()},"Browser initialization context args (standard)"),v=await w.newPage()}let C=new n({browser:S,context:w,page:v,baseUrl:e,logger:t,storage:r,flagStore:o,mockedServices:a||{},enricher:i,userBrowserSettings:s,viewport:g.viewport||Gt,properties:b,clientCallbacks:u,iconKnowledgeBase:p});return await C.initialize(),C}async handleAvailableTabsChangeHelper(){try{let e=await wp(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 r=Fb(),o=`${e}-${r}`,i=Date.now(),a=!1,s=async()=>{try{await _(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],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.debug({url:e.url()},"Detected active page was closed, switching to another tab");let r=this.context.pages();for(let o=r.length-1;o>=0;o--){let i=r[o];if(!(!i||i.isClosed()||!Wr(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();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let r=e.video();r&&this.videos.push(r)}try{this.handleNewPageEventHelper(e)}catch(r){this.logger.warn({err:r},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Fb(),r="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);e.on("console",a=>{db(e,o,this.debugData,a,this.logger)}),e.on("request",a=>{fb(t,this.debugData,a,this.logger),this.recordRequest(a)});let i=async()=>{await gb(t,this.debugData,e),await this.loadFrameAndRecordUrl({root:e,codePath:r}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(r,async()=>i())}async handleCollectSvgs(e){if(!this.flagStore.isBooleanFlagEnabled("icon_knowledge_base")||this.page.isClosed()||this.page.mainFrame()!==e||!this.iconKnowledgeBase||!this.clientCallbacks?.onSvgsCollected||Date.now()-this.lastIconKnowledgeBaseUpdateTime<5e3)return;this.lastIconKnowledgeBaseUpdateTime=Date.now();let t=await this.stateManager.getDomGraph({devicePixelRatio:this.devicePixelRatio}),r=Ky({domGraph:t,flagStore:this.flagStore,logger:this.logger,existingHashes:this.iconKnowledgeBase});if(r.forEach(s=>{this.iconKnowledgeBase[s.hash]=s}),!r.length)return;let o=Ue(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:nM()};for(let s of["runId","testId"])o[s]&&(i[s]=o[s]);let a={metadata:i,newSvgs:r};this.clientCallbacks.onSvgsCollected(a)}handleFrameNavigationEvent(e){let t=e.url(),r=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)}-${r}`;if(!t||t==="about:blank"||!Wr(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,signal:this.abortSignal}),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},"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 r={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(r[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},r)}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()},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){for(this.abortSignal=void 0,this.debugData.logsPerPage=[],this.debugData.harPages={},this.debugData.harEntries={},this.pageLoadPromises={};this.videos.length>0;)this.videos.pop();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 _(fp(this.getBrowserCallbacks()),{milliseconds:1e3})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 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.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,r){let o=Date.now(),i=0,a=0;for(;Date.now()-o<8e3;){a++,r?.throwIfAborted();try{if(await $e({fn:()=>{let l=window;return!!(l.generateCssSelectors&&l.evaluateCssSelectors&&l.generateHtmlCacheAttributes&&l.ldist)},timeout:1e3,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 te(500),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),$e({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:3e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],r=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{r.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 r)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:r=!1}=e,o=Date.now(),i=this.page.url();r&&await this.stabilizePageForScreenshot();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.debug({err:a,pageUrl:i},"Failed taking screenshot, retrying..."),await te(250),this.screenshot({...e,retries:t-1})}finally{Date.now()-o>1e3&&this.logger.warn({pageUrl:i,duration:Date.now()-o},"Screenshot took longer than expected"),r&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:r,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??2e3}),l=Buffer.from(s.data,"base64"),c=await Ub.fromBuffer(l),{width:d,height:p}=this.getViewport();if((c.bitmap.width!==d||c.bitmap.height!==p)&&(l=await c.resize({w:d,h:p}).getBuffer("image/jpeg")),r&&QO(r,l),this.lastScreenshotForRecording=l,!e)return l;let u=await e.boundingBox({timeout:1e3});if(!u)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:h,width:g,height:f}=u;if(!g||!f)throw new Error("Attempted to screenshot an element with zero width or height");if(m<0||h<0)throw new Error("Attempted to screenshot an element with negative coordinates");m=Math.floor(m),h=Math.floor(h),g=Math.floor(g),f=Math.floor(f);try{l=await(await Ub.fromBuffer(l)).crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}return"dispose"in e&&await e?.dispose(),l}getViewport(){return this.viewport}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:r=this.pageLoadTimeout}){wf(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 l=0;l<3;l++)try{await this.page.goto(e,{timeout:r,waitUntil:"domcontentloaded"}),i=!0;break}catch(c){if(a=c,this.abortSignal?.throwIfAborted(),this.logger.warn({err:c},`Error occurred during navigation${l===0?", retrying...":" (fatal)"}`),await te(500),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:1e3})}if(!i)throw new R("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.debug({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(By.has(s))throw new R("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);if(t)try{await this.exposeRecordingBindings()}catch(l){l instanceof Error&&l.message.includes("already registered")||this.logger.error({err:l},"Failed to install Momentic libraries for action recording")}await this.fixViewportForNewHeadless()}async type(e,t={},r=!1){await this.directTypeHelper(e,t,r)}async getActiveElement(e){try{return await $e({root:e,fn:()=>{let r=document.activeElement?.textContent??void 0;return r&&r.length>100&&(r=r.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:r}:void 0},arg:void 0,timeout:1e3,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={},r=!1){let o=await this.getActivePageOrFrame();await vb({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(r){let a=Date.now();for(;Date.now()-a<this.smartWaitingTimeout&&(!i||i.tag==="body");)await te(250),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"?(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.warn({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??Nu}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoView(e){try{await e.scrollIntoViewIfNeeded({timeout:2e3})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async r=>{let o=r.scrollTop;r.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=r.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:2e3})}catch(r){this.logger.warn({err:r},"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 vl({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),r=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),r=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:1e3}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),r=[...this.context.pages()];for(let o=0;o<r.length;o++){let i=r[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await cb(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.debug(`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.debug(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:1e3});let r=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:1e3,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),r++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.debug(`Loaded ${r} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await lb(this.page,o,this.logger),this.logger.debug(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,r=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await sb(this.page,this.logger),o}catch(o){if(r=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:r},"Failed to save auth state after 2 retries"),new R("ActionFailureError",`Failed to save auth state: ${r?.message}`)}async getOpenPages(e){return wp(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,t.serializedForm=e.getSerializedFormWithContext(),t.nodeOnlySerializedForm=e.getNodeOnlySerializedForm()}async updateCacheWithNewNodeDetails({node:e,target:t,locator:r,forceSaveNewCssSelectors:o,logger:i=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),r)try{let a=await this.fetchHtmlAttributes({locator:r,logger:i}),s=!1;for(let l of["generatedSelectors","serializedHtml","nodeOnlySerializedHtml","hybridSelector"]){let c=a?.[l];if(c&&!t[l]){s=!0;break}if(c&&JSON.stringify(c)!==JSON.stringify(t[l])){s=!0;break}}a&&(o||s)&&(t.generatedSelectors=a.generatedSelectors,t.serializedHtml=a.serializedHtml,t.nodeOnlySerializedHtml=a.nodeOnlySerializedHtml,t.hybridSelector=a.hybridSelector)}catch(a){i.warn({err:a},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes(t,r,i)}catch(a){i.debug({err:a},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes(e,t,r){if(!t)return;await this.scrollIntoView(t);let o=await t.boundingBox({timeout:1e3});if(!o||!o.width||!o.height){r.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}e.boundingBox=o;let{x:i=0,y:a=0,width:s=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1||!tp.includes(e?.role??""))return;let c=await this.screenshot({locator:t,retries:0});e.screenshotUrl=await this.storage.uploadScreenshot(c)}async resolveTargetWithHybridSelector({root:e,target:t}){if(!t.hybridSelector||!t.nodeOnlySerializedHtml)throw new Dr("Insufficient data to resolve target using hybrid selector");return await $e({fn:r=>window.evaluateHybridSelector(r),arg:{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:{ldistThreshold:.05,requireBoundingBox:!0,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0}},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating Momentic cache"})}async resolveTargetWithCssSelectors({root:e,target:t}){if(!t.generatedSelectors||t.generatedSelectors.length<2||!t.nodeOnlySerializedHtml)throw new Dr("Insufficient data to resolve target using CSS selectors");return $e({fn:r=>window.evaluateCssSelectors(r),arg:{selectors:t.generatedSelectors,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:{ldistThreshold:.05,requireBoundingBox:!0,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0}},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluateCssSelectors"})}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async createTargetFromA11yId({id:e,description:t,targetSource:r,skipSaveToCache:o,logger:i=this.logger}){if(e<0)throw new R("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let a=this.stateManager.a11yIdToNodeMap[e];if(!a)throw new R("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let s=this.stateManager.frameConfig,l,c,d,p;if(this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")&&!s&&a.parentFrame){let f=a.parentFrame,{cache:S,config:w}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,d=w,l=w.frame,p="auto iframe"}else a.parentFrame&&s?(d=s,l=await this.getActivePageOrFrame(),p="hardcoded url already on the state manager"):(l=await this.getActivePageOrFrame(),p="should not be possible");let u=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:l,node:a}),m={id:e,inputDescription:t??void 0,targetSource:r,targetUpdateTime:new Date().toISOString(),frameCache:c},h,g=!1;o||(d&&(i.debug({frameConfigSource:p,frameConfig:Ob(d)},"A11y node was resolved to a target within an iframe"),h=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(d),g=!0),await this.updateCacheWithNewNodeDetails({node:a,target:m,locator:u,logger:i,forceSaveNewCssSelectors:!0}));try{return{resolution:{locator:u,a11yNode:a,displayString:a.getNodeOnlySerializedForm(),decisions:[]},target:m,frameConfig:d,frameConfigSource:p}}finally{g&&this.stateManager.setActiveFrameConfig(h)}}async resolveTarget(e,t,r={}){let{skipFetchTree:o=!1,targetName:i,logger:a=this.logger,signal:s=this.abortSignal}=r;if(t.frameCache&&this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")){let u,m=!1,h=Date.now();for(;Date.now()-h<this.smartWaitingTimeout;)try{let g=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(g),m=!0;break}catch(g){u=g,await te(500,s)}if(!m)throw u}let l=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(l,a,s);let c=Date.now(),d=0,p;for(;Date.now()-c<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),d++;let u=d===1||Date.now()-c>this.smartWaitingTimeout-2e3&&d%2===0;try{p=await this.resolveTargetHelper({root:l,target:t,primaryOnly:!0,skipFetchTree:o,logger:u?a:Fr,signal:s});break}catch(m){if(m instanceof Dr)break;s?.throwIfAborted(),u&&a.debug({err:m},`Could not resolve target through CSS selectors only (x${d})`),await te(500,s)}}return p||(p=await this.resolveTargetHelper({root:l,target:t,primaryOnly:!1,skipFetchTree:o,logger:a,signal:s}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Ue(a),a.debug({decisions:p.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:i,elementLocationDecisions:p?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),p}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:r}){if(!t.nodeOnlySerializedHtml)throw new Dr("Insufficient data to resolve target using primary methods (missing node HTML)");let o=this.userControlledBrowserSettings.hybridSelectorMode,i=async()=>{if(t.hybridSelector&&o)return this.resolveTargetWithHybridSelector({root:e,target:t,logger:r})},a=async()=>{if(t.generatedSelectors)return this.resolveTargetWithCssSelectors({root:e,target:t,logger:r})},[s,l]=await Promise.allSettled([i(),a()]),c,d=[];if(s.status==="fulfilled"&&o==="prefer"&&s.value?.result){c=s.value;let f={type:"HYBRID_SELECTOR",matched:!0,logs:c.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};d.push(f),r.debug({evaluationDecision:f},"Hybrid selector evaluation succeeded")}else if(l.status==="fulfilled")if(l.value?.result){c=l.value;let f=l.value.result;d.push({type:"CSS_SELECTOR",matched:!0,logs:c.logs,reason:`${f.workingSelectors.length} CSS selectors matched the following element: ${f.serializedElement}`,selectors:f.workingSelectors.slice(0,5)})}else throw new xn(`CSS selector evaluation returned no eligible elements:
|
|
3792
|
+
${A||""}`}return S}shallowClone(){let e=new n({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:dp(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=dp(this.properties),e}},up=class n{constructor(e,t,r,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=r;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function r(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,l=i.shallowClone(),c=i.children,d=!1,p=[];for(let u of c){let m=r(u,s||d);m&&(p.push(m),m.parent=l,d=!0)}if(l.children=p,s||d)return l;if(El.includes(i.role)&&a)return l}let o=r(t);return new n(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function aO(n){return n.name?.value?`"${n.name.value}"`:n.role?.value&&n.role.value!=="none"&&n.role.value!=="generic"?`"${n.role.value}"`:`"${n.nodeId}"`}function sO(n,e,t,r){return n.bounds.x===null||n.bounds.y===null||n.bounds.height===null||n.bounds.width===null||n.bounds.width===0||n.bounds.height===0?!0:n.bounds.x+n.bounds.width<e.leftBound||n.bounds.x>e.rightBound?(zr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport horizontally"),!1):n.bounds.y+n.bounds.height<e.upperBound||n.bounds.y>e.lowerBound?(zr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport vertically"),!1):n.computedStyles.display==="none"?(t.debug({domNode:n},"Filtering out node since it has display none"),!1):!0}async function ub({node:n,parent:e,frameId:t,frameContext:r,axGraph:o,domGraph:i,inputNodeMap:a,showZeroOpacityElements:s,filterByViewport:l,viewportDetails:c,useMPaths:d,cdpClient:p,logger:u,callId:m}){if(!e&&n.parentId)throw new Error(`Got no parent for accessibility node ${n.nodeId}: ${JSON.stringify(n)}`);let h=(M,z={})=>{},g=n.backendDOMNodeId,f=tO.includes((n.role?.value).toLowerCase());if(!f&&g===void 0)return h("Filtering out node since it doesn't exist in the DOM"),[];let S=g?i.backendIdToNode[g]:void 0;if(!f&&!S)try{let M=await D(p.send({method:"DOM.describeNode",params:{backendNodeId:g}}),{milliseconds:750,fallback:()=>{u.debug("Timeout getting node from CDP while processing a11y tree")}});if(M&&M.node.nodeName.toLowerCase()==="slot"&&M.node.distributedNodes?.length)u.debug({redirectedDomNode:S,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:n,cdpResult:M},"Redirecting node to assigned slot");else return h("Filtering out node since it doesn't exist in the DOM",{cdpResult:M}),[]}catch(M){return h("Filtering out node since it doesn't exist in the DOM",{err:M}),[]}if(S&&e&&l&&c&&n.backendDOMNodeId&&!sO(S,c,u,m))return S.momenticIgnored=!0,[];if(S&&S.computedStyles.display==="none")return u.debug({domNode:S},"Filtering out node since it has display none"),S.momenticIgnored=!0,[];if(S&&!s&&S.computedStyles.opacity==="0")return S.momenticIgnored=!0,[];if(S&&S.attributes.tabindex==="-1"&&S.tagName.toLowerCase()==="input"&&(S.bounds.width??0)<10&&(S.bounds.height??0)<10)return zr({logger:u,logKey:m,maxCount:5,intervalMs:3e3},{attributes:S.attributes},"Filtering out node since it is likely an invisible input that is non-interactive"),S.momenticIgnored=!0,[];let w=n.name?.value?typeof n.name.value=="string"?n.name.value:`${n.name.value}`:"",v=n.value?.value?typeof n.value.value=="string"?n.value.value:`${n.value.value}`:"",b=new pp({domNode:S,id:parseInt(n.nodeId),role:n.role?.value||"",name:w,nameSources:n.name?.sources,content:v,properties:n.properties,children:[],ignoredReasons:n.ignoredReasons?.filter(M=>db.includes(M.name)||pb.includes(M.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+aO(n),backendNodeID:n.backendDOMNodeId,ignoredByCDP:n.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:r.type==="root"?void 0:r}),T=r,C=a[t],A=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let M=r.childFrames.find(K=>K.frameId===S.ownedFrameId),z=o[M?.frameId??""]?.root,O=a[M?.frameId??""];if(M&&z&&O){n.childIds&&n.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let K=z;n.childIds=K.childIds,T=M,C=O,A=M.frameId}}let k=S?.childrenBackendIds?.length??0,L=n.childIds?.length??0;if(k>L){let M=n.childIds?.map(O=>C.get(parseInt(O))).filter(Boolean).map(O=>O?.backendDOMNodeId).filter(O=>O!==void 0)??[],z=0;for(let O of S?.childrenBackendIds??[]){if(M.includes(O)){z=(n.childIds?.findIndex(St=>C.get(parseInt(St))?.backendDOMNodeId===O)??0)+1;continue}let K=i.backendIdToNode[O];if(!K||K?.tagName.toLowerCase()!=="svg")continue;let B=Math.floor(-1*Math.random()*1e7),J={nodeId:B.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:O,frameId:A,role:{type:"string",value:"graphics-symbol"}};C.set(B,J),n.childIds||(n.childIds=[]),n.childIds.splice(z,0,B.toString()),z++}}for(let M of n.childIds??[]){if(!M)continue;let z=C.get(parseInt(M));if(!z)continue;let O=await ub({node:z,parent:b,domGraph:i,axGraph:o,frameId:A,frameContext:T,inputNodeMap:a,cdpClient:p,logger:u,callId:m,filterByViewport:l,showZeroOpacityElements:s,viewportDetails:c,useMPaths:d});O.length&&(b.children=b.children.concat(O))}if(b.role==="StaticText"&&(b.children=[]),b.children.length===1&&b.children[0].role==="StaticText"){let M=b.name,z=b.children[0]?.name;(M===z||!z)&&(b.children=[])}let j=[];for(let M=b.children.length-1;M>=0;M--){let z=b.children[M];if(z.role!=="StaticText"){j.push(z);continue}if(M===0||b.children[M-1].role!=="StaticText"){j.push(z);continue}b.children[M-1].name+=z.name}if(b.children=j.reverse(),b.role==="generic"&&b.children.length===1){let M=b.children[0];if(b.name&&!El.includes(M.role)&&b.name===M.name)return S&&(S.momenticIgnored=!0),b.children}if(!b.isInteresting()&&n.parentId)return S&&(S.momenticIgnored=!0),b.children;for(let M of b.children)M.parent=b;return dO(b),S&&d&&cp(S,i),[b]}function mb({node:n,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:l,startId:c=1}){n.id=c,c+=1,e[n.id]=n,n.dataMomenticId?t[n.dataMomenticId]=n:El.includes(n.role);let d=n.backendNodeId,p=d!==void 0?i.backendIdToNode[d]:void 0;if(a&&p&&p.mPathSelector&&(s[p.mPathSelector]=n),l&&p&&p.tagName?.toLowerCase()==="svg"){let u=vl(p,i),m=u?l[u.hash]:void 0,h=m?m.description:void 0;m&&(n.properties["data-momentic-description"]=h)}for(let u of n.children)c=mb({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:l});return c}async function hb({rawA11yGraph:n,domGraph:e,startingFrameId:t,logger:r,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,viewportDetails:s,useMPaths:l,frameContext:c,iconKnowledgeBase:d}){let p=t??"root",u=n[p]?.root;if(!u)throw new Error("A11y tree has no root");let m=YL(),h=b=>{let T=b.allNodes.filter(A=>!A.ignoredReasons?.find(L=>db.includes(L.name))),C=new Map;return T.forEach(A=>{C.set(parseInt(A.nodeId),A)}),C},g={};Object.entries(n).forEach(([b,T])=>{g[b]=h(T)});let f=await ub({node:u,domGraph:e,parent:null,inputNodeMap:g,axGraph:n,frameId:p,frameContext:c,cdpClient:o,logger:r,callId:m,showZeroOpacityElements:a,filterByViewport:i,viewportDetails:s,useMPaths:l});if(f.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(f)}`);if(f.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let S={},w={},v={};return mb({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:w,selectorToNodeMap:v,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:d}),new up(f[0],S,w,v)}function lO(n,e,t){if(n==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(i=>i.length<50&&!Yn.bannedClassSubstrings.some(a=>i.includes(a))).slice(0,3).join(" ");let r=e.split(" "),o=[];for(let i of r)if(gb(i)){o.push(i);continue}return o.length?o.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let r=parseInt(e);if(!isNaN(r))return r}catch{}return n==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function cO(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,a])=>{if(Yn.relevantElementAttributes.includes(i)&&!ZL.includes(i)&&!n[i]&&!i.startsWith("aria")){let s=lO(i,a,e);s!==null&&(n[i]=s)}});let t,r=[];if(e.computedStyles.position&&sb.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of sb)if(e.attributes.style.includes(`position: ${i}`)){t=i;break}}t&&r.push(`position: ${t}`);let o;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(o="opacity: 0"),o&&r.push(o),r.length>0&&(n.style=r.join("; "))}function dO(n){let e=n.properties.class;if(typeof e=="string"&&e.includes("cm-content")){n.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){n.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),n.children.length>0&&(n.children[n.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(n.tagName==="table"){let i=[],a=n.children.find(l=>l.tagName==="thead");if(a){let l=a.children.find(c=>c.tagName==="tr");if(l){let c=l.children.filter(d=>d.tagName==="th");c.forEach((d,p)=>{d.properties["col-index"]||(d.properties["col-index"]=p+1),i?.push(ze(d.name,100,!1))}),i?.length!==c.length&&(i=void 0)}}let s=0;for(let l of n.children)if(l.tagName==="tbody")for(let c=0;c<l.children.length;c++){let d=l.children[c];if(d.tagName!=="tr")continue;if(c===0&&!i?.length){let m=d.children.filter(h=>h.tagName==="th");if(m.length){if(i=m.map(h=>ze(h.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,d.properties["row-index"]||(d.properties["row-index"]=s);let p=d.children.filter(m=>m.tagName==="td"||m.tagName==="th"),u=p.length===i?.length;p.forEach((m,h)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=h+1),u&&(m.properties.col||(m.properties.col=i[h])))})}}}function pO(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function gb(n){if(Yn.bannedClassSubstrings.some(e=>n.includes(e)))return!1;if(Yn.alwaysInterestingClassNames.includes(n))return!0;for(let e of Yn.alwaysInterestingClassPrefixes)if(n.startsWith(e))return!0;return!1}var Cl=class n{constructor(e,t,r,o,i){this.session=e;this.logger=t;this.contextGetter=r;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:r,defaultTimeoutMs:o}){let i=t(),a=r(),s,l;for(let d=0;d<2;d++)try{s=await D(i.newCDPSession(a),{milliseconds:o*d,fallback:()=>{throw new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(p){await ne(500),l=p}if(!s)throw l;let c=new n(s,e,t,r,o);try{await D(c.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(d){throw c.cdpFullyDead=!0,new R("UserInfrastructureError",`Failed to initialize CDP client: ${d}`)}return c}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 e.send("Accessibility.enable"),await e.send("Page.enable"),await e.send("DOM.enable"),await e.send("Overlay.enable"),await e.send("DOMSnapshot.enable"),await e.send("CSS.enable")}async send({method:e,params:t,timeout:r=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await D(this.cdpInitializingPromise,{milliseconds:r});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new R("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 D(this.session.send(e,t),{milliseconds:r,message:o??`Chrome command ${e} timed out after ${r}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,r=this.pageGetter(),o=await D(this.contextGetter().newCDPSession(r),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${r.url()})`),new R("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${r.url()})`)}});return this.logger.debug(`Created new CDP session for ${r.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 D(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 D(t.detach(),{milliseconds:1e3})}catch(r){this.logger.warn({err:r},"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}};import{mkdirSync as uO,rmSync as fb,statSync as mO}from"fs";import*as gp from"node:fs";import hO from"nodejs-file-downloader";import{tmpdir as gO}from"os";import wr,{basename as fO,dirname as SO}from"path";var fp="file://",hp=wr.join(gO(),"momentic","downloads"),mp=1e4,yO=50*1024*1024;async function Sb(n){let{uri:e}=n;return e.startsWith(fp)?wO(n):e.startsWith("http")?xO(n):vO(n)}function bO(n,e){let t=wr.join(hp,n,e.slice(fp.length)),r=wr.join(hp,n),o=t.startsWith(r);if(!gp.existsSync(t)||!o)throw new R("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function wO({uri:n,orgId:e}){let t=bO(e,n);return{filePath:t,cleanup:()=>{fb(SO(t),{recursive:!0,force:!0})}}}async function vO({uri:n}){let e=wr.resolve(n);if(!gp.existsSync(e))throw new R("UserConfigurationError",`The referenced file (${n}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function xO({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=fO(r.href),i=yp(o),a=wr.extname(i);if(Oh.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=Sp(t),l=new hO({url:n,fileName:i,directory:s,maxAttempts:2,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:mp}),{downloadStatus:c,filePath:d}=await D(l.download(),{milliseconds:mp,message:`Download timed out after ${mp}ms`});if(c!=="COMPLETE")throw new Error(`Download ended in non-success status: ${c}`);if(!d)throw new Error("File path of successfully downloaded file was empty");let u=mO(d).size;if(u>yO)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:u,filePath:d,fileName:i},"Downloaded file to disk");let m;return{filePath:d,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>fb(s,{recursive:!0,force:!0}),10*60*1e3)}}}function yb(n,e){return`${fp}${n}/${e}`}function Sp(n){let e=Math.random().toString(36).substring(4),t=wr.join(hp,n,e);return uO(t,{recursive:!0}),t}function yp(n){let e=wr.extname(n),t=wr.basename(n,e);return n=(t.length>100?t.slice(t.length-100):t)+e,n=n.trim().replaceAll(" ","_"),n}async function bn(n,e){try{return await n.evaluate(r=>window.serializeElementOnlyWithText?.(r,{truncateToLength:500}),void 0,{timeout:1e3})}catch(t){e.debug({err:t},"Failed to get HTML from locator for Playwright error translation");return}}async function bb(n,e){let t=n.evaluate(async()=>{let i=window,a={};try{let s=await indexedDB.databases();for(let l of s){if(!l.name)continue;let c=await i.exportIdbToObject?.(l.name,l.version);c&&(a[l.name]=c)}return[a,void 0]}catch(s){return[void 0,s.message]}}),[r,o]=await D(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),r}async function wb(n,e,t){if(e){t.debug("Importing indexedDB data");try{let r=n.evaluate(async o=>{let i=window;for(let[a,s]of Object.entries(o))await i.importObjectToIdb?.(a,s)},e);await D(r,{milliseconds:3e3})}catch(r){t.warn({err:r},"Failed to import indexedDB data")}}}async function vb(n,e){try{let t=n.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(r=>{r.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await D(t,{milliseconds:3e3})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function xb(n,e,t,r,o){try{await TO(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function TO(n,e,t,r){let o=r.text();o.length>Oa&&(o=o.slice(0,Oa)+"...(TRUNCATED)");let i=[];for(let a of r.args())try{let s=await a.jsonValue(),l=JSON.stringify(s);l.length>Oa?i.push(l.slice(0,Oa)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}bp(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function bp(n,e,t,r){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let a=0;a<t;a++)i[a]===void 0&&(i[a]=[])}i[t].length>sp&&(i[t]=i[t].slice(Math.floor(sp/2)),i[t]?.push({url:n.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...r,tabIndex:t,timestamp:o})}async function an({fn:n,codePath:e,logObject:t,signal:r,logger:o}){r?.throwIfAborted();let i=Date.now(),a=await aa({promiseGenerator:n,signal:r,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import{randomUUID as EO}from"crypto";var CO="[redacted due to size]",RO=1e4;async function Ab(n,e,t){let r=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[n]={id:n,startedDateTime:r,title:void 0,pageTimings:{}}}async function Ib(n,e,t,r){try{await AO(n,e,t)}catch(o){o.message.includes("browser has been closed")||r.warn({err:o,pageId:n},"Error handling new network request, skipping...")}}function ro(n){return n<0?0:n}function Tb(n){return{timings:{blocked:ro(n.domainLookupStart),dns:ro(n.domainLookupEnd-n.domainLookupStart),connect:ro(n.connectEnd-n.connectStart),send:ro(n.responseStart-n.requestStart),wait:0,receive:ro(n.responseEnd-n.responseStart),ssl:ro(n.connectEnd-n.secureConnectionStart)},total:ro(n.responseEnd)}}async function AO(n,e,t){let r=EO(),o=t.timing(),i=new URL(t.url()),a=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),s={...await Rb(t),url:i.toString(),method:t.method(),queryString:a,postData:await PO(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:s,timings:Tb(o).timings};Eb(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await LO(c)}catch{}let g={...await Rb(c),status:c.status(),statusText:c.statusText(),content:h,redirectURL:c.headers().location};l.response=g}let d;try{d=await t.sizes(),l.request.bodySize=d.requestBodySize,l.request.headersSize=d.requestHeadersSize}catch{}l.response&&d&&(l.response.bodySize=d.responseBodySize,l.response.headersSize=d.responseHeadersSize,l.response.content.size=d.responseBodySize);let p=t.timing(),{timings:u,total:m}=Tb(p);l.time=m,l.timings=u,Eb(e,l,r)}function Eb(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function Cb(n){try{return new Date(n).toISOString()}catch{return}}function IO(n){let e={name:"",value:""},t=!0;for(let r of n.split(/; */)){let o=r.indexOf("="),i=o!==-1?r.substring(0,o).trim():r.trim(),a=o!==-1?r.substring(o+1,r.length).trim():"";if(t){t=!1,e.name=Nn(i),e.value=Nn(a);continue}i==="Domain"&&(e.domain=Nn(a)),i==="Expires"&&(e.expires=Cb(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=Cb(Date.now()+ +a*1e3)),i==="Path"&&(e.path=Nn(a)),i==="Secure"&&(e.secure=!0)}return e}async function Rb(n){let e=await n.allHeaders(),t=e.cookie?.split(";").map(IO)??[];return{headers:Object.entries(e).map(([r,o])=>({name:Nn(r),value:Nn(o)})),cookies:t}}async function PO(n){let e=n.postData();if(!e)return;let t=await n.headerValue("content-type"),r={mimeType:t??"application/octet-stream",text:Nn(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,a]of o.entries())r.params.push({name:Nn(i),value:a?Nn(a):void 0})}return r}async function LO(n){return{mimeType:await n.headerValue("content-type")??void 0,text:Nn(await n.text()),encoding:await n.headerValue("content-encoding")??void 0}}function Nn(n){return n.length>RO?CO:n}function Pb(){return async n=>{let{fragment:e,code:t,context:r}=n,{env:o}=r||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function je({root:n,fn:e,arg:t,timeout:r,waitForPageLoad:o,codePath:i}){return await o(),await D(n.evaluate(e,t),{milliseconds:r,message:`Timed out ${i} after ${r}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}function wp(){return window.lastCursorPos}import{errors as OO}from"playwright-core";async function oo({func:n,action:e,logger:t,callbacks:r,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),s;for(;Date.now()-a<o;)try{return await n(i)}catch(l){let c=l;if(ea(c)){t.warn("Attempting to recover from removed data-momentic-ids by re-adding ids to DOM");let[d]=await Promise.all([n(i),r.getBrowserState({skipWaitForPageLoad:!0,skipWait:!0})]);return d}else if(c instanceof OO.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await MO(c,i.locator,r,t);else throw c}throw s instanceof R?s:new R("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function MO(n,e,t,r){return n.message.includes("attempt #")?NO(n,e,t,r):kO(n)}async function NO(n,e,t,r){let o=n.message.split(/- retrying \w+ action, attempt #\d+/).filter(l=>l.length>0);if(!o.length)return r.warn({err:n},"Failed to parse Playwright error message for translation, returning raw message"),n;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
|
|
3793
|
+
`,";").replace(/\s+/g," ");let a="",s=await bn(e,r);if(s&&(a=`Target element HTML: ${ze(s,100,!0)}`),i.includes("element is not enabled"))return new R("ActionFailureError",`The element you attempted to interact with was disabled for the entire timeout duration. Please explicitly wait for the element to be enabled, change the element description to target an interactive element, or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:n}});if(i.includes("intercepts pointer events")){let l="",c=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(c){let d=(await t.state.getRoot()).locator(`[data-momentic-id="${c}"]`),p=await bn(d,r);p&&(l=`Covering element HTML: ${ze(p,100,!0)}`)}return new R("ActionFailureError",`The element you attempted to interact with was covered by another element such as dropdown, popup, or dialog for the entire timeout duration. Please add a step to hide the covering element or turn on the 'disable stability checks' option. ${a}
|
|
3794
|
+
${l}`,{errOptions:{cause:n}})}if(i.includes("element is not visible")){let l="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let c=await e.boundingBox({timeout:1e3});c?c.height===0?l="The element you attempted to interact with has zero height.":c.width===0&&(l="The element you attempted to interact with has zero width."):l="The element you attempted to interact with has no bounding box."}catch{}return new R("ActionFailureError",`${l} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:n}})}return i.includes("element is outside of the viewport")?new R("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):n}function kO(n){let e=n.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new R("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:n}});return n}async function Lb(n){try{return await _O(n)}catch(e){n.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function _O({locator:n,logger:e}){let[t,r]=await n.evaluate(l=>[l.id,l.tagName.toLowerCase()],{timeout:1e3}),o=await bn(n,e),i=await n.boundingBox({timeout:1e3});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5)return;if(r==="input"&&t)try{let l=n.page().locator(`label[for=${JSON.stringify(t)}]`);return await l.waitFor({state:"visible",timeout:1e3}),{locator:l,relativePoint:void 0}}catch{}let a=await n.evaluate(l=>{let c=window,d=l.parentElement;if(!d)return{type:"error",error:"Input click target has no parent for redirection"};let p=l.getBoundingClientRect(),u=d.getBoundingClientRect();if(u.width===0||u.height===0)return{type:"error",error:"Parent element has no width or height"};let m={x:Math.min(Math.max(1,p.left-u.left),u.width-1),y:Math.min(Math.max(1,p.top-u.top),u.height-1)},g=c._MOMENTIC_FEATURE_FLAGS?.visual_actions?`[data-momentic-id=${JSON.stringify(l.getAttribute("data-momentic-id"))}]`:c.getMPath?.(l)?.join(" >");return g?{type:"result",selector:g,relativePoint:m,serializedForm:d.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:1e3});if(a.type==="error")throw new Error(a.error);let s=n.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:1e3}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var Mb=["date","datetime-local","month","time","week"],Ob={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function Nb(n){try{await D(DO(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function DO({root:n,text:e,options:t,logger:r,callbacks:o}){let i=(await je({root:n,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:1e3,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!Ob[i])return;Ob[i].test(e)&&r.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,r.debug("Transforming datetime input to use sequential key presses")}async function Rl({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await vp(e,r);let o=n.evaluate(i=>{let a=window;a.momenticIsEligible=p=>{let m=window.getComputedStyle(p,null).getPropertyValue("display");if(m==="none"||m==="contents")return!1;let h=p.getBoundingClientRect();return!(!h.height||!h.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let l=i.style.getPropertyValue("outline"),c=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let d=`momentic${Math.floor(Math.random()*1e7)}`;a[d]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",l,c),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[d](),a.removeHighlightFunctions?.[d]&&delete a.removeHighlightFunctions[d]},5e3)),a.removeHighlightFunctions[d]=a[d]},void 0,{timeout:r});return await D(o,{milliseconds:r}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function vp(n,e=1e3){let t=await n.state.getRoot();await je({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:n.waitForPageLoad,codePath:"removing element highlights"})}async function Tp(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return oo({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>xp({...n,targetingResult:t,useVisualClick:e})})}async function zO(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await HO(n,e)}catch(r){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:r,originalError:n},"Error handling click error, rethrowing original error"),n):r}}async function HO(n,e){let{logger:t,redirectionAttempts:r=0,browserCallbacks:o,actionSource:i}=e,a=e.targetingResult.locator,s=o.state.getDomGraph();if(n.message.includes("label")&&n.message.includes("for=")&&n.message.includes("intercepts pointer events")){let l=await a.getAttribute("id",{timeout:1e3});if(!l)throw n;let c=a.page().locator(`[for=${JSON.stringify(l)}]`);return await c.waitFor({state:"visible",timeout:1e3}),t.warn({err:n},"Attempting locator redirection due to input being covered by label"),xp({...e,targetingResult:{locator:c},redirectionAttempts:r+1})}else if(i==="click"&&s&&n.message.includes("intercepts pointer events")){t.warn({err:n},"Attempting locator redirection due to covering error");let l=await VO(a,s,t);if(l)return xp({...e,targetingResult:{locator:l},redirectionAttempts:r+1});throw t.error({err:n},"No updated locator could be found to fix covering error, rethrowing"),n}else throw t.error({err:n},"Click error does not match any known recoverable patterns, rethrowing"),n}async function jO(n){let{browserCallbacks:e,logger:t,targetingResult:r,position:o,options:i}=n,a=await e.state.getRoot(),s=a&&a!==r.locator.page()&&"frameElement"in a?await a.frameElement():null,l;try{l=s?await Vr({promiseGenerator:async()=>s.boundingBox(),timeoutMs:3e3,logger:t}):null}catch(m){throw new R("UserInfrastructureError",`The frame containing the element Momentic was instructed to interact with was removed. Error: ${m.message}`)}finally{await s?.dispose()}let c=Date.now(),{clickX:d,clickY:p,reason:u}=await WO({frameCoordinates:l,logger:t,targetingResult:r,position:o,options:i});t.debug({frameCoordinates:l,position:o,targetingResultHints:r.hints,options:i,clickLocation:{clickX:d,clickY:p,reason:u},duration:Date.now()-c},"Visual click")}async function $O(n){let{actionSource:e,targetingResult:t,options:r,logger:o}=n,i=n.targetingResult.locator,a=r?.relativePosition??n.position;if(e==="click"&&!a){let l=await Lb({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=r?.force||t.hints?.force||!1;try{r?.doubleClick?await i.dblclick({button:r.rightClick?"right":"left",timeout:3e3,position:a,delay:r?.delayMs??25,force:s}):await i.click({button:r?.rightClick?"right":"left",timeout:3e3,position:a,delay:r?.delayMs??25,force:s})}catch(l){let c=l;if(KO(c))o.warn({err:c},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:c},"Error clicking on locator, attempting to recover..."),zO(c,{...n,targetingResult:{...i,locator:i}})}}async function xp(n){let{options:e,logger:t,browserCallbacks:r,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=n,s;e?.waitForDownload&&(s=(async()=>{let l=e.downloadTimeoutMs??3e4;try{return await a.locator.page().waitForEvent("download",{timeout:l})}catch(c){return c instanceof BO.TimeoutError?new R("ActionFailureError",`Download did not complete in ${l}ms`):new R("ActionFailureError",`Download failed: ${c.message}`)}})());try{await Rl({locator:a.locator,callbacks:r,logger:t,timeoutMs:1e3})}catch(l){t.warn({err:l},"Error highlighting locator in click, continuing...")}if(i?await jO(n):await $O(n),e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new R("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let l=await D(s,{milliseconds:e.downloadTimeoutMs??3e4});if(l instanceof Error)throw l;return{downloadedFile:await qO(l,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function GO(n,e){if(e.hints?.clickableXY){let i=(n?.x??0)+e.hints.clickableXY.x,a=(n?.y??0)+e.hints.clickableXY.y;return[{x:i,y:a},"targeting hint"]}let t=await e.locator.boundingBox({timeout:1e3});if(!t)throw new R("ActionFailureError","Element does not have a bounding box");let r=t.x+t.width/2,o=t.y+t.height/2;return[{x:r,y:o},"halfway point of the bounding box"]}async function WO({frameCoordinates:n,logger:e,options:t,targetingResult:r,position:o}){let i,a,s;if(o){let p=await r.locator.boundingBox({timeout:3e3});i=(n?.x??0)+(p?.x??0)+o.x,a=(n?.y??0)+(p?.y??0)+o.y,s="predefined position"}else{let[p,u]=await GO(n,r);i=p.x,a=p.y,s=u}let l=r.locator.page(),c=t?.rightClick?"right":"left",d=t?.delayMs??25;return t?.doubleClick?await l.mouse.dblclick(i,a,{button:c,delay:d}):await l.mouse.click(i,a,{button:c,delay:d}),{clickX:i,clickY:a,reason:s}}async function VO(n,e,t){let r=await n.evaluate(s=>s.getAttribute("data-momentic-id"));if(!r)return;let o=Tl(r,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[kt]??"");if(isNaN(i))return;n=n.page().locator(`[data-momentic-id="${i}"]`);let a=await bn(n,t);return t.warn({candidateMomenticId:i,serializedHtml:a},"Trying new locator based on parent-direction after covering error"),n}async function qO(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=yp(n.suggestedFilename()),i=e();await n.saveAs(UO(i,o)),_b(r,{force:!0}),setTimeout(()=>{_b(i,{recursive:!0,force:!0})},5*60*1e3);let a=yb(FO(i),o);return t.debug({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function KO(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as YO}from"os";var JO={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function XO(){let n=YO();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function Db(n){return JSON.stringify(n.split("+").sort())}function Fb(n){let e=XO(),t=Db(n);for(let r of Object.values(JO))if(Object.values(r).some(o=>Db(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function Ep({frame:n,page:e,deltaX:t,directionX:r,deltaY:o,directionY:i,signal:a,callbacks:s,logger:l}){if(!t&&!o)return;let c=r==="left"?-1:1,d=i==="up"?-1:1;if(n)await je({root:n,fn:([p,u,m,h])=>window.scrollTo(window.scrollX+(p??window.innerWidth)*m,window.scrollY+(u??window.innerHeight)*h),arg:[t,o,c,d],waitForPageLoad:s.waitForPageLoad,timeout:2e3,codePath:"scrolling page"});else{let p=e.viewportSize()||Vt,u=await je({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:2e3,codePath:"computing page height"}),[m,h,g]=await je({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let S=f.getBoundingClientRect();return[f.scrollTop,S.x,S.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:2e3,codePath:"computing active element position"});await e.mouse.wheel((t??p.width)*c,(o??p.height)*d);try{let f=Date.now();for(;Date.now()-f<2e3;){a?.throwIfAborted();let S=await D(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[w,v,b]=await D(e.evaluate(()=>{let T=document.activeElement;if(!T)return[void 0,void 0,void 0];let C=T.getBoundingClientRect();return[T.scrollTop,C.x,C.y]}),{milliseconds:1e3});if(S===u&&w===m&&v===h&&b===g)break;u=S,m=w,h=v,g=b,await ne(500)}}catch(f){l.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Cp(n,e){let t,r;for(let o=0;o<4;o++)try{return t=n.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){r=i,await ne(500)}throw new Error(`Failed to get tab titles after all retries: ${r?.message}`)}var mi="<empty>";function ZO(n){return n.includes("doubleclick.net")||n.includes("googletagmanager.com")||n.includes("googlesyndication.com")||n.includes("s.amazon-adsystem.com")||n.includes("smartadserver.com")||n.includes("omnitagjs.com")||n.includes("x.adroll.com")}function Bb(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||ZO(n.url)}async function QO(n,e){let t=await n.send({timeout:3e3,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await n.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await n.send({timeout:3e3,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function hi({cdpClient:n,page:e,logger:t}){let r={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([n.send({timeout:3e3,method:"Page.getFrameTree",params:{}}),n.send({timeout:3e3,method:"DOM.getDocument",params:{depth:0}})]),c=(i.frameTree.childFrames??[]).map(async(p,u)=>{if(Bb(p.frame))return null;try{return await zb({cdpClient:n,rawFrameTree:p,indices:[u],parent:r,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),d=await Promise.all(c);return r.childFrames=d.filter(p=>p!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),r}async function zb({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o,logger:i}){let a=e.frame.id,s=await QO(n,a),l=s.attributes??[],c=null,d=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=br(l,h);g&&(d.push(`${h}=${JSON.stringify(g)}`),h==="src"&&(c=g))}let p={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:d},src:c,childFrames:[],parent:r,domNode:s},m=(e.childFrames??[]).map(async(h,g)=>{if(Bb(h.frame))return null;try{return await zb({cdpClient:n,rawFrameTree:h,indices:[...t,g],parent:p,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${g} of frame with url ${e.frame.url}): ${f}`),null}});return p.childFrames=(await Promise.all(m)).filter(h=>h!==null),p}async function eM(n){try{return await n.owner().count()===1}catch{return!1}}async function tM(n){try{return await n.count()===1}catch{return!1}}async function kn(n,e){let t=[],r=n;for(;r.parent.type==="frame";)t.push(r.parent),r=r.parent;t.reverse();let o=e,i=[];for(let c of t){let d=!1;for(let p of[...c.locationData.attributeSelectors,mi]){let u=o.frameLocator(p===mi?"iframe":`iframe[${p}]`);if(await eM(u)){d=!0,o=u,i.push(p);break}}if(!d)throw new R("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${c.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let c of[...n.locationData.attributeSelectors,mi]){let d=o.locator(c===mi?"iframe":`iframe[${c}]`);if(await tM(d)){a=d,i.push(c);break}}if(!a)throw new R("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${n.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(c=>c,{timeout:1e3}),l=await s.asElement().contentFrame();if(!l)throw new R("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${n.url}'`);return await s.dispose(),{frame:l,mPathSelectorTokens:i}}function Ub(n,e){let t=[...n],r=[];for(;t.length;){let o=t.shift();e(o)&&r.push(o),t.push(...o.childFrames)}return r}async function Hb({page:n,frameTree:e,cache:t}){let r,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let d=0;d<t.mPathSelectorTokens.length-1;d++){let p=t.mPathSelectorTokens[d];p===mi?s=s.length===1?s[0].childFrames:[]:s=s.filter(u=>u.locationData.attributeSelectors.includes(p)).map(u=>u.childFrames).flat()}let l=[],c=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(c===mi?l=s:l=s.filter(d=>d.locationData.attributeSelectors.includes(c)),l.length===1)return r=l[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await kn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),l=Ub(o,c=>!!c.src&&s.test(c.src));if(l.length===1)return r=l[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await kn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),l=Ub(o,c=>!!c.url&&s.test(c.url));if(l.length===1)return r=l[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await kn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${l.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(r=a[t.indices[t.indices.length-1]],r)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await kn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Cn("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function Al(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function Rp(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function jb(n){let e=Rp(n),t=n.src??"",r=n.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:r}}function $b(n){return n.type==="auto"?{type:"auto",frameId:n.handle.frameId,url:n.handle.url,src:n.handle.src??"",mPathSelectorTokens:n.mPathSelectorTokens.join(" > ")}:{type:"url",url:n.url}}async function Gb({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await nM({frameElementHandle:r,logger:e,signal:t})}catch(o){e.warn({err:o},"Failed to scroll iframe into view, continuing...")}finally{await r?.dispose()}}async function nM({frameElementHandle:n,logger:e,signal:t}){let r=await n.boundingBox();if(!r){e.warn("Active frame element has null bounding box, skipping scroll");return}await Vr({promiseGenerator:async()=>n.evaluate(async(i,{x:a,y:s})=>{window.scrollTo(window.scrollX+a,window.scrollY+s);let l=Date.now(),c,d,p;for(;Date.now()-l<1500;){let u=document.activeElement,m,h,g;if(!u)m=void 0,h=void 0,g=void 0;else{let f=u.getBoundingClientRect();m=u.scrollTop,h=f.x,g=f.y}if(c!==void 0&&d!==void 0&&p!==void 0&&m===c&&h===d&&g===p)break;c=m,d=h,p=g,await new Promise(f=>setTimeout(f,250))}},r),timeoutMs:2e3,codePath:"scrollIframeIntoView",signal:t}),e.info({bb:r},"Successfully scrolled iframe into view")}async function Wb({event:n,transformer:e,enricher:t,frame:r,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:l}=n.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"),!l)return;let c=r.parentFrame()?r.url():void 0,p=r.page().frames().map(h=>h.url());i.debug({frameUrl:c,...n},"Passive click event captured on element");let u,m;if(c)try{let h=await r.frameElement();u=await D(h?.boundingBox(),{milliseconds:1e3})??void 0;let g=await t.constructIframeRegex({urls:p,srcs:[],desiredUrl:c});if(g.urlRegex)m={type:"url",url:`/${g.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(g)}`)}catch(h){i.warn({err:h},"Failed to construct iframe details for recorded action, using hardcoded URL only"),m={type:"url",url:c}}(async()=>{try{await e.recordElementAction({...n,screenshotBase64:o,frameConfig:m,frameBoundingBox:u})}catch(h){i.error({err:h},"Failed to transform passive click action")}})()}import{randomUUID as _n}from"crypto";import rM from"js-beautify";var oM=["Shift","CapsLock","Dead","Meta","AudioVolumeUp","AudioVolumeDown"];var Il=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:r,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,l)=>{this.recordedSteps.set(l,{step:s}),t.onStepRecorded(s,l)},onActionReceived:(s,l)=>{this.recordedSteps.set(l,{step:s}),t.onActionReceived?.(s,l)}},this.generator=r}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:_n(),type:"PRESET_ACTION",command:zn(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:r,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=r.properties.attributes.nodeOnlySerializedHtml.trim(),l=s,c;switch(e.frameConfig?e.frameBoundingBox?c={x:e.frameBoundingBox.x+r.properties.boundingBox.x,y:e.frameBoundingBox.y+r.properties.boundingBox.y,width:r.properties.boundingBox.width,height:r.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):c=r.properties.boundingBox,t){case"CLICK":{i="CLICK";let g=zn(i);a={id:_n(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}case"SELECT":{i="SELECT_OPTION";let g=zn(i);a={id:_n(),type:"PRESET_ACTION",command:{...g,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:l},cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let g=zn(i);a={id:_n(),type:"PRESET_ACTION",command:{...g,target:{type:"description",elementDescriptor:l},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...r.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:c}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let d;e.offset===void 0?(d=this.nextStepOffset,this.nextStepOffset++):d=e.offset,this.callbacks.onActionReceived?.(a,d);let p=e.target.browserState;try{p=rM.html(p,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),p=Jy(p,"data-momentic-interacted",4e4)}catch{}let u;try{u=(await this.generator.getReverseMappedDescription({target:p,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:r.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...Ue(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),u=s}let m=this.recordedSteps.get(d)?.step??a,h=m?.command;h&&"target"in h&&h.target?(h.target={type:"description",elementDescriptor:u},this.callbacks.onStepRecorded({...m,command:h},d)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:r}=e;if(oM.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let p=zn("TYPE");i={id:_n(),type:"PRESET_ACTION",command:{...p,target:void 0,value:t,clearContent:!1}}}else{let p=zn("PRESS");i={id:_n(),type:"PRESET_ACTION",command:{...p,value:t}}}let a,s=this.nextStepOffset-1,l=this.recordedSteps.get(s),c=l?.step,d=c?.command;if(r){if(d?.type===i.command.type){let p=d.value,u=i.command.value;i={id:_n(),type:"PRESET_ACTION",command:{...d,value:i.command.type==="PRESS"?`${p}+${u}`:`${p}${u}`}},a=s}else if(d?.type==="CLICK"&&i.command.type==="TYPE")c.command={...i.command,target:d.target,cache:d.cache},i=l.step,a=s;else if(d?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let p=d.value;i={id:_n(),type:"PRESET_ACTION",command:{...d,value:p.slice(0,p.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,l;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,l=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,l=a):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_DOWN":"SCROLL_UP",d=zn(c);d.deltaY=Math.abs(i);let p={id:_n(),type:"PRESET_ACTION",command:d};this.callbacks.onStepRecorded(p,l)},r=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,l;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,l=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,l=a):(l=this.nextStepOffset,this.nextStepOffset++);let c=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",d=zn(c);d.deltaX=Math.abs(i);let p={id:_n(),type:"PRESET_ACTION",command:d};this.callbacks.onStepRecorded(p,l)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(r(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&r())}};var Pl=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;showZeroOpacityElements;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;flagStore;enricher;iconKnowledgeBase;activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,showZeroOpacityElements:r,allowPartialAccessibilityTree:o,logger:i,cdpClient:a,pageGetter:s,flagStore:l,abortSignalGetter:c,enricher:d,iconKnowledgeBase:p}){this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.showZeroOpacityElements=r,this.allowPartialAccessibilityTree=o,this.logger=i,this.cdpClient=a,this.pageGetter=s,this.flagStore=l,this.abortSignalGetter=c,this.enricher=d,this.iconKnowledgeBase=p}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))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(),r=Rp(e),{frame:o,mPathSelectorTokens:i}=await kn(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:r,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),r=await hi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await Hb({page:t,frameTree:r,cache:e});return this.logger.debug({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(Al(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 r;return this.frameConfig.type==="url"?r=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):r={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Al(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await Gb({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await hi({cdpClient:this.cdpClient,page:r,logger:this.logger}),i=[D(r.evaluate(e,t),{milliseconds:2e3})],a=Array.from(o.childFrames);for(;a.length>0;){let l=a.shift(),c=l.url;c==="about:blank"||c.startsWith("chrome-error://")||(a.push(...l.childFrames),i.push(kn(l,r).then(({frame:d})=>D(d.evaluate(e,t),{milliseconds:2e3})).catch(d=>(this.logger.warn({err:d,frameUrl:l.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(l=>l!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await hi({cdpClient:this.cdpClient,page:e,logger:this.logger}),r=Array.from(t.childFrames),o=[];for(;r.length>0;){let i=r.shift();r.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:r}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:r??this.logger})}async getA11yTree(e){let t={},r=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,l=null;if(this.frameConfig?.type==="url"){if(a=await an({fn:()=>this.resolveActiveFrameConfig({logger:r,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:r})??void 0,!a)throw new R("ActionFailureError","Got null frame details despite active frame config");s=a.handle,l=s.frameId}else this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")?(s=await an({fn:()=>hi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:r}),l=null):(s={type:"root",page:i,childFrames:[]},l=null);await an({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:r}),codePath:"addIdsToElement",logObject:t,signal:o,logger:r});let c=await an({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:r}),codePath:"domFetch",logObject:t,signal:o,logger:r}),d=await an({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:l,childFrames:s.childFrames,logTimings:t,logger:r,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:r}),{tree:p}=await an({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:d,domGraph:c,startingFrameId:l,frameContext:s,logger:r,iconKnowledgeBase:this.iconKnowledgeBase}),codePath:"a11yProcess",logObject:t,signal:o,logger:r});return Object.values(t).some(u=>u>750)&&r.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=p.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=p.dataMomenticIdMap,this.lastA11yTreeRoot=p.root,this.lastDomGraph=c,this.lastSelectorToNodeMap=p.selectorToNodeMap,p}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:Br,filterByViewport:!1}),Math.random()<.1){let r=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:r&&r.length>4e5?"REDACTED_DUE_TO_SIZE":r},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:r}){if(r.backendNodeId===void 0)throw new Error(`Node with a11y id ${r.id} has no backend node ID: ${r.getNodeOnlySerializedForm()}`);if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let o=this.domGraph?.backendIdToNode[r.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${r.backendNodeId}`);let i=rb({node:o,domGraph:this.domGraph});return ob(e,i)}else return this.getLocatorFromBackendId(t,r.backendNodeId)}async getLocatorFromBackendId(e,t){let r=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:2e3});if(!r||!r.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await ib(this.cdpClient,r.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(r.object)},"Failed to get ID attribute"),i}return e.locator(`[${kt}="${o}"]`)}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let r=e.split(" > "),o="";for(let i=r.length-1;i>=0;i--){let a=r.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:r=this.logger}){let o=Date.now(),i,a,s,l=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await hi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),a=await this.getMatchingFrameByUrlWithCdp(i,e),r.debug({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(c){if(s=c,c instanceof R&&c.reason==="UserInfrastructureError")throw c;l%3===0&&this.logger.debug({attempt:l,err:c},"Failed to resolve active frame, retrying..."),await ne(500,t)}finally{l++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Al(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let r=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),l=s.domNode;i.push(...s.childFrames);let c=br(l.attributes??[],"src"),d=l.contentDocument?.documentURL;if(!c&&!d){this.logger.debug("Skipping frame with no URL or src");continue}for(let p of[c,d])if(p){if(r.startsWith("/")&&r.endsWith("/")){if(new RegExp(r.slice(1,-1)).test(p)){a.push({handle:s,matchType:"regex",...await kn(s,o)});break}}else if(r.trim()===p.trim()){a.push({handle:s,matchType:"url",...await kn(s,o)});break}}}if(a.length===1){let s=a[0];return this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${r}'. Please use a more specific selector.`):new R("ActionFailureError",`Failed to find frame with src matching: ${r}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:r,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s}){let l=await hb({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:r,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:this.showZeroOpacityElements,filterByViewport:e.filterByViewport,viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.flagStore.isBooleanFlagEnabled("visual_actions")});if(!l||!l.root)throw new Error("Accessibility tree appears empty");return{tree:l}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:r,logger:o}){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return;let i=await this.addMomenticIdsHelper(r??e,1);if(!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||r)return;let a=Array.from(t),s=[];for(;a.length>0;){let l=a.shift();a.push(...l.childFrames);let c=async()=>{try{let{frame:d}=await kn(l,e);i=await this.addMomenticIdsHelper(d,i)}catch(d){l.url!=="about:blank"&&o.warn({err:d},"Error adding momentic IDs to child frame, continuing...")}};s.push(c())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return t;let r=this.logger;return await je({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:2e3,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){r.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 r=t.hostname.split("."),o=r.length>2?r.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:r}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:r.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 ${r.frameId} with url ${r.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(br(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let r=br(t,"style");if(r?.includes("display: none")||r?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:3e3,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:3e3,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:r,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 l,c;for(let m=0;m<3;m++)try{c=await an({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,signal:a,logger:i});break}catch(h){l=h,i.warn({err:h},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!c)throw new Error(`Failed to fetch accessibility tree for root page: ${l}`);let d={};if(d[t??"root"]=c,!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes"))return d;let p=Array.from(r),u=[];for(;p.length>0;){let m=p.shift();try{let{shouldUnroll:g}=await this.decideChildFrameUnrollEligibility({handle:m,warnings:s});if(!g)continue}catch(g){if(g.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: ${g}`)}p.push(...m.childFrames);let h=async()=>{try{let g=await an({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,signal:a,logger:i});d[m.frameId]=g}catch(g){i.warn({err:g,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};u.push(h())}return await Promise.all(u),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),d}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:r}){let o;if(this.allowPartialAccessibilityTree)o=(await an({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:r,signal:this.abortSignalGetter(),logger:this.logger})).nodes;else{let a=(await an({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:2e3}),codePath:"cdp-get-root-ax-node",logObject:r,signal:this.abortSignalGetter(),logger:this.logger})).node.backendDOMNodeId;o=(await an({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:r,signal:this.abortSignalGetter(),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:r}){let o,i=0;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:xl},timeout:3e3}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(a){await ne(500,t),r.debug({err:a},"Error fetching DOM tree"),i++}if(!o||!o.documents.length)throw new R("InternalWebAgentError","Got empty DOM snapshot with no documents");return nb({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=jb(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(r);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:r},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function Vb(n){return async(e,t)=>{let r=await t.allHeaders();for(let{key:o,value:i,matcher:a}of n)(!a||a.test(t.url()))&&(r[o]=i);await e.continue({headers:r})}}var Ip=gi(Lp(),"momentic","chromium"),CM=gi(Lp(),"video"),Ml=process.env.TWO_CAPTCHA_KEY,Pp=xM(Zb);Pp.use(TM({provider:{id:"2captcha",token:Ml},visualFeedback:!0}));var Dn=class n{static USER_AGENT=vM["Desktop Chrome"].userAgent;abortSignal=void 0;contextInitialized=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;clientCallbacks;iconKnowledgeBase;lastIconKnowledgeBaseUpdateTime=0;mockedServices;cdpClient;debugData={logsPerPage:[],harPages:{},harEntries:{}};recentFrameNavigations={};requestRecorders={};customHeaders=[];enricher;storage;flagStore;logger;stateManager;transformer;lastScreenshotForRecording=void 0;baseUrl;originsVisited=new Set;viewport;videos=[];constructor({storage:e,flagStore:t,enricher:r,browser:o,context:i,page:a,baseUrl:s,logger:l,mockedServices:c,userBrowserSettings:d,viewport:p,properties:u,clientCallbacks:m,iconKnowledgeBase:h}){if(Og(d),this.mockedServices=c,this.storage=e,this.flagStore=t,this.enricher=r,this.browser=o,this.context=i,this.page=a,this.baseUrl=s,this.logger=l,this.userControlledBrowserSettings=d,this.viewport=p||Vt,this.properties=u,this.clientCallbacks=m,u.recordVideo){let g=this.page.video();g&&this.videos.push(g)}this.iconKnowledgeBase=h}registerAbortSignal(e){this.abortSignal=e}async initialize(){if(this.contextInitialized)return;this.userControlledBrowserSettings.extraHeaders&&await this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders),await this.context.grantPermissions(["clipboard-read","clipboard-write","microphone","camera","geolocation"]);let e=this.flagStore.getAllFlags(),t=[this.context.addInitScript({content:$y.htmlUtilsLibJs}),this.context.addInitScript({content:`window._MOMENTIC_BROWSER = true; window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(e)}; window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`})];await this.context.route("**/*",Vb(this.customHeaders));let r=Promise.all(Object.entries(this.mockedServices).map(([a,s])=>this.context.route(a,l=>s.handle(l)))),o=a=>this.handleNewPageEvent(a);this.context.on("page",o),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",o)});let i=Promise.all(t);await Promise.all([i,r]),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&SM()==="darwin"&&dM("system_profiler SPDisplaysDataType").toString().includes("Retina")?(y.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2):this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio)),this.cdpClient=await Cl.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),await this.initializeScreencast(),this.stateManager=new Pl({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,flagStore:this.flagStore,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,showZeroOpacityElements:this.userControlledBrowserSettings.showZeroOpacityElements??!1,iconKnowledgeBase:this.iconKnowledgeBase}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&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&&(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,r=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=r,this.clientCallbacks?.onScreencastFrame?.(r,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init({baseUrl:e,logger:t,storage:r,flagStore:o,enricher:i,mockedServices:a,userBrowserSettings:s,contextArgs:l,browserbaseConnectUrl:c,recordVideo:d,iconKnowledgeBase:p,callbacks:u}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let m;switch(s.browserType){case"Google Chrome":m="chrome";break;case"Chrome for Testing":m=void 0;break;case"Chromium":m="chromium";break;default:m="chromium";break}let h={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:m},g={...l??{},geolocation:l?.geolocation||Mo,locale:l?.locale||Lo,timezoneId:l?.timezoneId||Oo,colorScheme:l?.colorScheme,httpCredentials:s.basicAuthorization?{username:s.basicAuthorization.username??"",password:s.basicAuthorization.password??""}:void 0,javaScriptEnabled:s.disableJavaScript?!1:void 0,userAgent:s.userAgent??n.USER_AGENT,viewport:l?.viewport??Vt},f=["--disable-dev-shm-usage","--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream"],S=null,w,v,b={systemDevicePixelRatio:l?.deviceScaleFactor,recordVideo:d,isNewHeadless:!1};(s.browserType==="Chromium"||s.browserType==="Google Chrome")&&(b.isNewHeadless=!0,h.headless&&f.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&f.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`),s.disableGpu&&f.push("--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-audio-input","--disable-audio-output");let T=s.localChromeExtensionPaths?.map(A=>A.startsWith("~")?gi(Lp(),A.slice(1)):A);if(T?.length){if(s.browserType==="Chrome for Testing")throw new R("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let j of T){let U=gi(j,"manifest.json");if(!Ol(U))throw new R("UserConfigurationError",`Chrome extension path ${U} does not exist.`)}let A=gi(Ip,`momentic-session-${Date.now()}`);if(!Ol(A))try{pM(A,{recursive:!0})}catch(j){throw new R("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Ip} folder: ${j}`)}let k=[...f],L=T.map(j=>wM(j)).join(",");k.push(`--disable-extensions-except=${L}`),g?.deviceScaleFactor&&k.push(`--force-device-scale-factor=${g.deviceScaleFactor}`,`--device-scale-factor=${g.deviceScaleFactor}`),g.viewport&&k.push(`--window-size=${g.viewport.width},${g.viewport.height}`),w=await Zb.launchPersistentContext(gi(Ip,`momentic-session-${Date.now()}`),{...h,...g,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:k,baseURL:e}),t.debug({sharedContextOptions:g,sharedBrowserOptions:h,userBrowserSettings:s,chromeArgs:k,flags:o.getAllFlags()},"Browser initialization context args (persistent)"),v=w.pages()[0]}else if(c){S=await Pp.connectOverCDP(c);let A=S.contexts()[0];if(!A)throw new Error("Failed to get browserbase default context");let k=A.pages()[0];if(!k)throw new Error("Failed to get browserbase default page");w=A,v=k}else{S=await Pp.launch({...h,args:f});let A={...g,baseURL:e,recordVideo:d?{dir:CM}:void 0};w=await S.newContext(A),t.debug({contextArgs:A,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:s,flags:o.getAllFlags()},"Browser initialization context args (standard)"),v=await w.newPage()}let C=new n({browser:S,context:w,page:v,baseUrl:e,logger:t,storage:r,flagStore:o,mockedServices:a||{},enricher:i,userBrowserSettings:s,viewport:g.viewport||Vt,properties:b,clientCallbacks:u,iconKnowledgeBase:p});return await C.initialize(),C}async handleAvailableTabsChangeHelper(){try{let e=await Cp(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 r=Yb(),o=`${e}-${r}`,i=Date.now(),a=!1,s=async()=>{try{await D(t(),{signal:this.abortSignal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],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.debug({url:e.url()},"Detected active page was closed, switching to another tab");let r=this.context.pages();for(let o=r.length-1;o>=0;o--){let i=r[o];if(!(!i||i.isClosed()||!qr(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();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let r=e.video();r&&this.videos.push(r)}try{this.handleNewPageEventHelper(e)}catch(r){this.logger.warn({err:r},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Yb(),r="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);e.on("console",a=>{xb(e,o,this.debugData,a,this.logger)}),e.on("request",a=>{Ib(t,this.debugData,a,this.logger),this.recordRequest(a)});let i=async()=>{await Ab(t,this.debugData,e),await this.loadFrameAndRecordUrl({root:e,codePath:r}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(r,async()=>i())}async handleCollectSvgs(e){if(!this.flagStore.isBooleanFlagEnabled("icon_knowledge_base")||this.page.isClosed()||this.page.mainFrame()!==e||!this.iconKnowledgeBase||!this.clientCallbacks?.onSvgsCollected||Date.now()-this.lastIconKnowledgeBaseUpdateTime<5e3)return;this.lastIconKnowledgeBaseUpdateTime=Date.now();let t=await this.stateManager.getDomGraph({devicePixelRatio:this.devicePixelRatio}),r=ab({domGraph:t,flagStore:this.flagStore,logger:this.logger,existingHashes:this.iconKnowledgeBase});if(r.forEach(s=>{this.iconKnowledgeBase[s.hash]=s}),!r.length)return;let o=Ue(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:fM()};for(let s of["runId","testId"])o[s]&&(i[s]=o[s]);let a={metadata:i,newSvgs:r};this.clientCallbacks.onSvgsCollected(a)}handleFrameNavigationEvent(e){let t=e.url(),r=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)}-${r}`;if(!t||t==="about:blank"||!qr(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,signal:this.abortSignal}),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},"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 r={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(r[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},r)}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()},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){for(this.abortSignal=void 0,this.debugData.logsPerPage=[],this.debugData.harPages={},this.debugData.harEntries={},this.pageLoadPromises={};this.videos.length>0;)this.videos.pop();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 D(vp(this.getBrowserCallbacks()),{milliseconds:1e3})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 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.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,r){let o=Date.now(),i=0,a=0;for(;Date.now()-o<8e3;){a++,r?.throwIfAborted();try{if(await je({fn:()=>{let l=window;return!!(l.generateCssSelectors&&l.evaluateCssSelectors&&l.generateHtmlCacheAttributes&&l.ldist)},timeout:1e3,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 ne(500),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),je({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:3e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],r=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{r.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 r)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:r=!1}=e,o=Date.now(),i=this.page.url();r&&await this.stabilizePageForScreenshot();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.debug({err:a,pageUrl:i},"Failed taking screenshot, retrying..."),await ne(250),this.screenshot({...e,retries:t-1})}finally{Date.now()-o>1e3&&this.logger.warn({pageUrl:i,duration:Date.now()-o},"Screenshot took longer than expected"),r&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:r,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??2e3}),l=Buffer.from(s.data,"base64"),c=await Jb.fromBuffer(l),{width:d,height:p}=this.getViewport();if((c.bitmap.width!==d||c.bitmap.height!==p)&&(l=await c.resize({w:d,h:p}).getBuffer("image/jpeg")),r&&mM(r,l),this.lastScreenshotForRecording=l,!e)return l;let u=await e.boundingBox({timeout:1e3});if(!u)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:h,width:g,height:f}=u;if(!g||!f)throw new Error("Attempted to screenshot an element with zero width or height");if(m<0||h<0)throw new Error("Attempted to screenshot an element with negative coordinates");m=Math.floor(m),h=Math.floor(h),g=Math.floor(g),f=Math.floor(f);try{l=await(await Jb.fromBuffer(l)).crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}return"dispose"in e&&await e?.dispose(),l}getViewport(){return this.viewport}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:r=this.pageLoadTimeout}){Mf(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 l=0;l<3;l++)try{await this.page.goto(e,{timeout:r,waitUntil:"domcontentloaded"}),i=!0;break}catch(c){if(a=c,this.abortSignal?.throwIfAborted(),this.logger.warn({err:c},`Error occurred during navigation${l===0?", retrying...":" (fatal)"}`),await ne(500),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:1e3})}if(!i)throw new R("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.debug({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(Xy.has(s))throw new R("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);if(t)try{await this.exposeRecordingBindings()}catch(l){l instanceof Error&&l.message.includes("already registered")||this.logger.error({err:l},"Failed to install Momentic libraries for action recording")}await this.fixViewportForNewHeadless()}async type(e,t={},r=!1){await this.directTypeHelper(e,t,r)}async getActiveElement(e){try{return await je({root:e,fn:()=>{let r=document.activeElement?.textContent??void 0;return r&&r.length>100&&(r=r.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:r}:void 0},arg:void 0,timeout:1e3,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={},r=!1){let o=await this.getActivePageOrFrame();await Nb({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(r){let a=Date.now();for(;Date.now()-a<this.smartWaitingTimeout&&(!i||i.tag==="body");)await ne(250),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"?(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.warn({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??Hu}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoView(e){try{await e.scrollIntoViewIfNeeded({timeout:2e3})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async r=>{let o=r.scrollTop;r.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=r.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:2e3})}catch(r){this.logger.warn({err:r},"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 Rl({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),r=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:r,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),r=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:1e3}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),r=[...this.context.pages()];for(let o=0;o<r.length;o++){let i=r[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await vb(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.debug(`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.debug(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:1e3});let r=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:1e3,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),r++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.debug(`Loaded ${r} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await wb(this.page,o,this.logger),this.logger.debug(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,r=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await bb(this.page,this.logger),o}catch(o){if(r=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:r},"Failed to save auth state after 2 retries"),new R("ActionFailureError",`Failed to save auth state: ${r?.message}`)}async getOpenPages(e){return Cp(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,t.serializedForm=e.getSerializedFormWithContext(),t.nodeOnlySerializedForm=e.getNodeOnlySerializedForm()}async updateCacheWithNewNodeDetails({node:e,target:t,locator:r,forceSaveNewCssSelectors:o,logger:i=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),r)try{let a=await this.fetchHtmlAttributes({locator:r,logger:i}),s=!1;for(let l of["generatedSelectors","serializedHtml","nodeOnlySerializedHtml","hybridSelector"]){let c=a?.[l];if(c&&!t[l]){s=!0;break}if(c&&JSON.stringify(c)!==JSON.stringify(t[l])){s=!0;break}}a&&(o||s)&&(t.generatedSelectors=a.generatedSelectors,t.serializedHtml=a.serializedHtml,t.nodeOnlySerializedHtml=a.nodeOnlySerializedHtml,t.hybridSelector=a.hybridSelector)}catch(a){i.warn({err:a},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes(t,r,i)}catch(a){i.debug({err:a},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes(e,t,r){if(!t)return;await this.scrollIntoView(t);let o=await t.boundingBox({timeout:1e3});if(!o||!o.width||!o.height){r.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0;return}e.boundingBox=o;let{x:i=0,y:a=0,width:s=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1||!ap.includes(e?.role??""))return;let c=await this.screenshot({locator:t,retries:0});e.screenshotUrl=await this.storage.uploadScreenshot(c)}async resolveTargetWithHybridSelector({root:e,target:t}){if(!t.hybridSelector||!t.nodeOnlySerializedHtml)throw new Ur("Insufficient data to resolve target using hybrid selector");return await je({fn:r=>window.evaluateHybridSelector(r),arg:{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:{ldistThreshold:.05,requireBoundingBox:!0,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0}},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating Momentic cache"})}async resolveTargetWithCssSelectors({root:e,target:t}){if(!t.generatedSelectors||t.generatedSelectors.length<2||!t.nodeOnlySerializedHtml)throw new Ur("Insufficient data to resolve target using CSS selectors");return je({fn:r=>window.evaluateCssSelectors(r),arg:{selectors:t.generatedSelectors,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:{ldistThreshold:.05,requireBoundingBox:!0,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0}},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluateCssSelectors"})}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async createTargetFromA11yId({id:e,description:t,targetSource:r,skipSaveToCache:o,logger:i=this.logger}){if(e<0)throw new R("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let a=this.stateManager.a11yIdToNodeMap[e];if(!a)throw new R("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let s=this.stateManager.frameConfig,l,c,d,p;if(this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")&&!s&&a.parentFrame){let f=a.parentFrame,{cache:S,config:w}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,d=w,l=w.frame,p="auto iframe"}else a.parentFrame&&s?(d=s,l=await this.getActivePageOrFrame(),p="hardcoded url already on the state manager"):(l=await this.getActivePageOrFrame(),p="should not be possible");let u=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:l,node:a}),m={id:e,inputDescription:t??void 0,targetSource:r,targetUpdateTime:new Date().toISOString(),frameCache:c},h,g=!1;o||(d&&(i.debug({frameConfigSource:p,frameConfig:$b(d)},"A11y node was resolved to a target within an iframe"),h=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(d),g=!0),await this.updateCacheWithNewNodeDetails({node:a,target:m,locator:u,logger:i,forceSaveNewCssSelectors:!0}));try{return{resolution:{locator:u,a11yNode:a,displayString:a.getNodeOnlySerializedForm(),decisions:[]},target:m,frameConfig:d,frameConfigSource:p}}finally{g&&this.stateManager.setActiveFrameConfig(h)}}async resolveTarget(e,t,r={}){let{skipFetchTree:o=!1,targetName:i,logger:a=this.logger,signal:s=this.abortSignal}=r;if(t.frameCache&&this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")){let u,m=!1,h=Date.now();for(;Date.now()-h<this.smartWaitingTimeout;)try{let g=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(g),m=!0;break}catch(g){u=g,await ne(500,s)}if(!m)throw u}let l=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(l,a,s);let c=Date.now(),d=0,p;for(;Date.now()-c<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),d++;let u=d===1||Date.now()-c>this.smartWaitingTimeout-2e3&&d%2===0;try{p=await this.resolveTargetHelper({root:l,target:t,primaryOnly:!0,skipFetchTree:o,logger:u?a:Br,signal:s});break}catch(m){if(m instanceof Ur)break;s?.throwIfAborted(),u&&a.debug({err:m},`Could not resolve target through CSS selectors only (x${d})`),await ne(500,s)}}return p||(p=await this.resolveTargetHelper({root:l,target:t,primaryOnly:!1,skipFetchTree:o,logger:a,signal:s}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Ue(a),a.debug({decisions:p.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:i,elementLocationDecisions:p?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),p}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:r}){if(!t.nodeOnlySerializedHtml)throw new Ur("Insufficient data to resolve target using primary methods (missing node HTML)");let o=this.userControlledBrowserSettings.hybridSelectorMode,i=async()=>{if(t.hybridSelector&&o)return this.resolveTargetWithHybridSelector({root:e,target:t,logger:r})},a=async()=>{if(t.generatedSelectors)return this.resolveTargetWithCssSelectors({root:e,target:t,logger:r})},[s,l]=await Promise.allSettled([i(),a()]),c,d=[];if(s.status==="fulfilled"&&o==="prefer"&&s.value?.result){c=s.value;let f={type:"HYBRID_SELECTOR",matched:!0,logs:c.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};d.push(f),r.debug({evaluationDecision:f},"Hybrid selector evaluation succeeded")}else if(l.status==="fulfilled")if(l.value?.result){c=l.value;let f=l.value.result;d.push({type:"CSS_SELECTOR",matched:!0,logs:c.logs,reason:`${f.workingSelectors.length} CSS selectors matched the following element: ${f.serializedElement}`,selectors:f.workingSelectors.slice(0,5)})}else throw new Cn(`CSS selector evaluation returned no eligible elements:
|
|
3795
3795
|
${l.value?.logs.join(`
|
|
3796
|
-
`)}`,[]);else throw new
|
|
3797
|
-
Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(l){this.logger.warn({err:l},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,r={}){await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:1e3});if(!o)throw new R("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=r.steps??5;await this.page.mouse.move(i,a,{steps:s}),await te(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,2e3):500),await this.page.mouse.up()}async mouseDrag(e,t,r,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(gp);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await te(250),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await no({func:async t=>{await this.scrollIntoView(t.locator);let r=await t.locator.boundingBox({timeout:1e3});if(!r)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(r.x+r.width/2,r.y+r.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 no({func:t=>t.locator.focus({timeout:2e3}),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 $e({fn:()=>{let r=document.activeElement;r&&r.nodeType===1&&r.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:1e3,codePath:"blurring the active element"});return}await this.highlight(e.locator),await no({func:t=>t.locator.blur({timeout:2e3}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,r=!1){await this.highlight(e.locator),await no({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 R("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:r,timeout:3e3})},targetingResult:e})}async press(e,t){let r=t.repeat??1;if(t.convertMeta){let o=Cb(e);o!==e&&(this.logger.debug({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<r;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let r=0,o=2;for(;r<o;){r++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:r},`Failed to reload page${r<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"})}async getBrowserState(e){let{logger:t=this.logger,maxAttempts:r=2,skipWaitForPageLoad:o}=e,i=e.abortSignal??this.abortSignal;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:t,signal:i});let a=0,s;for(;a<r;){a++;try{return await _(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:i,logger:t,filterByViewport:e.filterByViewport}),{milliseconds:this.pageLoadTimeout*a,signal:i,message:"Getting browser state took too long"})}catch(l){if(i?.throwIfAborted(),s=l instanceof Error?l.message:`${l}`,a>=r)throw l;t.debug({err:l,url:this.url()},"Error getting a11y tree, retrying...")}}throw new R("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${s}`)}async getViewportOffsetDetails(e){let[t,r,o,i,a]=await $e({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:3e3,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:t,lowerBound:t+i,leftBound:r,rightBound:r+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:r=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=u=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let l=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>l);let c=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",c);let d=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",d);let p=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",p);try{await this.waitForDOMStabilityHelper(i,t,r,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",l),this.cdpClient.removeListener("Page.frameStartedLoading",c),this.cdpClient.removeListener("Page.navigatedWithinDocument",d),this.cdpClient.removeListener("Page.frameRequestedNavigation",p)}}async waitForDOMStabilityHelper(e,t,r,o){let i=!1,a=Date.now(),s,l={quality:25,retries:0,stabilizeBeforeScreenshot:!0},c=!1,d=0;for(;Date.now()-a<r;){if(o?.throwIfAborted(),await te(500,this.abortSignal),s)try{let u=await this.screenshot(l);if(!u.equals(s)){s=u,c=!1;continue}c=!0}catch(u){d++,d%3===0&&t.warn({err:u,screenshotErrors:d},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(l)}catch(u){d++,d%3===0&&t.warn({err:u,screenshotErrors:d},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<750)){i=!0;break}}let p={duration:Date.now()-a,a11yStableReceived:i,lastTreeUpdateMillisecondsAgo:Date.now()-e.value,screenshotStable:c};i||t.warn(p,"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:r,y:o}=e;this.logger.debug({x:r,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(r,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,r){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 te(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,8e3):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,r,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(gp);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await te(250),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:3e3}),r=await _(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:2e3});process.platform==="darwin"&&r===1&&(r=2);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],l=a.backendNodeId||[],c=i.nodeIndex,d=i.bounds,p=-1;for(let w=0;w<s.length;w++)if(l[w]===e){p=c.indexOf(w);break}if(p===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[u=0,m=0,h=0,g=0]=d[p];u/=r,m/=r,h/=r,g/=r;let f=u+h/2,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return bp({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 bp({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 createRawCDPSession(e){let t=await _(this.context.newCDPSession(this.page),{milliseconds:e??this.pageLoadTimeout,fallback:()=>{throw this.logger.error(`Timed out creating new CDP session for ${this.page.url()}`),new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${this.page.url()})`)}});return this.logger.debug(`Created new CDP session for ${this.page.url()}`),t}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){await this.stopScreencast(),this.recordUrlVisited(e.url()),this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let r=await this.context.newPage();await this.changeActivePage(r,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let r=!0,o,i=Date.now();for(;r||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){r=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await te(500)}}throw o}async switchToPageHelper(e,t){let r=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 R("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=r.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(r.map(a=>a.url))}`);o=r[i]}else{let i=r.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)}.
|
|
3798
|
-
Available pages:${JSON.stringify(r.map(i=>i.url))}`);if(!Wr(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.debug(`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=fs(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let r;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){r=i}if(r)throw r}async solveCaptcha(){await this.getBrowserState({});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:3e3}),r=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:Al,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!r.ok){let s=`Captcha solver API returned error response: ${r.statusText}`;throw this.logger.error({text:await r.text()},s),new Error(s)}let{taskId:o}=await r.json(),i=Date.now(),a="";for(;Date.now()-i<6e4;){await te(2500);let s=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Al,taskId:o})});if(!s.ok){let c=`Captcha solution API returned error response: ${s.statusText}`;throw this.logger.error({text:await s.text()},c),new Error(c)}let l=await s.json();if(l.errorId){let c=`Captcha solution API returned error ID ${l.errorId}`;throw this.logger.error(c),new Error(c)}if(l.status==="ready"){a=l.solution.text;break}}if(!a)throw new Error("Captcha solution timed out");return a}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&Nb({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,r=(await this.getOpenPages()).map(s=>s.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let s;try{s=(await this.getOpenPages()).map(c=>c.url),o=0}catch(c){this.logger.debug({err:c},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let c=s.length-1;c>=r.length;c--){let d=s[c];Wr(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:r,currentUrl:l,newOpenPages:s},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(c)});break}r=s};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(s){this.logger.error({err:s},"Error while checking pages during recording")}finally{i=!1}}},500),e.addEventListener("abort",async()=>{clearInterval(t)})}async startRecording(e,t,r){this.logger.debug({isClickToRecord:r},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(o=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!0,i._MOMENTIC_CLICK_RECORD_ACTIVE=o},r),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page),e.addEventListener("abort",async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let o=window;o._MOMENTIC_RECORDING_ACTIVE=!1,o._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}})}async getSelectOptions(e){return await e.evaluate(r=>Array.from(r.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:1e3})}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:r}){let o=this.pageLoadTimeout,i=e.url();if(i.includes("chrome-error://")){this.logger.warn({url:i,codePath:r},"Skipping load for chrome-error:// URL");return}try{await Gr({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new R("UserInfrastructureError",`The page with URL ${ze(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await Gr({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:r,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 eM.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:r}=await $e({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(r)throw new Error(`Failed to process page HTML: ${r}`);if(!t)throw new R("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async r=>{try{e==="ACCEPT"?await r.accept():await r.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,r){let o=await this.getActivePageOrFrame();return $e({root:o,fn:e,arg:t,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:r})}async evaluateCodeInPage({code:e,fragment:t,context:r,timeoutMs:o=or}){let i=Sb(),a={code:e,fragment:t,context:r},{result:s}=await _(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new R("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:2e3});let r;try{r=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:1e3})}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 r}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:r}){if(t<0||t>1||r<0||r>1)throw new R("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),l=Math.round(a),c=Math.round(s),d=Math.ceil(o*t),p=Math.ceil(i*r),u=d+c,m=p+l;return this.getDomNodeFromPixelPosition(u,m)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),r;try{r=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return r?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:1e3,params:{highlightConfig:jy,backendNodeId:r.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:1e3,method:"Overlay.hideHighlight",params:{backendNodeId:r?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:1e3})}catch{}}async getTargetFromPositionPercentages(e,t=!0){let r=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId(r,o.backendNodeId,t)}async getTargetFromBackendNodeId(e,t,r){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[Mt],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(`[${Mt}="${i}"]`);if(r){for(let p of Object.values(this.stateManager.a11yIdToNodeMap)){if(p.backendNodeId!==t)continue;let u={id:p.id,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.updateCacheWithNewNodeDetails({node:p,target:u,locator:s,forceSaveNewCssSelectors:!0}),this.logger.debug({target:u},"Tied backend id to existing a11y node"),{target:u,locator:s}}let d=yl(`${i}`,this.stateManager.domGraph,this.logger);for(let p of d){let u=parseInt(p.attributes?.[Mt]??"");if(isNaN(u))continue;let m=e.locator(`[${Mt}="${u}"]`),h=this.stateManager.dataMomenticIdToNodeMap[u],g=h?.id;if(!g)continue;let f={id:g,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.updateCacheWithNewNodeDetails({node:h,target:f,locator:m,forceSaveNewCssSelectors:!0}),this.logger.debug({target:f},"Tied backend id on non-accessible element to nearest a11y node"),{target:f,locator:m}}}let l=await this.fetchHtmlAttributes({locator:s,logger:this.logger}),c={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:c},"Tied backend id to html node"),{target:c,locator:s}}async performTargetRedirection(e,t,r){try{return await this.scrollIntoView(e),await _(this.performTargetRedirectionHelper(e,t,r),{milliseconds:3e3})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,r){let o=Date.now(),i=await Sn(e,t);if(r===void 0&&(r=await e.boundingBox({timeout:1e3})),!r){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:a,y:s,width:l,height:c}=r,d=this.getViewport();if(a<0||s<0||a+l>d.width||s+c>d.height){t.debug("Skipping locator redirection because the element is outside the viewport");return}let p=await this.getActivePageOrFrame(),{dataMomenticId:u,mPathSelector:m,error:h,serializedElement:g,point:f,force:S,logs:w}=await e.evaluate(b=>{let x=window;if(!x.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return x.performTargetRedirection(b)},void 0,{timeout:1e3}),v=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:v,force:S,logs:w},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:v,force:S,logs:w},"Redirected target to new element with bounding box with data-momentic-id"),{locator:p.locator(`[data-momentic-id="${u}"]`),hints:{clickableXY:f,force:S}};if(m)return t.debug({newMPathSelector:m,serializedElement:g,duration:v,force:S,logs:w},"Redirected target to new element with bounding box with mPath"),{locator:p.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.debug({point:f,serializedElement:g,duration:v,force:S,logs:w},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:v,force:S,logs:w},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger}){let r=await e.evaluate((o,i)=>{let a=window;return a.generateHtmlCacheAttributes?a.generateHtmlCacheAttributes(o,i):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:!!this.userControlledBrowserSettings.hybridSelectorMode},{timeout:2e3});if("error"in r)throw new Error(r.error);return r.warnings.length?t.warn(r,"Got warnings while generating HTML attributes for target"):t.debug(r,"Generated HTML attributes for target"),r.attributes}async moveMouseFromPositionPercentages(e,t){let r=Math.ceil(this.viewport.width*e),o=Math.ceil(this.viewport.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:r,y:o,button:"left",clickCount:0}}),{x:r,y:o}}async clickMouseFromPositionPercentages(e,t,r){let o=Math.ceil(this.viewport.width*t),i=Math.ceil(this.viewport.height*r);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:o,y:i,button:"left",clickCount:e==="down"?1:0},timeout:1e3})}async scrollFromPositionPercentages(e,t,r,o){let i=Math.ceil(this.viewport.width*e),a=Math.ceil(this.viewport.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:i,deltaY:a,x:r,y:o}}),{deltaX:i,deltaY:a}}canSolveCaptchas(){return!!Al}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,r,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,hp(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Rl(e)){let l=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(l),this.logToUserConsole(this.page,"error",l);return}let r=t?.trim()||oM(e),o=ZO(e),i=iM(e),a=Xc[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!Rl(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await l.setFiles({name:r,buffer:o,mimeType:Dy.getType(e)||"application/octet-stream"},{timeout:8e3})}catch(c){this.logger.error({err:c},"Error handling file chooser"),this.logToUserConsole(this.page,"error",c.message)}});let s=o.toString("base64");await(await this.getActivePageOrFrame()).evaluate(({fileName:l,base64Data:c,mimeType:d})=>{let p=window;p.momenticFileName=l,p.momenticFileBase64=c;let u=atob(c),m=new Array(u.length);for(let g=0;g<u.length;g++)m[g]=u.charCodeAt(g);let h=new Uint8Array(m);p.MomenticFile=class extends Blob{kind="file";name=p.momenticFileName;constructor(){super([h],{type:d})}isSameEntry(g){return g.name===this.name}queryPermission(g){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(g){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let g=new Blob([h]);return new File([g],p.momenticFileName,{type:d})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},p.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new p.MomenticFile])},{fileName:r,base64Data:s,mimeType:a})}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){let e=this.cdpClient.loadEventLogs;e.length>0&&(this.logger.debug({logs:e},"Load event logs"),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(r=>navigator.clipboard.writeText(r),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(e)}registerRequestRecorder(e,t,r){this.requestRecorders[e]=o=>{t.test(o.url())&&r(o)}}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,r){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:r})}async recordRequest(e){Object.values(this.requestRecorders).forEach(t=>{try{t(e)}catch(r){this.logger.error({err:r,url:e.url()},"Error while recording request")}})}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??5e3}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??8e3}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}};import AM from"fetch-cookie";import{cloneDeep as IM}from"lodash-es";import{CookieJar as PM}from"tough-cookie";import{z as Nt}from"zod";var $re=Nt.object({doubleClick:Nt.boolean().optional(),rightClick:Nt.boolean().optional(),force:Nt.boolean().optional(),waitForDownload:Nt.boolean().optional(),delayMs:Nt.number().optional(),downloadTimeoutMs:Nt.number().optional(),relativePosition:Nt.object({x:Nt.number(),y:Nt.number()}).optional()}),jre=Nt.object({repeat:Nt.number().optional(),convertMeta:Nt.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Nt.number().optional()});async function br(n,e={}){let t=await n.getBrowserState(e),r=t.serialize();return e.logger?.debug({tree:r.length>4e5?r.slice(0,4e5):r,activeFrame:n.getActiveFrameConfig()},"Got a11y tree"),{serializedTree:r,tree:t}}var hi=3.1783027;function uM(n){let e=0;for(let t=0;t<n.length;t++){let r=n.charCodeAt(t);!(r>=48&&r<=57)&&!(r>=65&&r<=90)&&!(r>=97&&r<=122)&&e++}return e}function Ia(n){return Math.ceil(Rp(n)/hi)}function Rp(n){let e=0;if(typeof n=="string"){let t=n;t=t.replaceAll(`
|
|
3799
|
-
`,""),t=t.replaceAll(" ","");let r=
|
|
3796
|
+
`)}`,[]);else throw new Cn(`CSS selector evaluation encountered an error: ${l.reason}`,[]);let p=c.result,u,m,h,g=!1;if(this.flagStore.isBooleanFlagEnabled("visual_actions")){p.mPath||r.error({foundElement:p},"Found element did not have an mPath despite using visual actions");let S=p.mPath.join(" > ");u=e.locator(S),m=this.stateManager.getNodeUsingMPathSelector(S)}else if(p.dataMomenticId!==void 0)h=parseInt(p.dataMomenticId),m=this.stateManager.dataMomenticIdToNodeMap[h],"workingSelectors"in p?(u=e.locator(p.workingSelectors[0]),g=p.workingSelectors.length<5):u=e.locator(`[data-momentic-id=${JSON.stringify(h)}]`);else throw new R("InternalWebAgentError","Received an element resolution result with no identifying attributes");return o&&t.hybridSelector&&(s.status==="rejected"?r.warn({err:s.reason,cssResult:"value"in l?l.value:void 0,hybridMode:o},"Hybrid selector resolution rejected, continuing..."):s.value?.result?"value"in l&&l.value?.result&&s.value.result.serializedElement!==l.value.result.serializedElement&&(this.flagStore.isBooleanFlagEnabled("visual_actions")&&JSON.stringify(l.value.result.mPath)!==JSON.stringify(s.value.result.mPath)?r.warn({hybridResult:s.value,cssResult:"value"in l?l.value:void 0,hybridMode:o,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.value.result.dataMomenticId!==s.value.result.dataMomenticId&&r.warn({hybridResult:s.value,cssResult:"value"in l?l.value:void 0,hybridMode:o,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):r.warn({hybridResult:s.value,cssResult:"value"in l?l.value:void 0,hybridMode:o},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing...")),await this.updateCacheWithNewNodeDetails({node:m,target:t,locator:u,logger:r,forceSaveNewCssSelectors:g}),{a11yNode:m,displayString:p.serializedElement,locator:u,decisions:d}}async resolveTargetHelper({root:e,target:t,primaryOnly:r,skipFetchTree:o,logger:i,signal:a,skipSaveToCache:s}){let l=[],c;o||(c=(await this.getBrowserState({logger:i,abortSignal:a,skipWait:!0})).serialize(),i.debug({tree:c.length>4e5?c.slice(0,4e5):c},"Got a11y tree before attempting target resolution"));let d;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:i})}catch(u){d=u}if(p)return{...p,pageState:void 0,decisions:[...l,...p.decisions]};r||(l.push({type:"CSS_SELECTOR",matched:!1,reason:d?.message,selectors:gM(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(r)throw d;if(!this.flagStore.isBooleanFlagEnabled("disable_secondary_cache_resolution")){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:c,target:t,decisions:l,logger:i,signal:a,skipSaveToCache:s});if(p)return p}throw i.warn({target:t,decisions:l},"Failed to find any relevant node"),new Cn(`Could not find any relevant node given target: ${JSON.stringify(t)}`,l)}async resolveHardcodedCssSelector(e){let{ctx:t,selector:r,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,s=await this.getActivePageOrFrame(),l=Date.now(),c=0,d,p=[];for(;Date.now()-l<a;){i?.throwIfAborted(),c++;let u=s.locator(r),m;try{return await u.waitFor({state:"attached",timeout:1e3}),m=await bn(u,o)??"",p.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${r} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:p,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:u,displayString:m,decisions:p}}catch(h){let g=h.message;d=new R("ActionFailureError",`CSS selector '${r}' failed to resolve after ${c} attempts: ${g.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":g}`),await ne(500,i)}}throw d}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let t=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!t)return;let{x:r,y:o,width:i,height:a}=e.target.boundingBox,s=await t.locator.boundingBox({timeout:1e3});if(!s){this.logger.debug({proposedNode:t.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:l,y:c,width:d,height:p}=s;if(Math.abs(d-i)>50||Math.abs(p-a)>50){this.logger.debug({newW:d,oldW:i,newH:p,oldH:a,proposedNode:t.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(r&&o&&(!l||!c)){this.logger.debug({oldX:r,oldY:o,proposedNode:t.displayString},"Rejecting secondary matching result due to new result not having x/y coords");return}else if(Math.abs((l??0)-(r??0))>200||Math.abs((c??0)-(o??0))>200){this.logger.debug({newX:l,newY:c,oldX:r,oldY:o,proposedNode:t.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return t}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:r,logger:o,signal:i,skipSaveToCache:a}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<10){let c="Refusing to attempt HTML comparison since the saved element is too short.";r.push({type:"HTML_DISTANCE",matched:!1,reason:c})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let c=await je({fn:p=>window.findClosestElementByLDist?.(p),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:2e3,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),d=Math.floor(.05*t.nodeOnlySerializedHtml.length);if(c&&c.closestDistance&&c.closestDistance>=d){let p=`Closest HTML candidate still has too far distance (${c.closestDistance}) from threshold (${d})`;r.push({type:"HTML_DISTANCE",matched:!1,reason:p,distance:c.closestDistance,closestElement:c.closestNodeSerialized})}else{if(c?.error)throw new Error(c.error);if(c?.dataMomenticId||c?.mPathSelector){let p=c.dataMomenticId?parseInt(c.dataMomenticId):void 0,u,m;if(p)u=this.stateManager.dataMomenticIdToNodeMap[p],m=e.locator(`[${kt}="${p}"]`);else if(c.mPathSelector)u=this.stateManager.getNodeUsingMPathSelector(c.mPathSelector),m=e.locator(c.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let h=c.closestNodeSerialized??await bn(m,o)??"unknown element";return o.warn({result:c,originalTarget:t,displayString:h},"Resolved cached target to new node with pure html levenshtein distance"),a||await this.updateCacheWithNewNodeDetails({node:u,target:t,locator:m,logger:o,forceSaveNewCssSelectors:!0}),r.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${d} string comparison distance of the saved element.`,logs:c.logs,distance:c.closestDistance,closestElement:h,savedElement:t.nodeOnlySerializedHtml}),{locator:m,a11yNode:u,displayString:h,decisions:r,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(c)}`)}}catch(c){o.debug({err:c},"Failed to find closest HTML node using levenshtein distance"),r.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${c}`})}let s=t.screenshotUrl,l=t.role??"";if(s&&ap.includes(l))try{let c=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,skipSaveToCache:a});return{...c,decisions:[...r,...c.decisions],pageState:void 0}}catch(c){i?.throwIfAborted(),r.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${c}`,elementImageUrl:s}),o.warn({err:c},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({root:e,screenshotUrl:t,oldTarget:r,signal:o,skipSaveToCache:i}){let a;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let s=await this.screenshot({retries:0}),c=await(await fetch(t)).arrayBuffer(),d=EM(),p=await this.enricher.runTemplateMatching({id:d,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:s.toString("base64")},{signal:o});this.logger.debug({id:d,templateMatch:p},"Template matching got successful result");let{target:u,locator:m}=await this.getTargetFromPositionPercentages({percentX:p.x,percentY:p.y}),h=u.boundingBox?.width,g=u.boundingBox?.height;if(!h||!g)throw a="Rejecting target from screenshot due to no bounding box",new Error(a);let f=u.id,S=this.stateManager.a11yIdToNodeMap[f];return i||await this.updateCacheWithNewNodeDetails({target:r,node:S,locator:m,forceSaveNewCssSelectors:!0}),{locator:m,a11yNode:S,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:t}]}}async typeIntoTarget(e,t,r={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:1e3})??"",i=Mb.some(a=>a===o.toLowerCase());return await Tp({targetingResult:t,options:{force:r.force},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore}),await this.page.waitForTimeout(150),this.directTypeHelper(e,r)}async click(e,t,r={}){return Tp({targetingResult:e,options:r,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore})}async waitForUrl({beforeUrl:e,matcher:t},r){let o=r?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),Of(s,t,r)){a=!0;break}await ne(500,this.abortSignal)}if(!a)throw new R("ActionFailureError",`The active page URL ${r?.negated?"still does":"does not"} ${gd(t)} in ${o}ms.
|
|
3797
|
+
Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(l){this.logger.warn({err:l},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,r={}){await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:1e3});if(!o)throw new R("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=r.steps??5;await this.page.mouse.move(i,a,{steps:s}),await ne(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,2e3):500),await this.page.mouse.up()}async mouseDrag(e,t,r,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(wp);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await ne(250),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await oo({func:async t=>{await this.scrollIntoView(t.locator);let r=await t.locator.boundingBox({timeout:1e3});if(!r)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(r.x+r.width/2,r.y+r.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await oo({func:t=>t.locator.focus({timeout:2e3}),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 je({fn:()=>{let r=document.activeElement;r&&r.nodeType===1&&r.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:1e3,codePath:"blurring the active element"});return}await this.highlight(e.locator),await oo({func:t=>t.locator.blur({timeout:2e3}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,r=!1){await this.highlight(e.locator),await oo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new R("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:r,timeout:3e3})},targetingResult:e})}async press(e,t){let r=t.repeat??1;if(t.convertMeta){let o=Fb(e);o!==e&&(this.logger.debug({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<r;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let r=0,o=2;for(;r<o;){r++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:r},`Failed to reload page${r<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"})}async getBrowserState(e){let{logger:t=this.logger,maxAttempts:r=2,skipWaitForPageLoad:o}=e,i=e.abortSignal??this.abortSignal;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:t,signal:i});let a=0,s;for(;a<r;){a++;try{return await D(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:i,logger:t,filterByViewport:e.filterByViewport}),{milliseconds:this.pageLoadTimeout*a,signal:i,message:"Getting browser state took too long"})}catch(l){if(i?.throwIfAborted(),s=l instanceof Error?l.message:`${l}`,a>=r)throw l;t.debug({err:l,url:this.url()},"Error getting a11y tree, retrying...")}}throw new R("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${s}`)}async getViewportOffsetDetails(e){let[t,r,o,i,a]=await je({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:3e3,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:t,lowerBound:t+i,leftBound:r,rightBound:r+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:r=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=u=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let l=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>l);let c=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",c);let d=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",d);let p=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",p);try{await this.waitForDOMStabilityHelper(i,t,r,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",l),this.cdpClient.removeListener("Page.frameStartedLoading",c),this.cdpClient.removeListener("Page.navigatedWithinDocument",d),this.cdpClient.removeListener("Page.frameRequestedNavigation",p)}}async waitForDOMStabilityHelper(e,t,r,o){let i=!1,a=Date.now(),s,l={quality:25,retries:0,stabilizeBeforeScreenshot:!0},c=!1,d=0;for(;Date.now()-a<r;){if(o?.throwIfAborted(),await ne(500,this.abortSignal),s)try{let u=await this.screenshot(l);if(!u.equals(s)){s=u,c=!1;continue}c=!0}catch(u){d++,d%3===0&&t.warn({err:u,screenshotErrors:d},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(l)}catch(u){d++,d%3===0&&t.warn({err:u,screenshotErrors:d},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<750)){i=!0;break}}let p={duration:Date.now()-a,a11yStableReceived:i,lastTreeUpdateMillisecondsAgo:Date.now()-e.value,screenshotStable:c};i||t.warn(p,"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:r,y:o}=e;this.logger.debug({x:r,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(r,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,r){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 ne(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,8e3):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,r,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(wp);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await ne(250),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:3e3}),r=await D(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:2e3});process.platform==="darwin"&&r===1&&(r=2);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],l=a.backendNodeId||[],c=i.nodeIndex,d=i.bounds,p=-1;for(let w=0;w<s.length;w++)if(l[w]===e){p=c.indexOf(w);break}if(p===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[u=0,m=0,h=0,g=0]=d[p];u/=r,m/=r,h/=r,g/=r;let f=u+h/2,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return Ep({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 Ep({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 createRawCDPSession(e){let t=await D(this.context.newCDPSession(this.page),{milliseconds:e??this.pageLoadTimeout,fallback:()=>{throw this.logger.error(`Timed out creating new CDP session for ${this.page.url()}`),new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${this.page.url()})`)}});return this.logger.debug(`Created new CDP session for ${this.page.url()}`),t}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){await this.stopScreencast(),this.recordUrlVisited(e.url()),this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let r=await this.context.newPage();await this.changeActivePage(r,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let r=!0,o,i=Date.now();for(;r||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){r=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await ne(500)}}throw o}async switchToPageHelper(e,t){let r=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 R("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=r.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(r.map(a=>a.url))}`);o=r[i]}else{let i=r.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)}.
|
|
3798
|
+
Available pages:${JSON.stringify(r.map(i=>i.url))}`);if(!qr(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.debug(`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=xs(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let r;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){r=i}if(r)throw r}async solveCaptcha(){await this.getBrowserState({});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:3e3}),r=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:Ml,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!r.ok){let s=`Captcha solver API returned error response: ${r.statusText}`;throw this.logger.error({text:await r.text()},s),new Error(s)}let{taskId:o}=await r.json(),i=Date.now(),a="";for(;Date.now()-i<6e4;){await ne(2500);let s=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Ml,taskId:o})});if(!s.ok){let c=`Captcha solution API returned error response: ${s.statusText}`;throw this.logger.error({text:await s.text()},c),new Error(c)}let l=await s.json();if(l.errorId){let c=`Captcha solution API returned error ID ${l.errorId}`;throw this.logger.error(c),new Error(c)}if(l.status==="ready"){a=l.solution.text;break}}if(!a)throw new Error("Captcha solution timed out");return a}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&Wb({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,r=(await this.getOpenPages()).map(s=>s.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let s;try{s=(await this.getOpenPages()).map(c=>c.url),o=0}catch(c){this.logger.debug({err:c},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let c=s.length-1;c>=r.length;c--){let d=s[c];qr(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:r,currentUrl:l,newOpenPages:s},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(c)});break}r=s};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(s){this.logger.error({err:s},"Error while checking pages during recording")}finally{i=!1}}},500),e.addEventListener("abort",async()=>{clearInterval(t)})}async startRecording(e,t,r){this.logger.debug({isClickToRecord:r},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(o=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!0,i._MOMENTIC_CLICK_RECORD_ACTIVE=o},r),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page),e.addEventListener("abort",async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let o=window;o._MOMENTIC_RECORDING_ACTIVE=!1,o._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}})}async getSelectOptions(e){return await e.evaluate(r=>Array.from(r.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:1e3})}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:r}){let o=this.pageLoadTimeout,i=e.url();if(i.includes("chrome-error://")){this.logger.warn({url:i,codePath:r},"Skipping load for chrome-error:// URL");return}try{await Vr({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new R("UserInfrastructureError",`The page with URL ${ze(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await Vr({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:r,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 hM.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:r}=await je({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(r)throw new Error(`Failed to process page HTML: ${r}`);if(!t)throw new R("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async r=>{try{e==="ACCEPT"?await r.accept():await r.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,r){let o=await this.getActivePageOrFrame();return je({root:o,fn:e,arg:t,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:r})}async evaluateCodeInPage({code:e,fragment:t,context:r,timeoutMs:o=ar}){let i=Pb(),a={code:e,fragment:t,context:r},{result:s}=await D(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new R("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:2e3});let r;try{r=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:1e3})}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 r}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:r}){if(t<0||t>1||r<0||r>1)throw new R("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),l=Math.round(a),c=Math.round(s),d=Math.ceil(o*t),p=Math.ceil(i*r),u=d+c,m=p+l;return this.getDomNodeFromPixelPosition(u,m)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),r;try{r=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return r?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:1e3,params:{highlightConfig:tb,backendNodeId:r.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:1e3,method:"Overlay.hideHighlight",params:{backendNodeId:r?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:1e3})}catch{}}async getTargetFromPositionPercentages(e,t=!0){let r=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPositionPercentages(r,e);return this.getTargetFromBackendNodeId(r,o.backendNodeId,t)}async getTargetFromBackendNodeId(e,t,r){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[kt],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(`[${kt}="${i}"]`);if(r){for(let p of Object.values(this.stateManager.a11yIdToNodeMap)){if(p.backendNodeId!==t)continue;let u={id:p.id,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.updateCacheWithNewNodeDetails({node:p,target:u,locator:s,forceSaveNewCssSelectors:!0}),this.logger.debug({target:u},"Tied backend id to existing a11y node"),{target:u,locator:s}}let d=Tl(`${i}`,this.stateManager.domGraph,this.logger);for(let p of d){let u=parseInt(p.attributes?.[kt]??"");if(isNaN(u))continue;let m=e.locator(`[${kt}="${u}"]`),h=this.stateManager.dataMomenticIdToNodeMap[u],g=h?.id;if(!g)continue;let f={id:g,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString()};return await this.updateCacheWithNewNodeDetails({node:h,target:f,locator:m,forceSaveNewCssSelectors:!0}),this.logger.debug({target:f},"Tied backend id on non-accessible element to nearest a11y node"),{target:f,locator:m}}}let l=await this.fetchHtmlAttributes({locator:s,logger:this.logger}),c={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:c},"Tied backend id to html node"),{target:c,locator:s}}async performTargetRedirection(e,t,r){try{return await this.scrollIntoView(e),await D(this.performTargetRedirectionHelper(e,t,r),{milliseconds:3e3})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,r){let o=Date.now(),i=await bn(e,t);if(r===void 0&&(r=await e.boundingBox({timeout:1e3})),!r){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:a,y:s,width:l,height:c}=r,d=this.getViewport();if(a<0||s<0||a+l>d.width||s+c>d.height){t.debug("Skipping locator redirection because the element is outside the viewport");return}let p=await this.getActivePageOrFrame(),{dataMomenticId:u,mPathSelector:m,error:h,serializedElement:g,point:f,force:S,logs:w}=await e.evaluate(b=>{let T=window;if(!T.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return T.performTargetRedirection(b)},void 0,{timeout:1e3}),v=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:v,force:S,logs:w},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:v,force:S,logs:w},"Redirected target to new element with bounding box with data-momentic-id"),{locator:p.locator(`[data-momentic-id="${u}"]`),hints:{clickableXY:f,force:S}};if(m)return t.debug({newMPathSelector:m,serializedElement:g,duration:v,force:S,logs:w},"Redirected target to new element with bounding box with mPath"),{locator:p.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.debug({point:f,serializedElement:g,duration:v,force:S,logs:w},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:v,force:S,logs:w},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger}){let r=await e.evaluate((o,i)=>{let a=window;return a.generateHtmlCacheAttributes?a.generateHtmlCacheAttributes(o,i):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:!!this.userControlledBrowserSettings.hybridSelectorMode},{timeout:2e3});if("error"in r)throw new Error(r.error);return r.warnings.length?t.warn(r,"Got warnings while generating HTML attributes for target"):t.debug(r,"Generated HTML attributes for target"),r.attributes}async moveMouseFromPositionPercentages(e,t){let r=Math.ceil(this.viewport.width*e),o=Math.ceil(this.viewport.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:r,y:o,button:"left",clickCount:0}}),{x:r,y:o}}async clickMouseFromPositionPercentages(e,t,r){let o=Math.ceil(this.viewport.width*t),i=Math.ceil(this.viewport.height*r);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:o,y:i,button:"left",clickCount:e==="down"?1:0},timeout:1e3})}async scrollFromPositionPercentages(e,t,r,o){let i=Math.ceil(this.viewport.width*e),a=Math.ceil(this.viewport.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:i,deltaY:a,x:r,y:o}}),{deltaX:i,deltaY:a}}canSolveCaptchas(){return!!Ml}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,r,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,bp(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Ol(e)){let l=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(l),this.logToUserConsole(this.page,"error",l);return}let r=t?.trim()||yM(e),o=uM(e),i=bM(e),a=nd[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!Ol(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await l.setFiles({name:r,buffer:o,mimeType:Ky.getType(e)||"application/octet-stream"},{timeout:8e3})}catch(c){this.logger.error({err:c},"Error handling file chooser"),this.logToUserConsole(this.page,"error",c.message)}});let s=o.toString("base64");await(await this.getActivePageOrFrame()).evaluate(({fileName:l,base64Data:c,mimeType:d})=>{let p=window;p.momenticFileName=l,p.momenticFileBase64=c;let u=atob(c),m=new Array(u.length);for(let g=0;g<u.length;g++)m[g]=u.charCodeAt(g);let h=new Uint8Array(m);p.MomenticFile=class extends Blob{kind="file";name=p.momenticFileName;constructor(){super([h],{type:d})}isSameEntry(g){return g.name===this.name}queryPermission(g){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(g){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let g=new Blob([h]);return new File([g],p.momenticFileName,{type:d})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},p.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new p.MomenticFile])},{fileName:r,base64Data:s,mimeType:a})}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){let e=this.cdpClient.loadEventLogs;e.length>0&&(this.logger.debug({logs:e},"Load event logs"),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(r=>navigator.clipboard.writeText(r),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(e)}registerRequestRecorder(e,t,r){this.requestRecorders[e]=o=>{t.test(o.url())&&r(o)}}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,r){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:r})}async recordRequest(e){Object.values(this.requestRecorders).forEach(t=>{try{t(e)}catch(r){this.logger.error({err:r,url:e.url()},"Error while recording request")}})}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??5e3}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??8e3}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}};import HM from"fetch-cookie";import{cloneDeep as jM}from"lodash-es";import{CookieJar as $M}from"tough-cookie";import{z as _t}from"zod";var doe=_t.object({doubleClick:_t.boolean().optional(),rightClick:_t.boolean().optional(),force:_t.boolean().optional(),waitForDownload:_t.boolean().optional(),delayMs:_t.number().optional(),downloadTimeoutMs:_t.number().optional(),relativePosition:_t.object({x:_t.number(),y:_t.number()}).optional()}),poe=_t.object({repeat:_t.number().optional(),convertMeta:_t.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:_t.number().optional()});async function vr(n,e={}){let t=await n.getBrowserState(e),r=t.serialize();return e.logger?.debug({tree:r.length>4e5?r.slice(0,4e5):r,activeFrame:n.getActiveFrameConfig()},"Got a11y tree"),{serializedTree:r,tree:t}}var fi=3.1783027;function RM(n){let e=0;for(let t=0;t<n.length;t++){let r=n.charCodeAt(t);!(r>=48&&r<=57)&&!(r>=65&&r<=90)&&!(r>=97&&r<=122)&&e++}return e}function Ma(n){return Math.ceil(Op(n)/fi)}function Op(n){let e=0;if(typeof n=="string"){let t=n;t=t.replaceAll(`
|
|
3799
|
+
`,""),t=t.replaceAll(" ","");let r=RM(t);return t.length-r+fi*r}if(typeof n>"u")return 0;if(typeof n=="number")return String(n).length;if(Array.isArray(n))return n.forEach(t=>{e+=Op(t)}),e;if(typeof n=="object"){let t=n;return Object.keys(t).forEach(r=>{e+=String(r).length,r==="image_url"?(t[r]??{}).detail==="high"?e+=1105*fi:e+=85*fi:e+=Op(t[r])}),e}if(typeof n=="boolean")return n?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof n}': ${n}`)}var ew={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},tw={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:15e3,maxLineLength:500},Qb=/<(\S+) id="(\d+)".*?>/g,AM=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,nw=["h1","h2","section","footer","nav","aside","form","label","dialog"],IM=[...nw,"span","div","h3"],PM=["table","select","form","ul","ol","menu","pre","code","dialog"],LM=["table","form","dialog","nav","section","ul","select"];function Mp(n){return n.serializedTree.length>n.maxCharacterLength&&(n.logger.warn({serializedTreeLength:n.serializedTree.length},"Serialized condensed tree is too long to chunk, truncating before chunking"),n.serializedTree=n.serializedTree.slice(0,n.maxCharacterLength)),OM(n)}function OM({serializedTree:n,options:e,logger:t}){let{minChunkTokenCount:r,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=e,s=[],l=n.split(`
|
|
3800
3800
|
`),c=0,d=[],p=0,u=[],m=[],h=!1;for(;c<l.length;){h&&(s.push({ids:u,content:d.join(`
|
|
3801
|
-
`),tokenLength:p}),d=[],p=0,u=m.length?[m[m.length-1].id]:[],h=!1);let g=l[c],f=
|
|
3802
|
-
`),tokenLength:p}),s.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var
|
|
3803
|
-
${n}`;case"ELEMENT_CHECK":return`${
|
|
3804
|
-
${n}`;default:return n}}var xM=15;async function Mp({command:n,fixtures:e}){if(!n.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let{browser:t,logger:r}=e,o=n.timeout?n.timeout*1e3:t.smartWaitingTimeout,i=EM(o),a=0,s=Date.now(),l,c,d;try{await Pn({action:()=>t.clearHighlights(),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:t,logger:r})}catch(u){r.warn({err:u},"Failed to clear highlights before AI check, continuing...")}let p;for(;a<xM&&(!p||p-s<o);){e.abortSignal.throwIfAborted(),a!==0&&(r.info(`Waiting ${i}ms before retrying AI check`),await te(i,e.abortSignal)),p=Date.now();try{let u=await Pn({action:async()=>{let m=await Jb(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,Xb({command:n,state:m,fixtures:e,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:a}))},frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t});if(!u)continue;l=u;break}catch(u){e.abortSignal.throwIfAborted(),d=u instanceof Error?u:new Error(`${u}`),r.info({err:u},`AI check assert attempt ${a} failed, retrying...`)}finally{a++}}if(!l)try{l=await Pn({action:async()=>Xb({command:n,state:await Jb(t,r,e.abortSignal),fixtures:e,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:a}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t})}catch(u){e.abortSignal.throwIfAborted(),d=u instanceof Error?u:new Error(`${u}`)}finally{a++}if(!l){let u=`AI check still failing after ${a} attempts.`;throw d&&(u+=` Latest result: ${d.message}`),new R("AssertionFailureError",u,{lastScreenshotBuffer:c?.screenshotBuff})}return l}async function Jb(n,e,t){let[r,o]=await Promise.all([br(n,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),n.screenshot({retries:1,respectActiveFrame:!0})]);return{...r,screenshotBuff:o}}async function Xb({command:n,state:e,fixtures:t,useConsensus:r,highlightElementsOnFailure:o,attemptNumber:i}){let{browser:a,logger:s,generator:l,abortSignal:c}=t,d={type:"ASSERTION"},{serializedTree:p,tree:u}=e,m=e.screenshotBuff,h=a.url(),g=p;g=await ro({type:"assertion",serializedTree:p,description:n.assertion,flagStore:t.flagStore,tree:u,generator:l,logger:s,signal:c}),g!==p&&(d.ragUsed=!0),d.pageState=g;let f={goal:n.assertion,url:h,browserState:g,screenshot:m.toString("base64"),contextChoice:n.contextChoice},w=await(n.contextChoice==="VISION_ONLY"?(v,b)=>l.getVisualAssertionResult(v,b):(v,b)=>l.getAssertionResult(v,b))(f,{useConsensus:r,attemptNumber:i,disableCache:!!n.disableCache,logger:s,abortSignal:c,loggerTags:Ue(s)});if((w.result||o)&&w.relevantElements&&(d.relevantElementsSerialized=w.relevantElements.map(v=>a.getSerializedFormFromA11yId(v)).filter(v=>!!v),await CM(w.relevantElements,a,s)),!w.result)throw new R("AssertionFailureError",w.thoughts);return{succeedImmediately:!1,thoughts:w.thoughts,urlAfterCommand:h,afterScreenshotOverride:m}}function EM(n){let e;return n>10*60*1e3?e=2*60*1e3:n>60*1e3?e=20*1e3:n>10*1e3?e=2*1e3:e=1e3,e}async function CM(n,e,t){let r=Date.now();for(let o of n){if(Date.now()-r>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await _(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 RM=3e4;async function Zb({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??RM/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(n.headers||{}).filter(([p,u])=>p&&u)),s;if(Fo(n.url)&&(s=n.url),t&&Uo(n.url,t)&&(s=new URL(n.url,t).toString()),!s)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let c=await _((async()=>{try{return await r(s,{headers:a,method:"POST",body:JSON.stringify({query:n.query,variables:n.variables}),signal:i.signal})}catch(p){e.error({err:p},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!c)throw new R("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let p;try{p=await c.json()}catch{throw new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}throw p?.errors?.length&&p?.errors[0]?.message?new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p.errors[0].message}`):new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}let d={};return c.headers.forEach((p,u)=>{d[u]=p}),{status:c.status,headers:d,json:await c.json()}}function Il(n){try{return new RegExp(n)}catch(e){throw new R("UserConfigurationError",`The provided regex expression was invalid: ${e}`)}}async function Qb(n){let e=n.postData();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:n.postDataJSON()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function ew(n){let e=await n.text();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:await n.json()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function tw(n){return{request:{url:n.url(),method:n.method(),headers:await n.allHeaders(),...await Qb(n)}}}async function nw(n,e){let t=await e.response();if(t)return n.response={status:t.status(),headers:await t.allHeaders(),...await ew(t)},n}async function rw(n){let e=n.request(),t=n.status(),r=n.headers(),o=await ew(n);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await Qb(e)},response:{status:t,headers:r,...o},status:t,headers:r,...o}}var gi=class{flagStore;orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;analytics;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,logger:r,analytics:o,flagStore:i,storage:a,orgId:s,localCodeEvalTools:l,uploadedFileStorage:c,visualDiffScreenshotStorage:d,options:p}){this.orgId=s,this.options=p,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=a,this.uploadedFileStorage=c,this.visualDiffScreenshotStorage=d,this.localCodeEvalTools=l,this.generator=t,this.logger=r,this.analytics=o,this.flagStore=i}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:r,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([br(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=await ro({type:"ai-action",description:e,serializedTree:l.serializedTree,tree:l.tree,logger:s,generator:this.generator,flagStore:this.flagStore,softTokenLimit:25e3,hardTokenLimit:5e4}),p=`data:image/jpeg;base64,${c.toString("base64")}`,u={url:this.browser.url(),browserState:d,startingScreenshot:t,history:r,goal:e,screenshot:p,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(u,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Ue(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:r,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,d]=await Promise.all([br(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),p=`data:image/jpeg;base64,${d.toString("base64")}`,u=await ro({type:"ai-action",description:e,serializedTree:c.serializedTree,tree:c.tree,logger:a,generator:this.generator,flagStore:this.flagStore,softTokenLimit:25e3,hardTokenLimit:5e4}),m={url:l,browserState:u,startingScreenshot:t,history:r,goal:e,actionHint:o,screenshot:p};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Ue(a)},langfuseSessionId:s})}catch(h){throw new R("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return br(this.browser,e)}async locateElement(e){return Op(e,this.getControllerFixtures())}async locateElementWithSelector(e,t){return Pn({action:async()=>{let r=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:r}},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,flagStore:this.flagStore,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:a,action:s,options:l,retriesWithAI:c=1}){let d=[];for(let p=0;p<i.length;p++){let u=i[p],m=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:u,cache:a[p],action:async h=>h,options:{...l,skipFetchTree:p!==0,targetName:o[p]}});d.push(m)}try{return{result:await s(...d.map(u=>u.result)),elementInteractedDisplayStrings:d.map(u=>u.elementInteractedDisplayString),newTargets:d.map(u=>u.newTarget)}}catch(p){if(this.throwIfClosed(),c>0)return this.logger.debug({err:p},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:l,retriesWithAI:c-1});throw new R("ActionFailureError",p.message,{errOptions:{cause:p}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),r;for(let o=0;o<2;o++)try{return await Pn({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(r=i,this.flagStore.isBooleanFlagEnabled("visual_actions")&&Jc(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&Zi(i)){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}throw i}throw r instanceof R?r:new R("ActionFailureError",r?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:r,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s="target"}=o;if(t.type!=="description")throw new R("ActionFailureError","Cannot use selector with non-description target");let l=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:s,logger:a});return{result:await r({locator:l.locator}),elementInteractedDisplayString:l.displayString,newTarget:{cache:{id:-1,selector:t.elementDescriptor,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()}}}}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:r,target:o,action:i,options:a,command:s}=e,{disableCache:l,useSelector:c,targetName:d="target",targetHealingInProgress:p,source:u}=a,m=this.logger.child({commandId:s.id}),h=a.retriesWithAI??1,g=!1,f=e.cache;if((!f||l)&&!nc(o))throw new R("ActionFailureError","Cannot target element with no cached data or element descriptor");if(c)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(m.debug("Cache explicitly disabled for this step"),g=!0,f=void 0),f?.inputDescription&&!Yb(o.elementDescriptor,f.inputDescription)&&(m.warn({old:f.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),g=!0,f=void 0);let S=!!f&&Lu(f);if(!f){let w=new Date;m.debug({targetHealingInProgress:p,cacheBustedBeforeAction:g},"Prompting AI for an updated element location"),g&&await te(this.browser.smartWaitingTimeout,this.executeAbortController.signal),h--;let v=await Op({description:o.elementDescriptor,disableCache:l,iframeUrl:a.iframeUrl,source:u},this.getControllerFixtures(t));v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let b=a.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,m),x=await i(b),C;if(p){r.heal({healType:"AI"}),this.analytics.track({type:"execution:step_heal",heal_type:"AI",step_type:"PRESET_ACTION",command_type:s.type,duration_ms:Date.now()-w.getTime()}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=Ue(m);let A=v.resolution.pageState;if(A)try{C=await this.getReverseMappedDescription({browserState:A,targetId:v.target.id,disableCache:!0,screenshot:v.screenshot})}catch(N){m.warn({err:N},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:x,elementInteractedDisplayString:v.resolution.displayString,newTarget:{cache:v.target,thoughts:v.thoughts,description:C}}}try{let w=new Date,v=await this.browser.resolveTarget(t,f,{targetName:d,logger:m});(this.flagStore.isBooleanFlagEnabled("global_locator_redirect")||this.flagStore.isBooleanFlagEnabled("visual_actions"))&&await this.browser.scrollIntoView(v.locator);let b=a.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,m),x=await i(b);if(S){let C=v.decisions.filter(A=>A.matched);if(C.length!==1)m.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let A=C[0].type;r.heal({healType:A}),this.analytics.track({type:"execution:step_heal",heal_type:A,step_type:"PRESET_ACTION",command_type:s.type,duration_ms:Date.now()-w.getTime()})}}return{result:x,elementInteractedDisplayString:v.displayString,newTarget:{cache:f}}}catch(w){this.throwIfClosed();let v=vh(w)&&!Jc(w)&&!Zi(w);if(w instanceof R&&!v)throw w;if(h>0&&o)return m.debug({err:w,cache:f},"Failed to execute action with cached target, retrying with AI"),this.wrapElementTargetingCommand({ctx:t,tracer:r,command:s,target:o,cache:void 0,action:i,options:{...a,retriesWithAI:h,targetHealingInProgress:!0}});throw new R("ActionFailureError",w.message,{errOptions:{cause:w}})}}async attemptLocatorRedirect(e,t){return this.flagStore.isBooleanFlagEnabled("global_locator_redirect")?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Ca(this.browser,e)}async executePresetCommand(e,t,r,o,i){this.options?.slowMoMs&&await te(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),l;try{l=await this.resolveCommandTemplateStrings(r,o)}catch(c){throw this.throwIfClosed(),new R("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await this.executePresetCommandHelper(e,t,r,o,i);return this.flagStore.isBooleanFlagEnabled("visual_actions")&&_u(r)?await this.browser.waitForDOMStability({timeout:2e3}):!this.flagStore.isBooleanFlagEnabled("visual_actions")&&["PRESS","TYPE"].includes(r.type)&&await this.browser.waitForDOMStability({timeout:1e3}),this.options?.autoFollowNewTabs&&await my({beforeUrl:s,command:r,beforePages:a.map(d=>d.url),browser:this.browser,logger:this.logger}),c}catch(c){throw c.name!=="AbortError"&&this.logger.error({err:c},"Error thrown in action controller"),c}finally{this.restoreCommandTemplateReplacements(r,l)}}restoreCommandTemplateReplacements(e,t){qS(e,t)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>up(e)}}async resolveCommandTemplateStrings(e,t){return ci({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools,flagStore:this.flagStore})}async executePresetCommandHelper(e,t,r,o,i){switch(i=i||"disableCache"in r&&!!r.disableCache,r.type){case"SUCCESS":let a=r.condition;return a?.assertion.trim()?Mp({command:a,fixtures:this.getControllerFixtures(e)}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!r.assertion.trim())throw new R("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new R("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return Mp({command:{...r,type:"AI_ASSERTION"},fixtures:this.getControllerFixtures(e)})}case"AI_EXTRACT":{if(!r.goal.trim())throw new R("ActionFailureError","Cannot perform AI extraction without goal");let m=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let g=await this.generator.getTextExtraction({goal:r.goal,browserState:m,returnSchema:r.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)});if(g.result==="NOT_FOUND")throw new R("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new R("UserConfigurationError",g.thoughts);return{thoughts:g.thoughts||void 0,data:g.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(g){let f=g.message;throw f.includes("MaxGenerationLengthExceededError")?new R("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new R("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:g}}):g}}case"NAVIGATE":if(!Fo(r.url)&&!Uo(r.url,this.browser.baseUrl))throw new R("ActionFailureError",`Invalid URL provided to navigate command: ${r.url}`);await this.browser.navigate({url:r.url,loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(r.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let s=await this.browser.solveCaptcha();s&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:m=>this.browser.click(m,this.createCallbacksForBrowser(this.orgId),{}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}}),await this.browser.type(s,{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 m,h=[];if(r.target&&wn(r.target))await this.browser.hoverUsingVisualCoordinates(r.target.pixels);else if(r.target&&r.target.elementDescriptor.trim()){let{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:S=>this.browser.hover(S),options:{disableGlobalLocatorRedirect:!0,disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});m=f,h.push(g)}switch(r.type){case"SCROLL_UP":await this.browser.scrollVertical(-(r.deltaY??this.browser.getViewport().height));break;case"SCROLL_DOWN":await this.browser.scrollVertical(r.deltaY??this.browser.getViewport().height);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(r.deltaX??this.browser.getViewport().width));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(r.deltaX??this.browser.getViewport().width);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:h}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new R("UserConfigurationError",`Wait for URL timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=r.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:r.timeout?r.timeout*1e3:void 0,negated:r.negated,caseInsensitive:r.caseInsensitive});break}case"WAIT":if(r.delay>1800)throw new R("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=r.delay*1e3;await te(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"CLICK":{if(wn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r);break}let m=this.browser.url(),h={disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl},{elementInteractedDisplayString:g,newTarget:f,result:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:v=>this.browser.click(v,this.createCallbacksForBrowser(this.orgId),r),options:h});f.cache&&(r.cache={target:f.cache});let w={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return _s(m,w.urlAfterCommand)&&(w.succeedImmediately=!0,w.succeedImmediatelyReason="URL changed"),w}case"COPY":return await this.browser.copy(r.value),{succeedImmediately:!1,data:r.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(wn(r.fromTarget)&&wn(r.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(r.fromTarget.pixels,r.toTarget.pixels,{hoverSeconds:r.hoverSeconds});break}if(wn(r.fromTarget)||wn(r.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{newTargets:m,elementInteractedDisplayStrings:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:["from target","to target"],descriptions:[r.fromTarget,r.toTarget],caches:[r.cache?.fromTarget,r.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverSeconds:r.hoverSeconds,steps:r.steps}),options:{useSelector:!!r.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],newTargets:m}}case"MOUSE_DRAG":{let m=parseInt(r.deltaX),h=parseInt(r.deltaY),g=r.steps??5;if(isNaN(m)||isNaN(h))throw new R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&wn(r.target)){await this.browser.mouseDragUsingVisualCoordinates(m,h,g,r.target.pixels,{force:r.force});break}let f,S,w=[];if(r.target?.elementDescriptor){let{newTarget:v,elementInteractedDisplayString:b,result:x}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:async C=>C.locator,options:{useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableCache:i}});f=x,S=b,w.push(v)}return await this.browser.mouseDrag(m,h,g,f,{force:r.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:w}}case"SELECT_OPTION":{if(!tr(r.target))throw new Error("Select with x/y is not supported yet");let m=r.target.elementDescriptor,h=r.choice,{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:m},cache:r.cache?.target,action:S=>this.browser.selectOption(S,h,r.force),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,source:Pr(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,newTargets:[g]}}case"TAB":{let m={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(r.action,m);break}case"NEW_TAB":await this.browser.createNewTab(r.url,{loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"COOKIE":if(!r.value)break;let c=await this.browser.setCookie(r.value);this.logger.debug({results:c},"Set cookies");break;case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let m;try{r.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:o.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),this.logger.debug({result:m},"Executed JavaScript in browser")):m=await Vn({orgId:this.orgId,code:r.code,fragment:!!r.fragment,context:o,timeoutMs:r.timeout?r.timeout*1e3:void 0,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){this.logger.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:this.logger})}}})}catch(h){throw this.throwIfClosed(),new R("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new R("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(r.target&&wn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r),await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);break}let m=this.browser.url(),h,g=[],f=IM(r.target);if(f){let{elementInteractedDisplayString:w,newTarget:v}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:f,cache:r.cache?.target,action:b=>this.browser.typeIntoTarget(r.value,b,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableGlobalLocatorRedirect:!0,source:Pr(r)}});g.push(v),h=w}else await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);let S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,newTargets:g};return _s(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"HOVER":{if(wn(r.target)){await this.browser.hoverUsingVisualCoordinates(r.target.pixels);break}let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.hover(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"FOCUS":{if(!tr(r.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,newTarget:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.focus(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:[h]}}case"BLUR":{if(r.target&&!tr(r.target))throw new Error("Blur with x/y is not supported yet");if(!r.target||!r.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:g=>this.browser.blur(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"PRESS":let d=this.browser.url();await this.browser.press(r.value,{repeat:r.repeat,convertMeta:r.convertMeta??!0,delayMs:r.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return _s(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"REQUEST":{let m=new PM,h=AM(fetch,m),g;try{g=new URL(r.url).hostname}catch{}return{data:{...await ll({command:r,baseUrl:this.browser.baseUrl,logger:this.logger,fetchImplementation:h}),cookies:ys(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await Zb({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return sy({ctx:e,tracer:t,command:r,disableCache:i,browser:this.browser,logger:this.logger,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(r.fileSource.type==="URL"?(h=r.fileSource.url,m=await ib({uri:r.fileSource.url,logger:this.logger,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(h=r.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!m)throw new R("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!r.storageState.trim())m=void 0;else if(m=await Vn({orgId:this.orgId,code:r.storageState,fragment:!1,context:o,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore}),typeof m!="object")throw new R("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=Ss.optional().parse(m)}catch(g){throw new R("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(r.timeout??Tn)*1e3,h=await iy({command:r,tracer:t,timeoutMs:m,targetingWrapper:g=>this.wrapElementTargetingCommand(g),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,newTargets:h.newTarget?[h.newTarget]:[],thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await Pn({action:async()=>cl({assertion:r.assertion,browser:this.browser,logger:this.logger,timeout:r.timeout,signal:this.executeAbortController.signal,flagStore:this.flagStore}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:this.browser,logger:this.logger});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${r.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=Il(r.pattern),h=this.browser.registerRequestListener(m);return this.registeredListeners[r.key]=h.then(async g=>await rw(g)).catch(g=>{this.logger.error({err:g},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[r.key];if(!m)throw new R("ActionFailureError",`No listener registered with key: ${r.key}`);let h=r.timeout??10;return{data:await _(m,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=Il(r.pattern);return this.recordedRequests[r.key]=[],this.browser.registerRequestRecorder(r.key,m,async h=>{try{let g=await tw(h);this.recordedRequests[r.key]?.push(g),await nw(g,h)}catch(g){this.logger.warn({err:g},"Unexpected error while recording request")}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[r.key];if(!m)throw new R("ActionFailureError",`No recorder registered with key: ${r.key}`);return delete this.recordedRequests[r.key],{data:m,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return r.urlPattern&&(m=Il(r.urlPattern)),this.browser.setHeader(r.name,r.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:r,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:r}){this.recordAbortController=t;let o=new xl({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}};var LM=4;async function ow({socket:n,logger:e,analytics:t,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:a,devicePixelRatio:s,generatorFactory:l,enricherFactory:c,browserbase:d,authorization:p,flagStoreFactory:u,settingsFactory:m}){let h=n.id,g=n.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let f=await r.getOrgId({type:"e2e",testId:g});e=e.child({testId:g,orgId:f,sessionId:h});let S=await l(f,e),w=await c(f,e),v=await u(f),b=await m(f,e),{testMetadata:x,baseUrl:C,envName:A,browserConfig:N,environmentVariables:P,localCodeEvalTools:H}=await oo({testId:g,orgId:f,logger:e,storage:r,authorization:p,flagStore:v,settings:b}),F=Q.getSession(h);if(F)return e.info("Associating connection with existing session (likely reconnect)"),await F.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:h,orgId:f,testId:g};let O=n.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:O,event:"connect",args:n.handshake.query},"Websocket event (connect)"),O&&Q.getCurrentConnectionsByIp(O)>=LM)throw e.error({clientIp:O,sessions:Q.getCurrentSessionsByIp(),...n.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.");Q.reserveCapacityByIp(O);try{await OM({socket:n,baseUrl:C,envName:A,testMetadata:x,orgId:f,sessionId:h,logger:e,analytics:t,environmentVariables:P,clientIp:O,devicePixelRatio:s,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:a,localCodeEvalTools:H,generator:S,enricher:w,browserbase:d,browserConfig:N,flagStore:v})}catch(B){throw e.warn({err:B},"Error setting up socket session, possibly due to client closing the connection"),Q.releaseCapacityByIp(O),B}return{type:"e2e",sessionId:h,testId:g,orgId:f}}async function OM({socket:n,baseUrl:e,envName:t,devicePixelRatio:r,testMetadata:o,orgId:i,sessionId:a,logger:s,analytics:l,storage:c,uploadedFileStorage:d,visualDiffScreenshotStorage:p,serviceMocker:u,localCodeEvalTools:m,generator:h,environmentVariables:g,browserConfig:f,clientIp:S,enricher:w,flagStore:v}){let b={viewport:o.advanced?.viewport??Gt,locale:o.advanced?.locale??Io,timezoneId:o.advanced?.timezone??Po,geolocation:o.advanced?.geolocation??Lo,colorScheme:o.advanced?.colorScheme};r&&(b.deviceScaleFactor=r);let x=o.id,C=await u?.initializeServicesForTest(i,x),A=await gl({settings:f,orgId:i,baseUrl:e,envName:t,localTools:m,envVariables:g,logger:s,customHeaders:void 0,flagStore:v});s=s.child({orgId:i,sessionId:a,testId:x});let N=!1,P=v.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,s):null,H=await kn.init({baseUrl:e,userBrowserSettings:A,enricher:w,storage:c,flagStore:v,mockedServices:C,logger:s,contextArgs:b,iconKnowledgeBase:P,callbacks:{onTabsChange:(K,U)=>{n.emit("tabs",{tabs:K,activeTab:U})},onScreencastFrame:(K,U)=>{let J=n;N&&(J=n.compress(!0)),J.emit("screenshot",{buffer:K},()=>{U()})},onSvgsCollected:K=>{n.emit("newIconDetected",{numIcons:K.newSvgs.length}),c.saveNewIcons(i,K,s)}}});await H.navigate({url:e,initialNavigation:!0});let F=new gi({browser:H,generator:h,logger:s,analytics:l,flagStore:v,orgId:i,options:{scratchPadId:void 0,slowMoMs:A.slowMoMs,autoFollowNewTabs:A.autoFollowNewTabs},storage:c,localCodeEvalTools:m,uploadedFileStorage:d,visualDiffScreenshotStorage:p}),O=US(n,a,s),B=async()=>{O.timers.forEach(K=>clearInterval(K))},L=new Rt({baseUrl:e,currentUrl:F.browser.url(),variablesFromEnvironment:g,envName:t});if(!n.connected)throw await H.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");n.emit("session",{url:e,userAgent:kn.USER_AGENT,viewport:F.browser.getViewport(),sessionId:a}),Q.registerSession({controller:F,context:L,sessionId:a,cleanup:B,clientIp:S})}async function oo({testId:n,orgId:e,logger:t,storage:r,authorization:o,flagStore:i,settings:a}){let s=await r.fetchTestMetadata(n,e,t);if(!s)throw new Error(`Test metadata could not found for test ${n}`);let l;o?.type==="API_KEY"&&(l=new mr({httpClient:new Ot({...o,logger:t}),fakerSeed:void 0}));let c=s.envs?.find(g=>g.default),d;c&&(d=await r.fetchEnvironment(e,c.name,t));let p=d&&"browser"in d?d.browser:void 0,u={...a.browser,...p,...s.advanced},m=s.baseUrl||d?.variables?.[Ge];if(!m)throw new Error("Base URL is empty in both test options and the configured environment");let h={...d?.variables};return await Promise.all((s.parameters??[]).map(async g=>{let f=await Bt({orgId:e,s:g.defaultValue,context:Rt.dummyContext(d?.name,h),logger:t,flagStore:i,localTools:l});h[g.name]=f})),{localCodeEvalTools:l,baseUrl:m,envName:d?.name,browserConfig:u,environmentVariables:h,testMetadata:s}}var Np=class{parentTracer=null;socket;step;constructor({step:e,socket:t,parentTracer:r}){this.socket=t,this.parentTracer=r,this.step=e}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}heal(){}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 Pl({parentStep:this.step,socket:this.socket,parentTracer:this})}},Pl=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:r}){this.parentTracer=r,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain()}),new Np({step:e.step,parentTracer:this,socket:this.socket})}},Ll=class{constructor(e,t,r,o,i){this.socket=e;this.storage=t;this.orgId=r;this.testId=o;this.stepsBeforeRun=i}trackStatus(){}attachConsoleLogs(){}attachNetworkLogs(){}async finish(){this.socket.emit("finished")}async startStepList(){return new Pl({parentStep:null,parentTracer:null,socket:this.socket})}};var kp={currentlyExecutingRequests:{}},NM=n=>async(e,t)=>{let{testId:r,orgId:o}=n.metadata,i=await n.flagStoreFactory(o),a=await n.settingsFactory(o,n.logger),s,l=await oo({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i,settings:a}),c=`${r}|${l.baseUrl}`;try{let d=kp.currentlyExecutingRequests[c]??0;kp.currentlyExecutingRequests[c]=d+1,s=await kM({...n,...e,...l,done:t})}finally{n.logger.info({result:s,sessionId:n.metadata.sessionId},"Test execution complete"),kp.currentlyExecutingRequests[c]--}},kM=async({socket:n,steps:e,baseUrl:t,testMetadata:r,reInitialize:o,toStep:i,fromStep:a,storage:s,metadata:l,logger:c,analytics:d,envName:p,environmentVariables:u,localCodeEvalTools:m,done:h,cacheStorageFactory:g})=>{let{testId:f,sessionId:S,orgId:w}=l,v=S,b=Q.getSession(S);if(!b)throw new Error("No active session found");let{controller:x,context:C}=b;x.setOpen(),c=c.child({testId:f,orgId:w,sessionId:S,runId:v}),c.info({steps:e.map(Z=>`${Z.type}${"command"in Z?` - ${Z.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,baseUrl:t,context:C,flags:x.flagStore.getAllFlags()},"Socket execution parameters");let A=u??{},N=async()=>{o&&(await x.browser.reset({newUrl:t}),C.reset({baseUrl:t,currentUrl:x.browser.url(),variablesFromEnvironment:A,envName:p}))},P=await g(w),H=async()=>{try{await P.resolveStepCacheEntries({schemaVersion:r.schemaVersion,organizationId:w,testId:f,steps:e,logger:c})}catch(Z){c.error({err:Z},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await ra({promiseGenerator:async()=>Promise.all([N(),H()]),signal:x.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),x.setOpen()}catch(Z){if(n.emit("finished"),Z.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Z}`)}let F=MM(e),O={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},B={orgId:w,runId:v,testMetadata:r,steps:e,fromStep:a,toStep:i},L={controller:x,context:C,storage:s,debugDataStorage:new _r,codeEvalTools:m,billingReporter:new _o,logger:c,analytics:d},K={test:{},step:{onDynamicAIActionStatusUpdateEvent:Z=>{n.emit("dynamicCommandStatusUpdate",Z)},onDynamicAIActionEvaluatingEvent:Z=>{n.emit("dynamicCommandEvaluating",Z)},onDynamicCommandGenerated:Z=>{n.emit("dynamicCommandGenerated",Z)},onDynamicCommandExecuted:Z=>{n.emit("dynamicCommandExecuted",Z)}}},U=new Ll(n,s,w,f,F),J=await hl({fixtures:L,options:O,callbacks:K,inputs:B,testParams:{tracer:U}});return J?.status==="PASSED"&&await As({logger:c,cacheStorage:P,orgId:w,testId:f,originalSteps:{steps:F},updatedSteps:{steps:e}}),await U.finish(),h?.(J),J.status};var iw={event:"execute",createHandler:NM};import{cloneDeep as _M}from"lodash-es";var DM=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,a=_M(e),s=Hg(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){t?.({result:s});return}"cache"in a&&(a.cache=void 0,a.id=void 0);try{let c=await(await o(i.orgId,r)).getLintStepResult({command:a},{logger:r});t?.({result:c})}catch(l){r.error({event:"lint",err:l},"Failed to lint step"),t?.({result:void 0})}}},aw={event:"lintStep",createHandler:DM};var FM=({metadata:n,logger:e,storage:t})=>{let{sessionId:r}=n;return async(o,i)=>{let{description:a,command:s,testMetadata:l,returnScreenshot:c}=o;e.info({params:o},`Locate handler called - ${a}`);let d=Q.getSession(r);if(!d)throw new Error("No active session found");let{controller:p,context:u}=d;p.setOpen();let m=Oo.parse(l.advanced??{}),h={},g;if(a){if("useSelector"in s&&s.useSelector)try{let f=await p.locateElementWithSelector(a,"iframeUrl"in s?s.iframeUrl:void 0);g=f.resolution.locator,h={target:f.target,thoughts:f.thoughts}}catch(f){e.warn({err:f},"Failed resolving target with selector"),i({err:`Failed locating element: ${f.message}`,decisions:f instanceof xn?f.decisions:void 0});return}else try{let f=await p.locateElement({description:a,disableCache:m.disableAICaching??!1,iframeUrl:"iframeUrl"in s?s.iframeUrl:void 0,skipWait:!0,testContext:u,source:Pr(s)});h={target:f.target,thoughts:f.thoughts},g=f.resolution.locator}catch(f){(async()=>{try{let S=await p.browser.getCondensedHtml({skipWait:!0});e.warn({err:f,html:S.slice(0,1e5)},"Failed locating element with AI")}catch(S){e.warn({err:S},"Failed grabbing HTML after trying to locate element with AI")}})(),i({err:`Failed locating element with AI: ${f.message}`});return}if(s.type==="SELECT_OPTION"&&g)try{h.options=await p.browser.getSelectOptions(g)}catch(f){e.warn({err:f},"Failed getting select options"),i({err:`Failed getting select options: ${f.message}`});return}e.info({result:h},"Locate handler result")}if(c)try{let{buffer:f,width:S,height:w}=await p.screenshotWithDimensions({clearHighlights:!0,locator:g}),v=await t.uploadScreenshot(f);h.screenshot={data:v,width:S,height:w},e.info({width:S,height:w},"Captured screenshot during locate")}catch(f){e.error({err:f},"Error capturing screenshot during locate"),i({err:`Error taking screenshot: ${f.message}`});return}if(i({result:h}),g)try{await Promise.all([p.browser.scrollIntoView(g),p.browser.highlight(g)])}catch(f){e.warn({err:f},"Error highlighting element, continuing...")}}},sw={event:"locate",createHandler:FM};var UM=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({event:r,percentX:o,percentY:i})=>{let a=Q.getSession(t);if(!a)throw new Error("No active session found");let s=a.controller.browser;if(s.closed||s.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await s.clickMouseFromPositionPercentages(r,o,i)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},lw={event:"mouseClickEvent",createHandler:UM};var BM=({metadata:n,generatorFactory:e,logger:t,socket:r})=>{let{sessionId:o,orgId:i,testId:a}=n;return async({stepId:s,parentStepIdChain:l,attribute:c})=>{let d=Q.getSession(o);if(!d)throw new Error("No active session found");let{controller:p}=d,u=await e(i,t);p.setOpen(),d.browserBehavior.showOverlay=!0;let m=new AbortController;m.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(f){t.warn({err:f},"Failed to stop record mode in target click socket handler")}});let h=!1,g=(f,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(r.emit("targetRecordingUpdate",{type:f,stepId:s,parentStepIdChain:l,command:S.command,attribute:c}),m.abort(),h=!0)};setTimeout(()=>{h||(m.abort(),r.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:s,parentStepIdChain:l,attribute:c}))},1e4),await p.startRecordMode({params:{generator:u,logger:t,testId:a,orgId:i,callbacks:{onActionReceived:f=>g("clickReceived",f),onStepRecorded:f=>g("descriptionGenerated",f)}},abortController:m,isClickToRecord:!0}),r.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:s,parentStepIdChain:l,attribute:c})}},cw={event:"recordTargetClick",createHandler:BM};var zM=["Dead","Meta","AudioVolumeUp","AudioVolumeDown"],HM=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({key:r})=>{let o=Q.getSession(t);if(!o)throw new Error("No active session found");if(zM.includes(r))return;let{controller:i}=o;if(i.browser.closed||i.browser.getActivePage().isClosed()){e.debug({sessionId:t},"Browser is closed, ignoring keyboard press socket event");return}try{i.setOpen(),r.length>1?await i.browser.press(r,{}):await i.browser.type(r,{clearContent:!1})}catch(a){if(a.message.includes("has been closed")){e.debug({sessionId:t,err:a},"Browser is closed, ignoring keyboard press socket event error");return}throw a}}},dw={event:"keyboardPressEvent",createHandler:HM};var $M=({metadata:n,logger:e})=>{let{sessionId:t}=n,r,o=0,i=(l,c)=>{let d=async()=>{r=void 0};clearTimeout(r),r=setTimeout(d,Math.min(1e3,250*(o+1)))},a,s=0;return async l=>{let c=Q.getSession(t);if(!c)throw new Error("No active session found");let{controller:d,browserBehavior:p}=c,u=d.browser;if(u.closed||u.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let m=await u.scrollFromPositionPercentages(l.percentX,l.percentY,a?.x??0,a?.y??0),h=c.browserBehavior.recordingState?.transformer;h&&m&&h.recordScroll(m);return}p.showOverlay&&i(u,l);try{let m=await u.moveMouseFromPositionPercentages(l.percentX,l.percentY);s=0,a=m}catch(m){s++,s%5===0&&e.warn({err:m,mouseErrors:s},"Error in socket mouse move handler")}}},pw={event:"mouseMoveEvent",createHandler:$M};var jM=({metadata:n,generatorFactory:e,socket:t,logger:r})=>{let{sessionId:o,orgId:i,testId:a}=n;return async({stepId:s})=>{let l=Q.getSession(o);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:d}=l,p=await e(i,r);r.info("Starting cloud recording");let u=new AbortController,m=await c.startRecordMode({params:{generator:p,logger:r,testId:a,orgId:i,callbacks:{onActionReceived:(h,g)=>{t.emit("stepRecorded",{stepId:s,step:h,offset:g})},onStepRecorded:(h,g)=>{t.emit("stepRecorded",{stepId:s,step:h,offset:g})}}},abortController:u,isClickToRecord:!1});d.recordingState={transformer:m}}},uw={event:"recordingStart",createHandler:jM};var GM=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{let r=Q.getSession(t);if(!r)throw new Error("No active session found");e.info("Stopping cloud recording"),await r.controller.stopRecordMode(),r.browserBehavior.recordingState=void 0,r.browserBehavior.showOverlay=!1}},mw={event:"recordingStop",createHandler:GM};var WM=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i,settingsFactory:a})=>async(s,l)=>{let{testId:c,sessionId:d,orgId:p}=e;t.info({testId:c,sessionId:d},"Refresh event received");let u=await i(p),m=await a(p,t),{baseUrl:h}=await oo({testId:c,orgId:p,logger:t,storage:r,authorization:o,flagStore:u,settings:m}),g=Q.getSession(d);if(!g){n.emit("error",{message:"No session to refresh"});return}let{controller:f}=g;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();t.info({baseUrl:h,viewport:S},`Session refreshed for test ${c} at ${h}`),l()},hw={event:"refresh",createHandler:WM};var VM=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i,settingsFactory:a})=>async()=>{let{testId:s,sessionId:l,orgId:c}=e;t.info({testId:s,sessionId:l},"Reset event received");let d=await i(c),p=await a(c,t),{baseUrl:u,envName:m,environmentVariables:h}=await oo({testId:s,orgId:c,logger:t,storage:r,authorization:o,flagStore:d,settings:p}),g=Q.getSession(l);if(!g){n.emit("error",{message:"No session to reset"});return}let{controller:f,context:S}=g;await f.browser.reset({newUrl:u});let w=f.browser.baseUrl;S.reset({baseUrl:w,currentUrl:f.browser.url(),variablesFromEnvironment:h,envName:m});let v=f.browser.getViewport(),b=kn.USER_AGENT;t.info({baseUrl:u,viewport:v},`Session reset for test ${s} at ${w}`),n.emit("session",{url:w,userAgent:b,viewport:v,sessionId:l})},gw={event:"reset",createHandler:VM};var qM=({metadata:n})=>{let{sessionId:e}=n;return async({url:t})=>{let r=Q.getSession(e);if(!r)throw new Error("No active session found");await r.controller.browser.switchToPage({type:"SUBSTRING",substring:t})}},fw={event:"switchTab",createHandler:qM};async function Sw(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?JS(n):ow(n)}var yw=[ty,iw,sw,gw,hw,ZS,fw,aw,cw,uw,mw,pw,lw,dw,XS,BS,ey,QS];var bw=n=>{let{logger:e}=n,t=new KM(n.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async r=>{let o;try{e.info({event:"connection",transport:r.conn.transport.name},"Websocket connection established"),o=await Sw({...n,socket:r,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),r.emit("error",{message:i instanceof Error?i.message:`${i}`}),r.disconnect(!0);return}yw.forEach(i=>YM(i,{socket:r,metadata:o,...n,logger:e}))}),t},YM=(n,e)=>{let t=n.createHandler(e),r=(...o)=>{["mouseMoveEvent","keyboardPressEvent","mouseClickEvent","lintStep"].includes(n.event)||e.logger.debug({...e.metadata,event:n.event,args:o},`Websocket event (${n.event})`);let i=a=>{e.logger.error({event:n.event,type:"websocket",args:o,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(n.event,r)};import{Router as rN}from"express";import Up from"fs";import eN from"path";import vw,{multistream as JM}from"pino";import XM from"pino-pretty";var ww=["lastScreenshotBuffer"];var _p=new Map,ZM=!0,Dp=class n{consoleLogger;ddClientToken;hostname;bindingAttributes;disableConsoleLogs;site="https://http-intake.logs.us5.datadoghq.com/api/v2/logs";constructor({bindings:e,clientToken:t,hostname:r,disableConsoleLogs:o}){this.ddClientToken=t,this.hostname=r,this.disableConsoleLogs=o,this.bindingAttributes={...e,env:"production"};let i={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=ZM?vw(i):vw(i,JM([{stream:XM({colorize:!0})}]))}child(e){return new n({clientToken:this.ddClientToken,bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs})}flush(e){this.disableConsoleLogs||this.consoleLogger.flush(e)}log(e,t,r,...o){if(t&&r===void 0&&(r=`${t}`,t={}),this.disableConsoleLogs||this.consoleLogger[e](e==="error"?t:{testId:t.testId,runId:t.runId},r,...o),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error){let a={};for(let s of Object.getOwnPropertyNames(t.err))ww.includes(s)||(a[s]=t.err[s]);a.name=t.err.name,t.err=a}let i=Object.assign({},this.bindingAttributes,t&&typeof t=="object"?t:{});o.length>0&&(i.args=o),(async()=>{try{let a=await fetch(this.site,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","DD-API-KEY":this.ddClientToken},body:JSON.stringify([{ddsource:this.bindingAttributes.app,ddtags:["env:production"],hostname:this.hostname??"vercel",service:"momentic",message:{message:r||"",...i,level:e}}])});if(!a.ok)throw new Error(`Failed to log to Datadog: ${a.statusText})}`)}catch(a){this.disableConsoleLogs||this.consoleLogger.warn({obj:t,msg:r,args:o,err:a},"Failed to log to Datadog")}})()}debug(e,t,...r){this.log("debug",e,t,...r)}info(e,t,...r){this.log("info",e,t,...r)}warn(e,t,...r){this.log("warn",e,t,...r)}error(e,t,...r){this.log("error",e,t,...r)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){this.consoleLogger.level=e}enableConsoleLogs(){this.disableConsoleLogs=!1}},Ol=({app:n,clientToken:e,hostname:t,disableConsoleLogs:r})=>{if(!process.env.DD_CLIENT_TOKEN&&!process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN&&!e)throw new Error("Missing DD_CLIENT_TOKEN");return _p.has(n)||_p.set(n,new Dp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),_p.get(n)};import{hostname as QM}from"os";var je=Ol({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:QM(),disableConsoleLogs:!0}),Tw=n=>{je.addBinding("version",n)};var tN=new ol(30,60*1e3),Hp="https://api.momentic.ai",$p,Fp,xw=n=>{Hp=n},Ml=()=>Hp,Ew=(n,e)=>{$p=n,Fp?.abort(),Fp=new AbortController;let t=Fp.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=eN.resolve(n.rootDir,o.envFile);try{if(Up.lstatSync(i).isSymbolicLink())return;Up.existsSync(i)&&r.push(i)}catch(a){je.warn({err:a},`Failed to check if env file ${i} exists`)}});try{nN({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){je.error({err:o},"Failed to start config file watchers")}},me=()=>$p,fi,Bp,zp,Cw=async n=>{if(fi)return fi;let e=new st({baseUrl:Hp,apiKey:n,logger:je});try{let t=await e.getAuthInfo();return fi=t.orgId,Bp=t.userId,zp=n,fi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},wr=()=>{if(!fi)throw new Error("Your organization ID is invalid.");return fi},Nl=()=>{if(!Bp)throw new Error("Your user ID is invalid.");return Bp},Rw=()=>{if(!zp)throw new Error("Your API key is invalid.");return zp};function nN({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{Up.watch(o,{signal:t,persistent:!1,recursive:!1},(i,a)=>{a&&(tN.increment("setLocalProject")&&y.warn(`A file change under the ${r.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.`),$p=e(r.configFilePath))})})}function Re(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}var Aw=rN();Aw.get("/",Re((n,e)=>{let t=If(me(),je);e.status(200).json(t)}));var Iw=Aw;import{Router as oN}from"express";var kl=class extends oi{constructor(t,r){super(t,r);this.client=t;this.orgId=r}async getOrgId(t){return this.orgId}async fetchTestMetadata(t,r,o){let i=me(),s=Pe(i,o).tests[t];if(s)return Fs(s.relativePath,i)}async fetchApiTestMetadata(t,r,o){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(t,r,o){let i=me();return aa(r,i,Fr)}async fetchIconKnowledgeBase(t,r){try{return await this.client.fetchIconKnowledgeBase(t,r)}catch(o){return r.error({err:o},"Failed to fetch icon knowledge base"),null}}async fetchCloudOrgSettings(t,r){}};var Pw=oN();Pw.get("/",Re((n,e)=>{e.status(200).json({userId:Nl(),orgId:wr()})}));var Lw=Pw;import{Router as iN}from"express";var Ow=iN();Ow.get("/",Re((n,e)=>{let t=me(),r=Pe(t,y),o=new Set;r?.tests&&Object.values(r.tests).forEach(a=>{a.labels?.forEach(s=>o.add(s))});let i=Array.from(o).sort();e.status(200).json(i)}));var Mw=Ow;import{Router as aN}from"express";import Nw from"fs";import sN from"path";var Pa=aN();Pa.get("/",Re(async(n,e)=>{let t=me(),r=Pe(t,y),i=(await Ds(r,je)).map(a=>{let s=r.modules[a.moduleId];if(!s){y.warn(`Found a dangling module with ID ${a.moduleId} that could not be found on disk.`);return}return{...s,content:a}}).filter(a=>a!==void 0);e.status(200).json(i)}));Pa.post("/",Re(async(n,e)=>{let t;try{t=Lh.parse(n.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{ko(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let r=me(),o=Pe(r,y).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=sN.join(r.rootDir,t.folderPath??"");if(!Nw.existsSync(i)||!Nw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await xf({...t,folder:i,project:r});e.status(201).json(a)}));Pa.get("/:moduleId",Re(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=Pe(me(),y),r=t.modules[n.params.moduleId];if(!r){e.status(404).json({error:"Module not found."});return}try{let o=await md(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));Pa.patch("/:moduleId/metadata",Re(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Oh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=me(),o=Pe(r,y);Tf({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var kw=Pa;import{Router as lN}from"express";var _l=lN();_l.get("/",Re((n,e)=>{let t=Hd().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));_l.get("/current",Re((n,e)=>{let t=me(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));_l.post("/set",Re((n,e)=>{let t;try{t=Nh.parse(n.body)}catch(r){e.status(400).json({error:`Invalid request body: ${r}`});return}try{let r=en({configFilePath:t.configFilePath});Ew(r,o=>en({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var _w=_l;import{Router as cN}from"express";var Dw=cN();Dw.get("/",Re((n,e)=>{let r={ai:me().config.ai};e.status(200).json(r)}));var Fw=Dw;import{Router as uN}from"express";import Uw from"fs";import io from"path";import{v4 as Bw}from"uuid";import mN from"yaml";import{randomUUID as dN}from"node:crypto";import{PostHog as pN}from"posthog-node";var Si=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},yi=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new pN("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 n({...this.bindings,...e},this.options)}track(e,t){if(!oh(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:r,...o}=e;return this.client.capture({distinctId:dN(),event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var bi=new yi({platform:"local_app"},{flushAt:1,flushInterval:0});var vr=uN();function zw(n){let e=Pe(n,y);return Object.values(e.tests)}vr.get("/",Re((n,e)=>{let t=zw(me());e.status(200).json(t)}));vr.post("/",Re(async(n,e)=>{let t;try{t=Ih.parse(n.body)}catch(d){e.status(400).json({error:`Invalid request body: ${d}`});return}try{ko(t.name)}catch(d){e.status(400).json({error:d.message});return}let o={id:Bw(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:_e,advanced:{disableAICaching:!1,browserType:t.browserType??"Chromium",viewport:t.viewport??Gt},retries:0,steps:[]};t.environment&&(o.envs=[{name:t.environment,default:!0}]);let i=me();if(zw(i).find(d=>d.name===t.name)){e.status(400).send(`A test with the name "${t.name}" already exists. Please use a different name.`);return}let s=io.join(i.rootDir,t.folderPath??""),l=await Cf({test:o,name:t.name,folder:s}),c={...o,relativeFilePath:io.relative(i.rootDir,l)};bi.track({type:"test_editor:test_create"}),e.status(201).json(c)}));vr.get("/:testPath",Re(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r=me(),o=Pe(r,y),i;try{i=await ia(io.join(r.rootDir,t),je,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await Jt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(l=>{qr({content:l,schemaVersion:_e,momenticFiles:o,project:r})}),jn({relativeTestPath:t,steps:a,schemaVersion:_e,project:r})}catch(a){je.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));vr.patch("/:testPath/metadata",Re(async(n,e)=>{if(!n.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Ah.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:hd(n.params.testPath,t,me()).newRelativeTestPath};e.status(200).json(o)}));vr.patch("/:testPath",Re(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Rh.parse(n.body)}catch(m){e.status(400).json({error:`Invalid request body: ${m}`});return}let o=me(),i=Pe(o,y),a;try{a=Fs(t,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:l,cachesToSave:c}=await Jt({stepLists:r.stepLists,cacheCreationParams:{testId:a.id,orgId:wr()}}),d=new st({apiKey:Rw(),baseUrl:Ml(),logger:je}),p=await ni(je,d,o);await li({client:d,gitMetadata:p}).saveStepCacheEntries(c,a.id,je),l.forEach(m=>{qr({content:m,schemaVersion:r.schemaVersion,momenticFiles:i,project:o})}),jn({relativeTestPath:t,steps:s,schemaVersion:r.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));vr.patch("/:testPath/environments",Re(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Mh.parse(n.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}hd(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},me()),e.status(201).json({message:"ok"})}));vr.post("/:testPath/duplicate",Re(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Ph.parse(n.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{ko(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=me(),i=io.join(o.rootDir,t);if(!Uw.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=Pe(o,y),s;try{s=await ia(i,je,a)}catch(f){e.status(400).send({error:f.message});return}let l=Bw(),c=Yt.parse({...s,name:r.name,id:l}),{stepsToSave:d}=await Jt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:l,orgId:wr()}}),p=Hn({fileType:Ce.TEST,...c,beforeSteps:d.beforeSteps??void 0,steps:d.steps,afterSteps:d.afterSteps??void 0}),u=io.dirname(i),m=io.join(u,`${r.name}.${Lt.TEST}`),h=mN.stringify(p);Uw.writeFileSync(m,h,"utf-8");let g={relativeFilePath:io.relative(o.rootDir,m)};bi.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var Hw=vr;var La=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new ei(me(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function Ww(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:a,logger:s=je,alwaysSaveCache:l,noCache:c}=n;Tw(a),e&&xw(e),await Cw(t);let d=wr(),p=Nl();bi.identify({user_id:p,org_id:d}),s.debug({params:n,orgId:d,userId:p},"Desktop server init and api key check done");let u=bN(o,r,s),m=`http://localhost:${r}`;y.info(`Desktop server is running at ${m}`),await new Promise(x=>{try{u.listen(r,()=>{s.info(`Desktop server is running at ${m}`),x()})}catch(C){C.message.includes("EADDRINUSE")?Vw(r):y.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Ml(),apiKey:t,logger:s},f=async()=>{let x=me();return new ai(x.config.ai?.agentConfig,g)},S=async()=>new si(g,await f()),w=new st(g),v=new kl(w,wr()),b=new La;bw({baseServer:u,generatorFactory:f,enricherFactory:S,cacheStorageFactory:async()=>{let x=me(),C=await ni(s,w,x);return li({client:w,gitMetadata:C,alwaysSaveCache:l,noCache:c})},flagStoreFactory:async x=>{let C=me();return new ti(C.config)},settingsFactory:async()=>{let x=me();return{ai:{},browser:{},...x.config}},storage:v,logger:s,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:b,analytics:bi})}var Gw="25mb";function bN(n,e,t){let r=jw();r.use(hN()),r.use($w.json({limit:Gw})),r.use($w.urlencoded({extended:!1,limit:Gw}));let o=SN();if(o.use("/tests",Hw),o.use("/modules",kw),o.use("/environments",Iw),o.use("/projects",_w),o.use("/labels",Mw),o.use("/settings",Fw),o.use("/identify",Lw),r.use("/api",o),r.use((a,s,l)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&t.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&t.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),l()}),r.use((a,s,l,c)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){l.status(400).send("Client disconnected");return}t.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),y.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
3805
|
-
${a.stack}`),l.status(500).send("Internal Server Error")}),n){let a=
|
|
3801
|
+
`),tokenLength:p}),d=[],p=0,u=m.length?[m[m.length-1].id]:[],h=!1);let g=l[c],f=Ma(g);p+=f,g.length>a&&(g=g.slice(0,a));let v=Array.from(g.matchAll(Qb)).map(O=>O&&O.length>=3?{tagName:O[1],id:O[2]}:void 0).filter(O=>!!O),T=Array.from(g.matchAll(AM)).map(O=>O&&(O[2]||O[4])).filter(O=>!!O);T.reverse();let C=g.replace(/ id="[0-9]+"/g,"");d.push(C);for(let O of v)u.push(O.id),m.push(O);for(let O of T){let K=m[m.length-1];K&&K.tagName===O&&m.pop()}let A=m.some(O=>PM.includes(O.tagName)),k=l[c+1]??"",L=Ma(k),U=Array.from(k.matchAll(Qb)).map(O=>O&&O.length>2?O[1]:void 0).filter(O=>!!O),M=U.some(O=>nw.includes(O)),z=U.some(O=>IM.includes(O));p+L>=i&&(h=!0),p>=r&&(M&&!A||T.some(O=>LM.includes(O)))&&(h=!0),p>=o&&z&&!A&&(h=!0),c++}return d.length&&s.push({ids:u,content:d.join(`
|
|
3802
|
+
`),tokenLength:p}),s.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var Np=4e4,kp=8e4;async function io(n){let{serializedTree:e,logger:t,flagStore:r,softTokenLimit:o=Np}=n;if(Ma(e)<o)return e;let a=r.isBooleanFlagEnabled("rag_v2"),s;a?s=Mp({serializedTree:e,options:tw,logger:t,maxCharacterLength:1e6}):s=Mp({serializedTree:e,options:ew,logger:t,maxCharacterLength:3e6});try{return a?await D(MM({...n,chunks:s.chunks}),{milliseconds:2e4}):await D(kM({...n,chunkResult:s}),{milliseconds:15e3})}catch(l){t.warn({err:l},"Error executing page filtering, attempting AI keyword fallback");try{return await NM({...n,chunks:s.chunks})}catch(c){return t.warn({err:c},"Error executing page filtering using keyword matching, using naive truncation"),e.slice(0,kp*fi)}}}async function MM({chunks:n,generator:e,description:t,type:r,logger:o,signal:i,tree:a,softTokenLimit:s=Np,hardTokenLimit:l=kp}){let c=await e.rankChunksWithAi({chunks:n,description:t,type:r,softTokenLimit:s,hardTokenLimit:l},{abortSignal:i,logger:o,loggerTags:Ue(o)}),d=[];n.forEach((u,m)=>{c.indices.includes(m)&&(d=d.concat(u.ids))});let p=a.pruneUsingRelevantIds(new Set(d)).serialize();return o.debug({description:t,type:r,selectedChunks:c,tree:p},"Pruned a11y tree with AI page filtering"),p}async function NM(n){let{type:e,description:t,generator:r,tree:o,logger:i,hardTokenLimit:a=kp}=n;if(!t.trim())throw new Error("Empty description passed to page filtering");let s=await r.getExtractedKeywords({goal:t},{logger:n.logger,loggerTags:Ue(n.logger)});for(let l of s.keywords){let c=n.chunks.filter(m=>m.content.toLowerCase().includes(l.toLowerCase()));if(!c.length||c.reduce((m,h)=>m+h.tokenLength,0)>a&&c.length>1)continue;let p=c.flatMap(m=>m.ids),u=o.pruneUsingRelevantIds(new Set(p)).serialize();return i.debug({description:t,type:e,selectedChunks:c,tree:u},"Pruned a11y tree with keyword page filtering"),u}throw new Error("No keywords were unique enough for page filtering")}async function kM(n){let{description:e,generator:t,tree:r,logger:o,signal:i,chunkResult:a,softTokenLimit:s=Np}=n,l=await t.rankChunksWithRag({description:e,chunks:a.chunks,tokenLimit:s},{abortSignal:i,logger:o,loggerTags:Ue(o)});if(l.ids.length===0)throw new Error("RAG returned no important ids");{let c=r.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`))).serialize();return o.debug({browserState:c},"Pruned a11y tree with RAG"),c}}async function Dp(n,e){if(!n.description)throw new R("ActionFailureError","Cannot locate element with empty description");return On({action:async()=>_M(n,e),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:e.browser,logger:e.logger})}async function _M(n,e){let{disableCache:t,testContext:r,filterByViewport:o,skipWait:i,source:a}=n,{ctx:s,orgId:l,logger:c,browser:d,localCodeEvalTools:p,generator:u,abortSignal:m,flagStore:h}=e,g=n.description;r&&(g=await Ht({orgId:l,s:g,context:r,logger:e.logger,localTools:p,signal:e.abortSignal,flagStore:h})),a&&(g=DM(g,a));let{serializedTree:f,tree:S}=await vr(d,{filterByViewport:o,abortSignal:m,skipWait:i,logger:c}),w,v=Date.now(),b;for(;!w&&Date.now()-v<3e3;){m.throwIfAborted();try{w=await d.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(O){b=O}}if(!w)throw new R("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b?.message}`);let T=f,C=!1;T=await io({type:"locator",description:g,serializedTree:f,flagStore:e.flagStore,tree:S,logger:c,generator:u}),T!==f&&(C=!0);let k=`data:image/jpeg;base64,${w.toString("base64")}`,L=await u.getElementLocation({browserState:T,goal:g,screenshot:k,source:a},{disableCache:t,abortSignal:m,loggerTags:Ue(c)});c.debug({usedRag:C,result:L},"Got locator result");let j=L.id>0;if(s?.details?.push({type:"AI_LOCATION",matched:j,pageState:T,ragUsed:C,thoughts:L.thoughts}),!j)throw new R("ActionFailureError",`Could not find any relevant element: ${L.thoughts}`);let{resolution:U,target:M,frameConfig:z}=await d.createTargetFromA11yId({id:L.id,description:g,targetSource:"AI",logger:c});if(U.a11yNode?.properties?.hidden&&U.a11yNode?.properties?.hidden!=="false")throw new R("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{thoughts:L.thoughts,target:M,resolution:U,frameConfig:z,screenshot:k}}var rw="<select> element:",ow="text input or contenteditable element:",iw="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:",aw="Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:",_p=[rw,ow,iw,aw];function sw(n,e){if(n===e)return!0;for(let t of _p){if(!n.startsWith(t))continue;let r=n.slice(t.length).trim();if(_p.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===r)||r===e.trim())return!0}return!!_p.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===n.trim())}function DM(n,e){if(!n||!e)return n;switch(e){case"SELECT_OPTION":return`${rw} ${n}`;case"TYPE":return`${ow} ${n}`;case"NEGATED_CHECK":return`${iw}
|
|
3803
|
+
${n}`;case"ELEMENT_CHECK":return`${aw}
|
|
3804
|
+
${n}`;default:return n}}var FM=15;async function Fp({command:n,fixtures:e}){if(!n.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let{browser:t,logger:r}=e,o=n.timeout?n.timeout*1e3:t.smartWaitingTimeout,i=UM(o),a=0,s=Date.now(),l,c,d;try{await On({action:()=>t.clearHighlights(),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:t,logger:r})}catch(u){r.warn({err:u},"Failed to clear highlights before AI check, continuing...")}let p;for(;a<FM&&(!p||p-s<o);){e.abortSignal.throwIfAborted(),a!==0&&(r.info(`Waiting ${i}ms before retrying AI check`),await ne(i,e.abortSignal)),p=Date.now();try{let u=await On({action:async()=>{let m=await lw(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,cw({command:n,state:m,fixtures:e,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:a}))},frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t});if(!u)continue;l=u;break}catch(u){e.abortSignal.throwIfAborted(),d=u instanceof Error?u:new Error(`${u}`),r.info({err:u},`AI check assert attempt ${a} failed, retrying...`)}finally{a++}}if(!l)try{l=await On({action:async()=>cw({command:n,state:await lw(t,r,e.abortSignal),fixtures:e,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:a}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,logger:r,browser:t})}catch(u){e.abortSignal.throwIfAborted(),d=u instanceof Error?u:new Error(`${u}`)}finally{a++}if(!l){let u=`AI check still failing after ${a} attempts.`;throw d&&(u+=` Latest result: ${d.message}`),new R("AssertionFailureError",u,{lastScreenshotBuffer:c?.screenshotBuff})}return l}async function lw(n,e,t){let[r,o]=await Promise.all([vr(n,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),n.screenshot({retries:1,respectActiveFrame:!0})]);return{...r,screenshotBuff:o}}async function cw({command:n,state:e,fixtures:t,useConsensus:r,highlightElementsOnFailure:o,attemptNumber:i}){let{browser:a,logger:s,generator:l,abortSignal:c}=t,d={type:"ASSERTION"},{serializedTree:p,tree:u}=e,m=e.screenshotBuff,h=a.url(),g=p;g=await io({type:"assertion",serializedTree:p,description:n.assertion,flagStore:t.flagStore,tree:u,generator:l,logger:s,signal:c}),g!==p&&(d.ragUsed=!0),d.pageState=g;let f={goal:n.assertion,url:h,browserState:g,screenshot:m.toString("base64"),contextChoice:n.contextChoice},w=await(n.contextChoice==="VISION_ONLY"?(v,b)=>l.getVisualAssertionResult(v,b):(v,b)=>l.getAssertionResult(v,b))(f,{useConsensus:r,attemptNumber:i,disableCache:!!n.disableCache,logger:s,abortSignal:c,loggerTags:Ue(s)});if((w.result||o)&&w.relevantElements&&(d.relevantElementsSerialized=w.relevantElements.map(v=>a.getSerializedFormFromA11yId(v)).filter(v=>!!v),await BM(w.relevantElements,a,s)),!w.result)throw new R("AssertionFailureError",w.thoughts);return{succeedImmediately:!1,thoughts:w.thoughts,urlAfterCommand:h,afterScreenshotOverride:m}}function UM(n){let e;return n>10*60*1e3?e=2*60*1e3:n>60*1e3?e=20*1e3:n>10*1e3?e=2*1e3:e=1e3,e}async function BM(n,e,t){let r=Date.now();for(let o of n){if(Date.now()-r>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await D(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 zM=3e4;async function dw({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??zM/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(n.headers||{}).filter(([p,u])=>p&&u)),s;if(Bo(n.url)&&(s=n.url),t&&zo(n.url,t)&&(s=new URL(n.url,t).toString()),!s)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let c=await D((async()=>{try{return await r(s,{headers:a,method:"POST",body:JSON.stringify({query:n.query,variables:n.variables}),signal:i.signal})}catch(p){e.error({err:p},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!c)throw new R("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let p;try{p=await c.json()}catch{throw new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}throw p?.errors?.length&&p?.errors[0]?.message?new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p.errors[0].message}`):new R("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}let d={};return c.headers.forEach((p,u)=>{d[u]=p}),{status:c.status,headers:d,json:await c.json()}}function Nl(n){try{return new RegExp(n)}catch(e){throw new R("UserConfigurationError",`The provided regex expression was invalid: ${e}`)}}async function pw(n){let e=n.postData();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:n.postDataJSON()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function uw(n){let e=await n.text();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:await n.json()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function mw(n){return{request:{url:n.url(),method:n.method(),headers:await n.allHeaders(),...await pw(n)}}}async function hw(n,e){let t=await e.response();if(t)return n.response={status:t.status(),headers:await t.allHeaders(),...await uw(t)},n}async function gw(n){let e=n.request(),t=n.status(),r=n.headers(),o=await uw(n);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await pw(e)},response:{status:t,headers:r,...o},status:t,headers:r,...o}}var Si=class{flagStore;orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;analytics;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,logger:r,analytics:o,flagStore:i,storage:a,orgId:s,localCodeEvalTools:l,uploadedFileStorage:c,visualDiffScreenshotStorage:d,options:p}){this.orgId=s,this.options=p,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=a,this.uploadedFileStorage=c,this.visualDiffScreenshotStorage=d,this.localCodeEvalTools=l,this.generator=t,this.logger=r,this.analytics=o,this.flagStore=i}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:r,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[l,c]=await Promise.all([vr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=await io({type:"ai-action",description:e,serializedTree:l.serializedTree,tree:l.tree,logger:s,generator:this.generator,flagStore:this.flagStore,softTokenLimit:25e3,hardTokenLimit:5e4}),p=`data:image/jpeg;base64,${c.toString("base64")}`,u={url:this.browser.url(),browserState:d,startingScreenshot:t,history:r,goal:e,screenshot:p,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(u,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Ue(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:r,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let l=this.browser.url(),[c,d]=await Promise.all([vr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),p=`data:image/jpeg;base64,${d.toString("base64")}`,u=await io({type:"ai-action",description:e,serializedTree:c.serializedTree,tree:c.tree,logger:a,generator:this.generator,flagStore:this.flagStore,softTokenLimit:25e3,hardTokenLimit:5e4}),m={url:l,browserState:u,startingScreenshot:t,history:r,goal:e,actionHint:o,screenshot:p};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...Ue(a)},langfuseSessionId:s})}catch(h){throw new R("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return vr(this.browser,e)}async locateElement(e){return Dp(e,this.getControllerFixtures())}async locateElementWithSelector(e,t){return On({action:async()=>{let r=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:r}},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,flagStore:this.flagStore,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:a,action:s,options:l,retriesWithAI:c=1}){let d=[];for(let p=0;p<i.length;p++){let u=i[p],m=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:u,cache:a[p],action:async h=>h,options:{...l,skipFetchTree:p!==0,targetName:o[p]}});d.push(m)}try{return{result:await s(...d.map(u=>u.result)),elementInteractedDisplayStrings:d.map(u=>u.elementInteractedDisplayString),newTargets:d.map(u=>u.newTarget)}}catch(p){if(this.throwIfClosed(),c>0)return this.logger.debug({err:p},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:l,retriesWithAI:c-1});throw new R("ActionFailureError",p.message,{errOptions:{cause:p}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),r;for(let o=0;o<2;o++)try{return await On({action:()=>this.wrapElementTargetingCommandHelper(e),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(r=i,this.flagStore.isBooleanFlagEnabled("visual_actions")&&td(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&ea(i)){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}throw i}throw r instanceof R?r:new R("ActionFailureError",r?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:r,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s="target"}=o;if(t.type!=="description")throw new R("ActionFailureError","Cannot use selector with non-description target");let l=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:s,logger:a});return{result:await r({locator:l.locator}),elementInteractedDisplayString:l.displayString,newTarget:{cache:{id:-1,selector:t.elementDescriptor,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()}}}}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:r,target:o,action:i,options:a,command:s}=e,{disableCache:l,useSelector:c,targetName:d="target",targetHealingInProgress:p,source:u}=a,m=this.logger.child({commandId:s.id}),h=a.retriesWithAI??1,g=!1,f=e.cache;if((!f||l)&&!sc(o))throw new R("ActionFailureError","Cannot target element with no cached data or element descriptor");if(c)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(m.debug("Cache explicitly disabled for this step"),g=!0,f=void 0),f?.inputDescription&&!sw(o.elementDescriptor,f.inputDescription)&&(m.warn({old:f.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),g=!0,f=void 0);let S=!!f&&Uu(f);if(!f){let w=new Date;m.debug({targetHealingInProgress:p,cacheBustedBeforeAction:g},"Prompting AI for an updated element location"),g&&await ne(this.browser.smartWaitingTimeout,this.executeAbortController.signal),h--;let v=await Dp({description:o.elementDescriptor,disableCache:l,iframeUrl:a.iframeUrl,source:u},this.getControllerFixtures(t));v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let b=a.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,m),T=await i(b),C;if(p){r.heal({healType:"AI"}),this.analytics.track({type:"execution:step_heal",heal_type:"AI",step_type:"PRESET_ACTION",command_type:s.type,duration_ms:Date.now()-w.getTime()}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=Ue(m);let A=v.resolution.pageState;if(A)try{C=await this.getReverseMappedDescription({browserState:A,targetId:v.target.id,disableCache:!0,screenshot:v.screenshot})}catch(k){m.warn({err:k},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:T,elementInteractedDisplayString:v.resolution.displayString,newTarget:{cache:v.target,thoughts:v.thoughts,description:C}}}try{let w=new Date,v=await this.browser.resolveTarget(t,f,{targetName:d,logger:m});(this.flagStore.isBooleanFlagEnabled("global_locator_redirect")||this.flagStore.isBooleanFlagEnabled("visual_actions"))&&await this.browser.scrollIntoView(v.locator);let b=a.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,m),T=await i(b);if(S){let C=v.decisions.filter(A=>A.matched);if(C.length!==1)m.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let A=C[0].type;r.heal({healType:A}),this.analytics.track({type:"execution:step_heal",heal_type:A,step_type:"PRESET_ACTION",command_type:s.type,duration_ms:Date.now()-w.getTime()})}}return{result:T,elementInteractedDisplayString:v.displayString,newTarget:{cache:f}}}catch(w){this.throwIfClosed();let v=Ph(w)&&!td(w)&&!ea(w);if(w instanceof R&&!v)throw w;if(h>0&&o)return m.debug({err:w,cache:f},"Failed to execute action with cached target, retrying with AI"),this.wrapElementTargetingCommand({ctx:t,tracer:r,command:s,target:o,cache:void 0,action:i,options:{...a,retriesWithAI:h,targetHealingInProgress:!0}});throw new R("ActionFailureError",w.message,{errOptions:{cause:w}})}}async attemptLocatorRedirect(e,t){return this.flagStore.isBooleanFlagEnabled("global_locator_redirect")?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Pa(this.browser,e)}async executePresetCommand(e,t,r,o,i){this.options?.slowMoMs&&await ne(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),l;try{l=await this.resolveCommandTemplateStrings(r,o)}catch(c){throw this.throwIfClosed(),new R("ActionFailureError",`Failed to substitute template strings in command: ${c.message}`,{errOptions:{cause:c}})}try{let c=await this.executePresetCommandHelper(e,t,r,o,i);return this.flagStore.isBooleanFlagEnabled("visual_actions")&&$u(r)?await this.browser.waitForDOMStability({timeout:2e3}):!this.flagStore.isBooleanFlagEnabled("visual_actions")&&["PRESS","TYPE"].includes(r.type)&&await this.browser.waitForDOMStability({timeout:1e3}),this.options?.autoFollowNewTabs&&await Cy({beforeUrl:s,command:r,beforePages:a.map(d=>d.url),browser:this.browser,logger:this.logger}),c}catch(c){throw c.name!=="AbortError"&&this.logger.error({err:c},"Error thrown in action controller"),c}finally{this.restoreCommandTemplateReplacements(r,l)}}restoreCommandTemplateReplacements(e,t){iy(e,t)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Sp(e)}}async resolveCommandTemplateStrings(e,t){return pi({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools,flagStore:this.flagStore})}async executePresetCommandHelper(e,t,r,o,i){switch(i=i||"disableCache"in r&&!!r.disableCache,r.type){case"SUCCESS":let a=r.condition;return a?.assertion.trim()?Fp({command:a,fixtures:this.getControllerFixtures(e)}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!r.assertion.trim())throw new R("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new R("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return Fp({command:{...r,type:"AI_ASSERTION"},fixtures:this.getControllerFixtures(e)})}case"AI_EXTRACT":{if(!r.goal.trim())throw new R("ActionFailureError","Cannot perform AI extraction without goal");let m=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let g=await this.generator.getTextExtraction({goal:r.goal,browserState:m,returnSchema:r.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)});if(g.result==="NOT_FOUND")throw new R("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new R("UserConfigurationError",g.thoughts);return{thoughts:g.thoughts||void 0,data:g.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(g){let f=g.message;throw f.includes("MaxGenerationLengthExceededError")?new R("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new R("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:g}}):g}}case"NAVIGATE":if(!Bo(r.url)&&!zo(r.url,this.browser.baseUrl))throw new R("ActionFailureError",`Invalid URL provided to navigate command: ${r.url}`);await this.browser.navigate({url:r.url,loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(r.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let s=await this.browser.solveCaptcha();s&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:m=>this.browser.click(m,this.createCallbacksForBrowser(this.orgId),{}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}}),await this.browser.type(s,{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 m,h=[];if(r.target&&xn(r.target))await this.browser.hoverUsingVisualCoordinates(r.target.pixels);else if(r.target&&r.target.elementDescriptor.trim()){let{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:S=>this.browser.hover(S),options:{disableGlobalLocatorRedirect:!0,disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});m=f,h.push(g)}switch(r.type){case"SCROLL_UP":await this.browser.scrollVertical(-(r.deltaY??this.browser.getViewport().height));break;case"SCROLL_DOWN":await this.browser.scrollVertical(r.deltaY??this.browser.getViewport().height);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(r.deltaX??this.browser.getViewport().width));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(r.deltaX??this.browser.getViewport().width);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:h}}case"WAIT_FOR_URL":{if(r.timeout&&r.timeout>1800)throw new R("UserConfigurationError",`Wait for URL timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=r.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:r.timeout?r.timeout*1e3:void 0,negated:r.negated,caseInsensitive:r.caseInsensitive});break}case"WAIT":if(r.delay>1800)throw new R("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=r.delay*1e3;await ne(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"CLICK":{if(xn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r);break}let m=this.browser.url(),h={disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl},{elementInteractedDisplayString:g,newTarget:f,result:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:v=>this.browser.click(v,this.createCallbacksForBrowser(this.orgId),r),options:h});f.cache&&(r.cache={target:f.cache});let w={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return Hs(m,w.urlAfterCommand)&&(w.succeedImmediately=!0,w.succeedImmediatelyReason="URL changed"),w}case"COPY":return await this.browser.copy(r.value),{succeedImmediately:!1,data:r.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(xn(r.fromTarget)&&xn(r.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(r.fromTarget.pixels,r.toTarget.pixels,{hoverSeconds:r.hoverSeconds});break}if(xn(r.fromTarget)||xn(r.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{newTargets:m,elementInteractedDisplayStrings:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:r,targetNames:["from target","to target"],descriptions:[r.fromTarget,r.toTarget],caches:[r.cache?.fromTarget,r.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverSeconds:r.hoverSeconds,steps:r.steps}),options:{useSelector:!!r.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],newTargets:m}}case"MOUSE_DRAG":{let m=parseInt(r.deltaX),h=parseInt(r.deltaY),g=r.steps??5;if(isNaN(m)||isNaN(h))throw new R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&xn(r.target)){await this.browser.mouseDragUsingVisualCoordinates(m,h,g,r.target.pixels,{force:r.force});break}let f,S,w=[];if(r.target?.elementDescriptor){let{newTarget:v,elementInteractedDisplayString:b,result:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:async C=>C.locator,options:{useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableCache:i}});f=T,S=b,w.push(v)}return await this.browser.mouseDrag(m,h,g,f,{force:r.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:w}}case"SELECT_OPTION":{if(!rr(r.target))throw new Error("Select with x/y is not supported yet");let m=r.target.elementDescriptor,h=r.choice,{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:{type:"description",elementDescriptor:m},cache:r.cache?.target,action:S=>this.browser.selectOption(S,h,r.force),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,source:Or(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,newTargets:[g]}}case"TAB":{let m={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(r.action,m);break}case"NEW_TAB":await this.browser.createNewTab(r.url,{loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"COOKIE":if(!r.value)break;let c=await this.browser.setCookie(r.value);this.logger.debug({results:c},"Set cookies");break;case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let m;try{r.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:o.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),this.logger.debug({result:m},"Executed JavaScript in browser")):m=await Kn({orgId:this.orgId,code:r.code,fragment:!!r.fragment,context:o,timeoutMs:r.timeout?r.timeout*1e3:void 0,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){this.logger.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:this.logger})}}})}catch(h){throw this.throwIfClosed(),new R("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new R("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(r.target&&xn(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r),await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);break}let m=this.browser.url(),h,g=[],f=jM(r.target);if(f){let{elementInteractedDisplayString:w,newTarget:v}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:f,cache:r.cache?.target,action:b=>this.browser.typeIntoTarget(r.value,b,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableGlobalLocatorRedirect:!0,source:Or(r)}});g.push(v),h=w}else await this.browser.type(r.value,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter},!0);let S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,newTargets:g};return Hs(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"HOVER":{if(xn(r.target)){await this.browser.hoverUsingVisualCoordinates(r.target.pixels);break}let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.hover(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"FOCUS":{if(!rr(r.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,newTarget:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:r.target,cache:r.cache?.target,action:g=>this.browser.focus(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:[h]}}case"BLUR":{if(r.target&&!rr(r.target))throw new Error("Blur with x/y is not supported yet");if(!r.target||!r.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:g=>this.browser.blur(g),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"PRESS":let d=this.browser.url();await this.browser.press(r.value,{repeat:r.repeat,convertMeta:r.convertMeta??!0,delayMs:r.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Hs(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"REQUEST":{let m=new $M,h=HM(fetch,m),g;try{g=new URL(r.url).hostname}catch{}return{data:{...await ml({command:r,baseUrl:this.browser.baseUrl,logger:this.logger,fetchImplementation:h}),cookies:Es(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await dw({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return by({ctx:e,tracer:t,command:r,disableCache:i,browser:this.browser,logger:this.logger,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(r.fileSource.type==="URL"?(h=r.fileSource.url,m=await Sb({uri:r.fileSource.url,logger:this.logger,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(h=r.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!m)throw new R("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!r.storageState.trim())m=void 0;else if(m=await Kn({orgId:this.orgId,code:r.storageState,fragment:!1,context:o,logger:this.logger,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,flagStore:this.flagStore}),typeof m!="object")throw new R("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=Ts.optional().parse(m)}catch(g){throw new R("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(r.timeout??En)*1e3,h=await Sy({command:r,tracer:t,timeoutMs:m,targetingWrapper:g=>this.wrapElementTargetingCommand(g),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,newTargets:h.newTarget?[h.newTarget]:[],thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await On({action:async()=>hl({assertion:r.assertion,browser:this.browser,logger:this.logger,timeout:r.timeout,signal:this.executeAbortController.signal,flagStore:this.flagStore}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:this.browser,logger:this.logger});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${r.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=Nl(r.pattern),h=this.browser.registerRequestListener(m);return this.registeredListeners[r.key]=h.then(async g=>await gw(g)).catch(g=>{this.logger.error({err:g},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[r.key];if(!m)throw new R("ActionFailureError",`No listener registered with key: ${r.key}`);let h=r.timeout??10;return{data:await D(m,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=Nl(r.pattern);return this.recordedRequests[r.key]=[],this.browser.registerRequestRecorder(r.key,m,async h=>{try{let g=await mw(h);this.recordedRequests[r.key]?.push(g),await hw(g,h)}catch(g){this.logger.warn({err:g},"Unexpected error while recording request")}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[r.key];if(!m)throw new R("ActionFailureError",`No recorder registered with key: ${r.key}`);return delete this.recordedRequests[r.key],{data:m,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return r.urlPattern&&(m=Nl(r.urlPattern)),this.browser.setHeader(r.name,r.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:r,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:r,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:r}){this.recordAbortController=t;let o=new Il({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,r),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}};var GM=4;async function fw({socket:n,logger:e,analytics:t,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:a,devicePixelRatio:s,generatorFactory:l,enricherFactory:c,browserbase:d,authorization:p,flagStoreFactory:u,settingsFactory:m}){let h=n.id,g=n.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let f=await r.getOrgId({type:"e2e",testId:g});e=e.child({testId:g,orgId:f,sessionId:h});let S=await l(f,e),w=await c(f,e),v=await u(f),b=await m(f,e),{testMetadata:T,baseUrl:C,envName:A,browserConfig:k,environmentVariables:L,localCodeEvalTools:j}=await ao({testId:g,orgId:f,logger:e,storage:r,authorization:p,flagStore:v,settings:b}),U=Q.getSession(h);if(U)return e.info("Associating connection with existing session (likely reconnect)"),await U.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:h,orgId:f,testId:g};let M=n.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:M,event:"connect",args:n.handshake.query},"Websocket event (connect)"),M&&Q.getCurrentConnectionsByIp(M)>=GM)throw e.error({clientIp:M,sessions:Q.getCurrentSessionsByIp(),...n.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.");Q.reserveCapacityByIp(M);try{await WM({socket:n,baseUrl:C,envName:A,testMetadata:T,orgId:f,sessionId:h,logger:e,analytics:t,environmentVariables:L,clientIp:M,devicePixelRatio:s,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:a,localCodeEvalTools:j,generator:S,enricher:w,browserbase:d,browserConfig:k,flagStore:v})}catch(z){throw e.warn({err:z},"Error setting up socket session, possibly due to client closing the connection"),Q.releaseCapacityByIp(M),z}return{type:"e2e",sessionId:h,testId:g,orgId:f}}async function WM({socket:n,baseUrl:e,envName:t,devicePixelRatio:r,testMetadata:o,orgId:i,sessionId:a,logger:s,analytics:l,storage:c,uploadedFileStorage:d,visualDiffScreenshotStorage:p,serviceMocker:u,localCodeEvalTools:m,generator:h,environmentVariables:g,browserConfig:f,clientIp:S,enricher:w,flagStore:v}){let b={viewport:o.advanced?.viewport??Vt,locale:o.advanced?.locale??Lo,timezoneId:o.advanced?.timezone??Oo,geolocation:o.advanced?.geolocation??Mo,colorScheme:o.advanced?.colorScheme};r&&(b.deviceScaleFactor=r);let T=o.id,C=await u?.initializeServicesForTest(i,T),A=await wl({settings:f,orgId:i,baseUrl:e,envName:t,localTools:m,envVariables:g,logger:s,customHeaders:void 0,flagStore:v});s=s.child({orgId:i,sessionId:a,testId:T});let k=!1,L=v.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,s):null,j=await Dn.init({baseUrl:e,userBrowserSettings:A,enricher:w,storage:c,flagStore:v,mockedServices:C,logger:s,contextArgs:b,iconKnowledgeBase:L,callbacks:{onTabsChange:(K,B)=>{n.emit("tabs",{tabs:K,activeTab:B})},onScreencastFrame:(K,B)=>{let J=n;k&&(J=n.compress(!0)),J.emit("screenshot",{buffer:K},()=>{B()})},onSvgsCollected:K=>{n.emit("newIconDetected",{numIcons:K.newSvgs.length}),c.saveNewIcons(i,K,s)}}});await j.navigate({url:e,initialNavigation:!0});let U=new Si({browser:j,generator:h,logger:s,analytics:l,flagStore:v,orgId:i,options:{scratchPadId:void 0,slowMoMs:A.slowMoMs,autoFollowNewTabs:A.autoFollowNewTabs},storage:c,localCodeEvalTools:m,uploadedFileStorage:d,visualDiffScreenshotStorage:p}),M=JS(n,a,s),z=async()=>{M.timers.forEach(K=>clearInterval(K))},O=new It({baseUrl:e,currentUrl:U.browser.url(),variablesFromEnvironment:g,envName:t});if(!n.connected)throw await j.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");n.emit("session",{url:e,userAgent:Dn.USER_AGENT,viewport:U.browser.getViewport(),sessionId:a}),Q.registerSession({controller:U,context:O,sessionId:a,cleanup:z,clientIp:S})}async function ao({testId:n,orgId:e,logger:t,storage:r,authorization:o,flagStore:i,settings:a}){let s=await r.fetchTestMetadata(n,e,t);if(!s)throw new Error(`Test metadata could not found for test ${n}`);let l;o?.type==="API_KEY"&&(l=new gr({httpClient:new Nt({...o,logger:t}),fakerSeed:void 0}));let c=s.envs?.find(g=>g.default),d;c&&(d=await r.fetchEnvironment(e,c.name,t));let p=d&&"browser"in d?d.browser:void 0,u={...a.browser,...p,...s.advanced},m=s.baseUrl||d?.variables?.[Ge];if(!m)throw new Error("Base URL is empty in both test options and the configured environment");let h={...d?.variables};return await Promise.all((s.parameters??[]).map(async g=>{let f=await Ht({orgId:e,s:g.defaultValue,context:It.dummyContext(d?.name,h),logger:t,flagStore:i,localTools:l});h[g.name]=f})),{localCodeEvalTools:l,baseUrl:m,envName:d?.name,browserConfig:u,environmentVariables:h,testMetadata:s}}var Up=class{parentTracer=null;socket;step;constructor({step:e,socket:t,parentTracer:r}){this.socket=t,this.parentTracer=r,this.step=e}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}heal(){}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 kl({parentStep:this.step,socket:this.socket,parentTracer:this})}},kl=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:r}){this.parentTracer=r,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain()}),new Up({step:e.step,parentTracer:this,socket:this.socket})}},_l=class{constructor(e,t,r,o,i){this.socket=e;this.storage=t;this.orgId=r;this.testId=o;this.stepsBeforeRun=i}trackStatus(){}attachConsoleLogs(){}attachNetworkLogs(){}async finish(){this.socket.emit("finished")}async startStepList(){return new kl({parentStep:null,parentTracer:null,socket:this.socket})}};var Bp={currentlyExecutingRequests:{}},qM=n=>async(e,t)=>{let{testId:r,orgId:o}=n.metadata,i=await n.flagStoreFactory(o),a=await n.settingsFactory(o,n.logger),s,l=await ao({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i,settings:a}),c=`${r}|${l.baseUrl}`;try{let d=Bp.currentlyExecutingRequests[c]??0;Bp.currentlyExecutingRequests[c]=d+1,s=await KM({...n,...e,...l,done:t})}finally{n.logger.info({result:s,sessionId:n.metadata.sessionId},"Test execution complete"),Bp.currentlyExecutingRequests[c]--}},KM=async({socket:n,steps:e,baseUrl:t,testMetadata:r,reInitialize:o,toStep:i,fromStep:a,storage:s,metadata:l,logger:c,analytics:d,envName:p,environmentVariables:u,localCodeEvalTools:m,done:h,cacheStorageFactory:g})=>{let{testId:f,sessionId:S,orgId:w}=l,v=S,b=Q.getSession(S);if(!b)throw new Error("No active session found");let{controller:T,context:C}=b;T.setOpen(),c=c.child({testId:f,orgId:w,sessionId:S,runId:v}),c.info({steps:e.map(Z=>`${Z.type}${"command"in Z?` - ${Z.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,baseUrl:t,context:C,flags:T.flagStore.getAllFlags()},"Socket execution parameters");let A=u??{},k=async()=>{o&&(await T.browser.reset({newUrl:t}),C.reset({baseUrl:t,currentUrl:T.browser.url(),variablesFromEnvironment:A,envName:p}))},L=await g(w),j=async()=>{try{await L.resolveStepCacheEntries({schemaVersion:r.schemaVersion,organizationId:w,testId:f,steps:e,logger:c})}catch(Z){c.error({err:Z},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await aa({promiseGenerator:async()=>Promise.all([k(),j()]),signal:T.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),T.setOpen()}catch(Z){if(n.emit("finished"),Z.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Z}`)}let U=VM(e),M={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},z={orgId:w,runId:v,testMetadata:r,steps:e,fromStep:a,toStep:i},O={controller:T,context:C,storage:s,debugDataStorage:new Fr,codeEvalTools:m,billingReporter:new Fo,logger:c,analytics:d},K={test:{},step:{onDynamicAIActionStatusUpdateEvent:Z=>{n.emit("dynamicCommandStatusUpdate",Z)},onDynamicAIActionEvaluatingEvent:Z=>{n.emit("dynamicCommandEvaluating",Z)},onDynamicCommandGenerated:Z=>{n.emit("dynamicCommandGenerated",Z)},onDynamicCommandExecuted:Z=>{n.emit("dynamicCommandExecuted",Z)}}},B=new _l(n,s,w,f,U),J=await bl({fixtures:O,options:M,callbacks:K,inputs:z,testParams:{tracer:B}});return J?.status==="PASSED"&&await Ns({logger:c,cacheStorage:L,orgId:w,testId:f,originalSteps:{steps:U},updatedSteps:{steps:e}}),await B.finish(),h?.(J),J.status};var Sw={event:"execute",createHandler:qM};import{cloneDeep as YM}from"lodash-es";var JM=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,a=YM(e),s=Qg(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){t?.({result:s});return}"cache"in a&&(a.cache=void 0,a.id=void 0);try{let c=await(await o(i.orgId,r)).getLintStepResult({command:a},{logger:r});t?.({result:c})}catch(l){r.error({event:"lint",err:l},"Failed to lint step"),t?.({result:void 0})}}},yw={event:"lintStep",createHandler:JM};var XM=({metadata:n,logger:e,storage:t})=>{let{sessionId:r}=n;return async(o,i)=>{let{description:a,command:s,testMetadata:l,returnScreenshot:c}=o;e.info({params:o},`Locate handler called - ${a}`);let d=Q.getSession(r);if(!d)throw new Error("No active session found");let{controller:p,context:u}=d;p.setOpen();let m=No.parse(l.advanced??{}),h={},g;if(a){if("useSelector"in s&&s.useSelector)try{let f=await p.locateElementWithSelector(a,"iframeUrl"in s?s.iframeUrl:void 0);g=f.resolution.locator,h={target:f.target,thoughts:f.thoughts}}catch(f){e.warn({err:f},"Failed resolving target with selector"),i({err:`Failed locating element: ${f.message}`,decisions:f instanceof Cn?f.decisions:void 0});return}else try{let f=await p.locateElement({description:a,disableCache:m.disableAICaching??!1,iframeUrl:"iframeUrl"in s?s.iframeUrl:void 0,skipWait:!0,testContext:u,source:Or(s)});h={target:f.target,thoughts:f.thoughts},g=f.resolution.locator}catch(f){(async()=>{try{let S=await p.browser.getCondensedHtml({skipWait:!0});e.warn({err:f,html:S.slice(0,1e5)},"Failed locating element with AI")}catch(S){e.warn({err:S},"Failed grabbing HTML after trying to locate element with AI")}})(),i({err:`Failed locating element with AI: ${f.message}`});return}if(s.type==="SELECT_OPTION"&&g)try{h.options=await p.browser.getSelectOptions(g)}catch(f){e.warn({err:f},"Failed getting select options"),i({err:`Failed getting select options: ${f.message}`});return}e.info({result:h},"Locate handler result")}if(c)try{let{buffer:f,width:S,height:w}=await p.screenshotWithDimensions({clearHighlights:!0,locator:g}),v=await t.uploadScreenshot(f);h.screenshot={data:v,width:S,height:w},e.info({width:S,height:w},"Captured screenshot during locate")}catch(f){e.error({err:f},"Error capturing screenshot during locate"),i({err:`Error taking screenshot: ${f.message}`});return}if(i({result:h}),g)try{await Promise.all([p.browser.scrollIntoView(g),p.browser.highlight(g)])}catch(f){e.warn({err:f},"Error highlighting element, continuing...")}}},bw={event:"locate",createHandler:XM};var ZM=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({event:r,percentX:o,percentY:i})=>{let a=Q.getSession(t);if(!a)throw new Error("No active session found");let s=a.controller.browser;if(s.closed||s.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await s.clickMouseFromPositionPercentages(r,o,i)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},ww={event:"mouseClickEvent",createHandler:ZM};var QM=({metadata:n,generatorFactory:e,logger:t,socket:r})=>{let{sessionId:o,orgId:i,testId:a}=n;return async({stepId:s,parentStepIdChain:l,attribute:c})=>{let d=Q.getSession(o);if(!d)throw new Error("No active session found");let{controller:p}=d,u=await e(i,t);p.setOpen(),d.browserBehavior.showOverlay=!0;let m=new AbortController;m.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(f){t.warn({err:f},"Failed to stop record mode in target click socket handler")}});let h=!1,g=(f,S)=>{S.type!=="PRESET_ACTION"||S.command.type!=="CLICK"||(r.emit("targetRecordingUpdate",{type:f,stepId:s,parentStepIdChain:l,command:S.command,attribute:c}),m.abort(),h=!0)};setTimeout(()=>{h||(m.abort(),r.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:s,parentStepIdChain:l,attribute:c}))},1e4),await p.startRecordMode({params:{generator:u,logger:t,testId:a,orgId:i,callbacks:{onActionReceived:f=>g("clickReceived",f),onStepRecorded:f=>g("descriptionGenerated",f)}},abortController:m,isClickToRecord:!0}),r.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:s,parentStepIdChain:l,attribute:c})}},vw={event:"recordTargetClick",createHandler:QM};var eN=["Dead","Meta","AudioVolumeUp","AudioVolumeDown"],tN=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({key:r})=>{let o=Q.getSession(t);if(!o)throw new Error("No active session found");if(eN.includes(r))return;let{controller:i}=o;if(i.browser.closed||i.browser.getActivePage().isClosed()){e.debug({sessionId:t},"Browser is closed, ignoring keyboard press socket event");return}try{i.setOpen(),r.length>1?await i.browser.press(r,{}):await i.browser.type(r,{clearContent:!1})}catch(a){if(a.message.includes("has been closed")){e.debug({sessionId:t,err:a},"Browser is closed, ignoring keyboard press socket event error");return}throw a}}},xw={event:"keyboardPressEvent",createHandler:tN};var nN=({metadata:n,logger:e})=>{let{sessionId:t}=n,r,o=0,i=(l,c)=>{let d=async()=>{r=void 0};clearTimeout(r),r=setTimeout(d,Math.min(1e3,250*(o+1)))},a,s=0;return async l=>{let c=Q.getSession(t);if(!c)throw new Error("No active session found");let{controller:d,browserBehavior:p}=c,u=d.browser;if(u.closed||u.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let m=await u.scrollFromPositionPercentages(l.percentX,l.percentY,a?.x??0,a?.y??0),h=c.browserBehavior.recordingState?.transformer;h&&m&&h.recordScroll(m);return}p.showOverlay&&i(u,l);try{let m=await u.moveMouseFromPositionPercentages(l.percentX,l.percentY);s=0,a=m}catch(m){s++,s%5===0&&e.warn({err:m,mouseErrors:s},"Error in socket mouse move handler")}}},Tw={event:"mouseMoveEvent",createHandler:nN};var rN=({metadata:n,generatorFactory:e,socket:t,logger:r})=>{let{sessionId:o,orgId:i,testId:a}=n;return async({stepId:s})=>{let l=Q.getSession(o);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:d}=l,p=await e(i,r);r.info("Starting cloud recording");let u=new AbortController,m=await c.startRecordMode({params:{generator:p,logger:r,testId:a,orgId:i,callbacks:{onActionReceived:(h,g)=>{t.emit("stepRecorded",{stepId:s,step:h,offset:g})},onStepRecorded:(h,g)=>{t.emit("stepRecorded",{stepId:s,step:h,offset:g})}}},abortController:u,isClickToRecord:!1});d.recordingState={transformer:m}}},Ew={event:"recordingStart",createHandler:rN};var oN=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{let r=Q.getSession(t);if(!r)throw new Error("No active session found");e.info("Stopping cloud recording"),await r.controller.stopRecordMode(),r.browserBehavior.recordingState=void 0,r.browserBehavior.showOverlay=!1}},Cw={event:"recordingStop",createHandler:oN};var iN=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i,settingsFactory:a})=>async(s,l)=>{let{testId:c,sessionId:d,orgId:p}=e;t.info({testId:c,sessionId:d},"Refresh event received");let u=await i(p),m=await a(p,t),{baseUrl:h}=await ao({testId:c,orgId:p,logger:t,storage:r,authorization:o,flagStore:u,settings:m}),g=Q.getSession(d);if(!g){n.emit("error",{message:"No session to refresh"});return}let{controller:f}=g;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();t.info({baseUrl:h,viewport:S},`Session refreshed for test ${c} at ${h}`),l()},Rw={event:"refresh",createHandler:iN};var aN=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i,settingsFactory:a})=>async()=>{let{testId:s,sessionId:l,orgId:c}=e;t.info({testId:s,sessionId:l},"Reset event received");let d=await i(c),p=await a(c,t),{baseUrl:u,envName:m,environmentVariables:h}=await ao({testId:s,orgId:c,logger:t,storage:r,authorization:o,flagStore:d,settings:p}),g=Q.getSession(l);if(!g){n.emit("error",{message:"No session to reset"});return}let{controller:f,context:S}=g;await f.browser.reset({newUrl:u});let w=f.browser.baseUrl;S.reset({baseUrl:w,currentUrl:f.browser.url(),variablesFromEnvironment:h,envName:m});let v=f.browser.getViewport(),b=Dn.USER_AGENT;t.info({baseUrl:u,viewport:v},`Session reset for test ${s} at ${w}`),n.emit("session",{url:w,userAgent:b,viewport:v,sessionId:l})},Aw={event:"reset",createHandler:aN};var sN=({metadata:n})=>{let{sessionId:e}=n;return async({url:t})=>{let r=Q.getSession(e);if(!r)throw new Error("No active session found");await r.controller.browser.switchToPage({type:"SUBSTRING",substring:t})}},Iw={event:"switchTab",createHandler:sN};async function Pw(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?ly(n):fw(n)}var Lw=[my,Sw,bw,Aw,Rw,dy,Iw,yw,vw,Ew,Cw,Tw,ww,xw,cy,XS,uy,py];var Ow=n=>{let{logger:e}=n,t=new lN(n.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async r=>{let o;try{e.info({event:"connection",transport:r.conn.transport.name},"Websocket connection established"),o=await Pw({...n,socket:r,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),r.emit("error",{message:i instanceof Error?i.message:`${i}`}),r.disconnect(!0);return}Lw.forEach(i=>cN(i,{socket:r,metadata:o,...n,logger:e}))}),t},cN=(n,e)=>{let t=n.createHandler(e),r=(...o)=>{["mouseMoveEvent","keyboardPressEvent","mouseClickEvent","lintStep"].includes(n.event)||e.logger.debug({...e.metadata,event:n.event,args:o},`Websocket event (${n.event})`);let i=a=>{e.logger.error({event:n.event,type:"websocket",args:o,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(n.event,r)};import{Router as bN}from"express";import $p from"fs";import hN from"path";import Nw,{multistream as dN}from"pino";import pN from"pino-pretty";var Mw=["lastScreenshotBuffer"];var zp=new Map,uN=!0,Hp=class n{consoleLogger;ddClientToken;hostname;bindingAttributes;disableConsoleLogs;site="https://http-intake.logs.us5.datadoghq.com/api/v2/logs";constructor({bindings:e,clientToken:t,hostname:r,disableConsoleLogs:o}){this.ddClientToken=t,this.hostname=r,this.disableConsoleLogs=o,this.bindingAttributes={...e,env:"production"};let i={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=uN?Nw(i):Nw(i,dN([{stream:pN({colorize:!0})}]))}child(e){return new n({clientToken:this.ddClientToken,bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs})}flush(e){this.disableConsoleLogs||this.consoleLogger.flush(e)}log(e,t,r,...o){if(t&&r===void 0&&(r=`${t}`,t={}),this.disableConsoleLogs||this.consoleLogger[e](e==="error"?t:{testId:t.testId,runId:t.runId},r,...o),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error){let a={};for(let s of Object.getOwnPropertyNames(t.err))Mw.includes(s)||(a[s]=t.err[s]);a.name=t.err.name,t.err=a}let i=Object.assign({},this.bindingAttributes,t&&typeof t=="object"?t:{});o.length>0&&(i.args=o),(async()=>{try{let a=await fetch(this.site,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","DD-API-KEY":this.ddClientToken},body:JSON.stringify([{ddsource:this.bindingAttributes.app,ddtags:["env:production"],hostname:this.hostname??"vercel",service:"momentic",message:{message:r||"",...i,level:e}}])});if(!a.ok)throw new Error(`Failed to log to Datadog: ${a.statusText})}`)}catch(a){this.disableConsoleLogs||this.consoleLogger.warn({obj:t,msg:r,args:o,err:a},"Failed to log to Datadog")}})()}debug(e,t,...r){this.log("debug",e,t,...r)}info(e,t,...r){this.log("info",e,t,...r)}warn(e,t,...r){this.log("warn",e,t,...r)}error(e,t,...r){this.log("error",e,t,...r)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){this.consoleLogger.level=e}enableConsoleLogs(){this.disableConsoleLogs=!1}},Dl=({app:n,clientToken:e,hostname:t,disableConsoleLogs:r})=>{if(!process.env.DD_CLIENT_TOKEN&&!process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN&&!e)throw new Error("Missing DD_CLIENT_TOKEN");return zp.has(n)||zp.set(n,new Hp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),zp.get(n)};import{hostname as mN}from"os";var $e=Dl({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:mN(),disableConsoleLogs:!0}),kw=n=>{$e.addBinding("version",n)};var gN=new cl(30,60*1e3),Vp="https://api.momentic.ai",qp,jp,_w=n=>{Vp=n},Fl=()=>Vp,Dw=(n,e)=>{qp=n,jp?.abort(),jp=new AbortController;let t=jp.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=hN.resolve(n.rootDir,o.envFile);try{if($p.lstatSync(i).isSymbolicLink())return;$p.existsSync(i)&&r.push(i)}catch(a){$e.warn({err:a},`Failed to check if env file ${i} exists`)}});try{fN({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){$e.error({err:o},"Failed to start config file watchers")}},ie=()=>qp,yi,Gp,Wp,Fw=async n=>{if(yi)return yi;let e=new lt({baseUrl:Vp,apiKey:n,logger:$e});try{let t=await e.getAuthInfo();return yi=t.orgId,Gp=t.userId,Wp=n,yi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},xr=()=>{if(!yi)throw new Error("Your organization ID is invalid.");return yi},Ul=()=>{if(!Gp)throw new Error("Your user ID is invalid.");return Gp},Uw=()=>{if(!Wp)throw new Error("Your API key is invalid.");return Wp};function fN({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{$p.watch(o,{signal:t,persistent:!1,recursive:!1},(i,a)=>{a&&(gN.increment("setLocalProject")&&y.warn(`A file change under the ${r.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.`),qp=e(r.configFilePath))})})}var Bl=class extends ai{constructor(t,r){super(t,r);this.client=t;this.orgId=r}async getOrgId(t){return this.orgId}async fetchTestMetadata(t,r,o){let i=ie(),s=we(i,o).tests[t];if(s)return $s(s.relativePath,i)}async fetchApiTestMetadata(t,r,o){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(t,r,o){let i=ie();return ca(r,i,Br)}async fetchIconKnowledgeBase(t,r){try{return await this.client.fetchIconKnowledgeBase(t,r)}catch(o){return r.error({err:o},"Failed to fetch icon knowledge base"),null}}async fetchCloudOrgSettings(t,r){}};function ce(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}import{Router as SN}from"express";import Bw from"fs";import yN from"path";var Na=SN();async function Kp(n){return(await js(n,$e)).map(r=>{let o=n.modules[r.moduleId];if(!o){y.warn(`Found a dangling module with ID ${r.moduleId} that could not be found on disk.`);return}return{...o,content:r}}).filter(r=>r!==void 0)}Na.get("/",ce(async(n,e)=>{let t=ie(),r=we(t,y),o=await Kp(r);e.status(200).json(o)}));Na.post("/",ce(async(n,e)=>{let t;try{t=Uh.parse(n.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Do(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let r=ie(),o=we(r,y).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=yN.join(r.rootDir,t.folderPath??"");if(!Bw.existsSync(i)||!Bw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await _f({...t,folder:i,project:r});e.status(201).json(a)}));Na.get("/:moduleId",ce(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=we(ie(),y),r=t.modules[n.params.moduleId];if(!r){e.status(404).json({error:"Module not found."});return}try{let o=await yd(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));Na.patch("/:moduleId/metadata",ce(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Bh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=ie(),o=we(r,y);kf({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var zw=Na;var Hw=bN();Hw.get("/",ce(async(n,e)=>{let t=ie(),r=we(t,y),o=new Set;r?.tests&&Object.values(r.tests).forEach(c=>{c.labels?.forEach(d=>o.add(d))});let i=Array.from(o).sort(),a=Object.values(r.tests),s=await Kp(r),l={labels:i,tests:a,modules:s};e.status(200).json(l)}));var jw=Hw;import{Router as wN}from"express";var Yp=wN();Yp.get("/",ce((n,e)=>{let t=zf(ie(),$e);e.status(200).json(t)}));Yp.get("/names",ce((n,e)=>{let r=ie().config.environments?.map(o=>o.name)??[];e.status(200).json(r)}));var $w=Yp;import{Router as vN}from"express";import gt from"fs";import rt from"path";var _a=vN();function ka(n){let e=ie(),t=rt.dirname(e.configFilePath);return rt.join(t,...n)}function xN(n){let e=ie(),t=rt.dirname(e.configFilePath),r=rt.relative(t,n);return r?r.split(rt.sep):[]}function TN(n,e){let t=gt.statSync(n),r=xN(n);return rd.parse({name:e,absolutePath:n,relativePath:r.join(rt.sep),pathSegments:r,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}_a.post("/",ce(async(n,e,t)=>{let r;try{r=jh.parse(n.body).pathSegments}catch(l){e.status(400).json({error:`Failed to parse folder read body: ${l}`});return}let o=ka(r);if(!gt.existsSync(o)){e.status(404).json({error:`Path not found: ${r.join(rt.sep)}`});return}if(!gt.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${r.join(rt.sep)}`});return}let a=gt.readdirSync(o).map(l=>{let c=rt.join(o,l);return TN(c,l)}),s={absolutePath:o,pathSegments:r,contents:a};e.status(200).json(s)}));_a.put("/",ce(async(n,e,t)=>{let r;try{r=$h.parse(n.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=ka(r);if(gt.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${r.join(rt.sep)}`,pathSegments:r});return}gt.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${r.join(rt.sep)}`,pathSegments:r};e.status(201).json(i)}));_a.patch("/",ce(async(n,e,t)=>{let r,o;try{let c=Gh.parse(n.body);r=c.pathSegments,o=c.newPathSegments}catch(c){e.status(400).json({error:`Failed to parse folder update body: ${c}`});return}let i=ka(r),a=ka(o);if(!gt.existsSync(i)){e.status(400).json({error:`Folder not found: ${r.join(rt.sep)}`});return}if(gt.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(rt.sep)}`});return}let s=rt.dirname(a);gt.existsSync(s)||gt.mkdirSync(s,{recursive:!0}),gt.renameSync(i,a);let l={success:!0,message:`Folder moved from ${r.join(rt.sep)} to ${o.join(rt.sep)}`,pathSegments:o};e.status(200).json(l)}));_a.delete("/",ce(async(n,e,t)=>{let r,o=!0;try{let l=Wh.parse(n.body);r=l.pathSegments,o=l.recursive??!0}catch(l){e.status(400).json({error:`Failed to parse folder delete body: ${l}`});return}let i=ka(r);if(!gt.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${r.join(rt.sep)}`,pathSegments:r});return}if(!gt.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${r.join(rt.sep)}`});return}if(o)gt.rmSync(i,{recursive:!0,force:!0});else{if(gt.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${r.join("/")}`});return}gt.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${r.join("/")}`,pathSegments:r};e.status(200).json(s)}));var Gw=_a;import{Router as EN}from"express";var Ww=EN();Ww.get("/",ce((n,e)=>{e.status(200).json({userId:Ul(),orgId:xr()})}));var Vw=Ww;import{Router as CN}from"express";var qw=CN();qw.get("/",ce((n,e)=>{let t=ie(),r=we(t,y),o=new Set;r?.tests&&Object.values(r.tests).forEach(a=>{a.labels?.forEach(s=>o.add(s))});let i=Array.from(o).sort();e.status(200).json(i)}));var Kw=qw;import{Router as RN}from"express";var zl=RN();zl.get("/",ce((n,e)=>{let t=Vd().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));zl.get("/current",ce((n,e)=>{let t=ie(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));zl.post("/set",ce((n,e)=>{let t;try{t=Hh.parse(n.body)}catch(r){e.status(400).json({error:`Invalid request body: ${r}`});return}try{let r=nn({configFilePath:t.configFilePath});Dw(r,o=>nn({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var Yw=zl;import{Router as AN}from"express";var Jw=AN();Jw.get("/",ce((n,e)=>{let r={ai:ie().config.ai};e.status(200).json(r)}));var Xw=Jw;import{Router as LN}from"express";import Zw from"fs";import so from"path";import{v4 as Qw}from"uuid";import ON from"yaml";import{randomUUID as IN}from"node:crypto";import{PostHog as PN}from"posthog-node";var bi=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},wi=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new PN("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 n({...this.bindings,...e},this.options)}track(e,t){if(!uh(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:r,...o}=e;return this.client.capture({distinctId:IN(),event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var vi=new wi({platform:"local_app"},{flushAt:1,flushInterval:0});var Tr=LN();Tr.get("/",ce((n,e)=>{let t=ie(),r=we(t,y),o=Object.values(r.tests);e.status(200).json(o)}));Tr.post("/",ce(async(n,e)=>{let t;try{t=Dh.parse(n.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}try{Do(t.name)}catch(p){e.status(400).json({error:p.message});return}let o={id:Qw(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:_e,advanced:{disableAICaching:!1,browserType:t.browserType??"Chromium",viewport:t.viewport??Vt},retries:0,steps:[]};t.environment&&(o.envs=[{name:t.environment,default:!0}]);let i=ie(),a=we(i,y);if(Object.values(a.tests).find(p=>p.name===t.name)){e.status(400).send(`A test with the name "${t.name}" already exists. Please use a different name.`);return}let l=so.join(i.rootDir,...t.pathSegments||[]),c=await Ff({test:o,name:t.name,folder:l}),d={...o,relativeFilePath:so.relative(i.rootDir,c)};vi.track({type:"test_editor:test_create"}),e.status(201).json(d)}));Tr.get("/:testPath",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r=ie(),o=we(r,y),i;try{i=await la(so.join(r.rootDir,t),$e,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await Zt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(l=>{Yr({content:l,schemaVersion:_e,momenticFiles:o,project:r})}),Wn({relativeTestPath:t,steps:a,schemaVersion:_e,project:r})}catch(a){$e.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Tr.patch("/:testPath/metadata",ce(async(n,e)=>{if(!n.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=_h.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:bd(n.params.testPath,t,ie()).newRelativeTestPath};e.status(200).json(o)}));Tr.patch("/:testPath",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=kh.parse(n.body)}catch(m){e.status(400).json({error:`Invalid request body: ${m}`});return}let o=ie(),i=we(o,y),a;try{a=$s(t,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:l,cachesToSave:c}=await Zt({stepLists:r.stepLists,cacheCreationParams:{testId:a.id,orgId:xr()}}),d=new lt({apiKey:Uw(),baseUrl:Fl(),logger:$e}),p=await oi($e,d,o);await di({client:d,gitMetadata:p}).saveStepCacheEntries(c,a.id,$e),l.forEach(m=>{Yr({content:m,schemaVersion:r.schemaVersion,momenticFiles:i,project:o})}),Wn({relativeTestPath:t,steps:s,schemaVersion:r.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Tr.patch("/:testPath/environments",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=zh.parse(n.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}bd(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},ie()),e.status(201).json({message:"ok"})}));Tr.post("/:testPath/duplicate",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Fh.parse(n.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Do(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=ie(),i=so.join(o.rootDir,t);if(!Zw.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=we(o,y),s;try{s=await la(i,$e,a)}catch(f){e.status(400).send({error:f.message});return}let l=Qw(),c=Xt.parse({...s,name:r.name,id:l}),{stepsToSave:d}=await Zt({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:l,orgId:xr()}}),p=$n({fileType:Ae.TEST,...c,beforeSteps:d.beforeSteps??void 0,steps:d.steps,afterSteps:d.afterSteps??void 0}),u=so.dirname(i),m=so.join(u,`${r.name}.${Mt.TEST}`),h=ON.stringify(p);Zw.writeFileSync(m,h,"utf-8");let g={relativeFilePath:so.relative(o.rootDir,m)};vi.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var ev=Tr;var Da=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new ni(ie(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function ov(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:a,logger:s=$e,alwaysSaveCache:l,noCache:c}=n;kw(a),e&&_w(e),await Fw(t);let d=xr(),p=Ul();vi.identify({user_id:p,org_id:d}),s.debug({params:n,orgId:d,userId:p},"Desktop server init and api key check done");let u=FN(o,r,s),m=`http://localhost:${r}`;y.info(`Desktop server is running at ${m}`),await new Promise(T=>{try{u.listen(r,()=>{s.info(`Desktop server is running at ${m}`),T()})}catch(C){C.message.includes("EADDRINUSE")?iv(r):y.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Fl(),apiKey:t,logger:s},f=async()=>{let T=ie();return new li(T.config.ai?.agentConfig,g)},S=async()=>new ci(g,await f()),w=new lt(g),v=new Bl(w,xr()),b=new Da;Ow({baseServer:u,generatorFactory:f,enricherFactory:S,cacheStorageFactory:async()=>{let T=ie(),C=await oi(s,w,T);return di({client:w,gitMetadata:C,alwaysSaveCache:l,noCache:c})},flagStoreFactory:async T=>{let C=ie();return new ri(C.config)},settingsFactory:async()=>{let T=ie();return{ai:{},browser:{},...T.config}},storage:v,logger:s,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:b,analytics:vi})}var rv="25mb";function FN(n,e,t){let r=nv();r.use(MN()),r.use(tv.json({limit:rv})),r.use(tv.urlencoded({extended:!1,limit:rv}));let o=_N();if(o.use("/tests",ev),o.use("/modules",zw),o.use("/environments",$w),o.use("/projects",Yw),o.use("/labels",Kw),o.use("/folders",Gw),o.use("/settings",Xw),o.use("/identify",Vw),o.use("/entities",jw),r.use("/api",o),r.use((a,s,l)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&t.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&t.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),l()}),r.use((a,s,l,c)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){l.status(400).send("Client disconnected");return}t.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),y.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
3805
|
+
${a.stack}`),l.status(500).send("Internal Server Error")}),n){let a=nv.static(n,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")}});r.use("/",a),r.use("*",a)}let i=DN.createServer(r);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(iv(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}kN.setMaxListeners(50);process.on("warning",n=>{$e.warn({err:n},`Node warning received on desktop-server: ${n.message}`)});process.on("uncaughtException",n=>{$e.error({err:n},"Uncaught exception leading to exit on desktop-server"),y.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${n.message}`)});process.on("unhandledRejection",(n,e)=>{$e.error({reason:`${n}`,promise:`${e}`,stack:n?.stack},"Uncaught exception leading to exit on desktop-server (promise rejection)"),y.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${n}`)});function iv(n){y.error(NN`Port ${n} is already in use by another process. Please close the other process and try again.
|
|
3806
3806
|
Using Bash on MacOS or Linux:
|
|
3807
3807
|
lsof -t -i :58888 | xargs kill -9
|
|
3808
3808
|
|
|
3809
3809
|
Using Command Prompt on Windows:
|
|
3810
3810
|
for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
|
|
3811
|
-
`)}import
|
|
3811
|
+
`)}import Zk from"events";import ic from"fs";import Qk from"open";import oc from"path";import{fileURLToPath as e_}from"url";import nk from"diff-lines";import{gt as rk}from"semver";import{execSync as UN}from"child_process";import{platform as BN}from"os";function Jp(){return av()?(y.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),y.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.
|
|
3812
3812
|
`),2):(y.dimmed("Setting device pixel ratio to 1."),y.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.
|
|
3813
|
-
l.`),1)}function qw(){return vN()==="darwin"&&wN("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Gp(n){qw()&&n===1&&(y.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),y.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import TN from"@actions/exec";import xN from"@actions/io";import EN from"quote";import CN from"string-argv";async function Kw(n,e=!0){let t=CN(n),r=await xN.which(t[0],!0),o=t.slice(1),i=TN.exec(EN(r),o,{delay:100});if(e)return i}import{existsSync as RN,statSync as AN}from"fs";var wi=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;function Yw(n){try{return RN(n)&&AN(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import IN from"csv-parser";import{createReadStream as PN}from"fs";function Wp(n){return new Promise((e,t)=>{let r=[];PN(n).pipe(IN()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Dl from"semver";import{z as Fl}from"zod";var yn="2.3.1",LN="https://registry.npmjs.org/momentic",ON=Fl.object({versions:Fl.record(Fl.string(),Fl.unknown()).optional()});async function Jw(n){try{await MN(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function MN(n){if(!yn){n.warn("Unable to check CLI version because CLI_VERSION is not set");return}let e;for(let r=0;r<2;r++)try{let o=await _(fetch(LN),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=ON.parse(i).versions;break}catch(o){n.warn({err:o},"Failed to fetch npm registry data")}if(!e){n.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let r of Object.keys(e))Dl.valid(r)&&(!t||Dl.gt(r,t))&&Dl.gt(r,yn)&&Dl.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(y.warn(`Update available: v${yn} -> v${t}`),y.warn("This version may be missing critical fixes, features, and security updates."),y.warn(`Run "npx momentic@${t} -V" to update`))}import{existsSync as kN,mkdirSync as _N,statSync as DN}from"fs";import{dirname as FN}from"path";import Zw from"readline/promises";import{hostname as NN}from"os";var ne=Ol({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:NN(),disableConsoleLogs:!0}).child({version:"2.3.1"});var Vp=!1,Qw=(()=>{try{return DN("/.dockerenv"),!0}catch{return!1}})();async function ht(n,e){if(wi||Vp||Qw)return!0;ne.flush(),await new Promise(a=>setTimeout(a,500));let t=Zw.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let a=`${r.slice(0,r.length-1).join(".").trim()}.`;e?y.warn(a):y.log(a),o=r[r.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(Vp=!0,setTimeout(()=>{Vp=!1},3e3),!0):i.toLowerCase()==="y"}async function qp(n){let e=FN(n);return Yw(e)?kN(n)?ht(`File '${Xw(n)}' already exists. Overwrite existing content?`,!0):!0:await ht(`Directory '${Xw(e)}' doesn't exist. Create it now?`,!0)?(_N(e,{recursive:!0}),!0):!1}function Xw(n){return n.replace(/(\s+)/g,"\\$1")}async function ev(n,e){if(wi||Qw)return e;let t=Zw.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function tv({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){BN(e.schemaVersion,_e)&&(y.error(`This version of the CLI does not support the schema version of the fragment (${e.schemaVersion}). Please update to the latest version of the CLI and retry this command.`),process.exit(1)),Mg(e.steps).forEach(g=>{t.modules[g]||(y.error(`The test patch contains a module with id ${g} that could not be found in the current project. This suggests that either this test patch or your local file system may be out of date.`),process.exit(1))}),e.createdAt.getTime()<Date.now()-7*24*60*60*1e3&&!i&&!await ht("The test patch you are applying is more than 7 days old. Are you sure you want to continue?",!0)&&process.exit(1);let s=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<s&&!i&&!await ht("The test patch you are applying was created before the test was last updated. Are you sure you want to continue?",!0)&&process.exit(1);let l=Yr(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let d,p;if(e.schemaVersion!==_e){let{steps:g,newVersion:f}=await ta({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:y});d=f,p=Ae.array().parse(g)}else p=Ae.array().parse(e.steps);let{stepsToSave:u,moduleUpdates:m}=await Jt({stepLists:{steps:p}});u.beforeSteps=l.beforeSteps??void 0,u.afterSteps=l.afterSteps??void 0;let h=UN(JSON.stringify(c,void 0,2),JSON.stringify(u,void 0,2),{n_surrounding:5});y.dimmed("=".repeat(30)),y.dimmed(h),y.dimmed("=".repeat(30)),y.dimmed(""),d&&y.warn(`If this patch is applied, your test will also be automatically upgraded to the latest schema version (${d}). Schema upgrades have no impact on functionality, although you may notice minor differences in the test YAML.`),!i&&!await ht("Do you want to apply this patch?")&&(y.dimmed("Cancelled."),process.exit(1)),jn({relativeTestPath:n.relativePath,steps:u,schemaVersion:d??e.schemaVersion,project:t.project}),y.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as lo}from"crypto";import{z as Tv}from"zod";var zt=" ".repeat(6);import vv from"chalk";import{Argument as ao,Option as Le}from"@commander-js/extra-typings";import{validateHeaderValue as zN}from"http";import{cpus as nv}from"os";import{parse as kue}from"yaml";import{z as q}from"zod";var Ul=58888,Kp=30*60*1e3,Kn=new Le("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),Yn=new Le("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),so=new Le("-y, --yes","Skip all confirmation prompts.").env("CI"),Yp=new Le("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),Jp=new Le("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${Kp/1e3} seconds.`),Bl=new Le("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),ov=new Le("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(qi)),iv=new Le("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. Defaults to 'reports' if unset."),Xp=new Le("--output-dir <outputDir>","[Alpha] Output directory to store run artifacts such as screenshots, results, and logs. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. This directory will be cleared at the start of execution."),av=new Le("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),sv=new Le("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),lv=new Le("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),Zp=new Le("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio."),cv=new Le("--port <port>",`Port to run the app on. Defaults to ${Ul}.`),Qp=new Le("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),zl=new Le("--env <env>","Name of the environment to use when running tests."),Hl=new Le("--url-override <urlOverride>","Fully qualified url (e.g. https://www.google.com) to start all tests from. Overrides any default starting url set from the test or environment."),dv=new Le("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),_n=new Le("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),eu=new Le("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),pv=new Le("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),uv=new Le("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),tu=new Le("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on the protected branches configured in the momentic.config.yaml.").env("CI"),nu=new Le("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),mv=new ao("<tests...>",`One or more test paths to queue on Momentic Cloud.
|
|
3813
|
+
l.`),1)}function av(){return BN()==="darwin"&&UN("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Xp(n){av()&&n===1&&(y.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),y.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import zN from"@actions/exec";import HN from"@actions/io";import jN from"quote";import $N from"string-argv";async function sv(n,e=!0){let t=$N(n),r=await HN.which(t[0],!0),o=t.slice(1),i=zN.exec(jN(r),o,{delay:100});if(e)return i}import{existsSync as GN,statSync as WN}from"fs";var xi=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;function lv(n){try{return GN(n)&&WN(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import VN from"csv-parser";import{createReadStream as qN}from"fs";function Zp(n){return new Promise((e,t)=>{let r=[];qN(n).pipe(VN()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Hl from"semver";import{z as jl}from"zod";var wn="2.3.2",KN="https://registry.npmjs.org/momentic",YN=jl.object({versions:jl.record(jl.string(),jl.unknown()).optional()});async function cv(n){try{await JN(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function JN(n){if(!wn){n.warn("Unable to check CLI version because CLI_VERSION is not set");return}let e;for(let r=0;r<2;r++)try{let o=await D(fetch(KN),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=YN.parse(i).versions;break}catch(o){n.warn({err:o},"Failed to fetch npm registry data")}if(!e){n.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let r of Object.keys(e))Hl.valid(r)&&(!t||Hl.gt(r,t))&&Hl.gt(r,wn)&&Hl.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(y.warn(`Update available: v${wn} -> v${t}`),y.warn("This version may be missing critical fixes, features, and security updates."),y.warn(`Run "npx momentic@${t} -V" to update`))}import{existsSync as ZN,mkdirSync as QN,statSync as ek}from"fs";import{dirname as tk}from"path";import pv from"readline/promises";import{hostname as XN}from"os";var ee=Dl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:XN(),disableConsoleLogs:!0}).child({version:"2.3.2"});var Qp=!1,uv=(()=>{try{return ek("/.dockerenv"),!0}catch{return!1}})();async function ft(n,e){if(xi||Qp||uv)return!0;ee.flush(),await new Promise(a=>setTimeout(a,500));let t=pv.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let a=`${r.slice(0,r.length-1).join(".").trim()}.`;e?y.warn(a):y.log(a),o=r[r.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(Qp=!0,setTimeout(()=>{Qp=!1},3e3),!0):i.toLowerCase()==="y"}async function eu(n){let e=tk(n);return lv(e)?ZN(n)?ft(`File '${dv(n)}' already exists. Overwrite existing content?`,!0):!0:await ft(`Directory '${dv(e)}' doesn't exist. Create it now?`,!0)?(QN(e,{recursive:!0}),!0):!1}function dv(n){return n.replace(/(\s+)/g,"\\$1")}async function mv(n,e){if(xi||uv)return e;let t=pv.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function hv({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){rk(e.schemaVersion,_e)&&(y.error(`This version of the CLI does not support the schema version of the fragment (${e.schemaVersion}). Please update to the latest version of the CLI and retry this command.`),process.exit(1)),Gg(e.steps).forEach(g=>{t.modules[g]||(y.error(`The test patch contains a module with id ${g} that could not be found in the current project. This suggests that either this test patch or your local file system may be out of date.`),process.exit(1))}),e.createdAt.getTime()<Date.now()-7*24*60*60*1e3&&!i&&!await ft("The test patch you are applying is more than 7 days old. Are you sure you want to continue?",!0)&&process.exit(1);let s=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<s&&!i&&!await ft("The test patch you are applying was created before the test was last updated. Are you sure you want to continue?",!0)&&process.exit(1);let l=Xr(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let d,p;if(e.schemaVersion!==_e){let{steps:g,newVersion:f}=await oa({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:y});d=f,p=Ie.array().parse(g)}else p=Ie.array().parse(e.steps);let{stepsToSave:u,moduleUpdates:m}=await Zt({stepLists:{steps:p}});u.beforeSteps=l.beforeSteps??void 0,u.afterSteps=l.afterSteps??void 0;let h=nk(JSON.stringify(c,void 0,2),JSON.stringify(u,void 0,2),{n_surrounding:5});y.dimmed("=".repeat(30)),y.dimmed(h),y.dimmed("=".repeat(30)),y.dimmed(""),d&&y.warn(`If this patch is applied, your test will also be automatically upgraded to the latest schema version (${d}). Schema upgrades have no impact on functionality, although you may notice minor differences in the test YAML.`),!i&&!await ft("Do you want to apply this patch?")&&(y.dimmed("Cancelled."),process.exit(1)),Wn({relativeTestPath:n.relativePath,steps:u,schemaVersion:d??e.schemaVersion,project:t.project}),y.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as po}from"crypto";import{z as _v}from"zod";var jt=" ".repeat(6);import kv from"chalk";import{Argument as lo,Option as Oe}from"@commander-js/extra-typings";import{validateHeaderValue as ok}from"http";import{cpus as gv}from"os";import{parse as wme}from"yaml";import{z as q}from"zod";var $l=58888,tu=30*60*1e3,Jn=new Oe("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),Xn=new Oe("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),co=new Oe("-y, --yes","Skip all confirmation prompts.").env("CI"),nu=new Oe("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),ru=new Oe("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${tu/1e3} seconds.`),Gl=new Oe("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),Sv=new Oe("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(Yi)),yv=new Oe("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. Defaults to 'reports' if unset."),ou=new Oe("--output-dir <outputDir>","[Alpha] Output directory to store run artifacts such as screenshots, results, and logs. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. This directory will be cleared at the start of execution."),bv=new Oe("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),wv=new Oe("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),vv=new Oe("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),iu=new Oe("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio."),xv=new Oe("--port <port>",`Port to run the app on. Defaults to ${$l}.`),au=new Oe("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),Wl=new Oe("--env <env>","Name of the environment to use when running tests."),Vl=new Oe("--url-override <urlOverride>","Fully qualified url (e.g. https://www.google.com) to start all tests from. Overrides any default starting url set from the test or environment."),Tv=new Oe("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),Fn=new Oe("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),su=new Oe("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),Ev=new Oe("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),Cv=new Oe("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),lu=new Oe("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on the protected branches configured in the momentic.config.yaml.").env("CI"),cu=new Oe("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),Rv=new lo("<tests...>",`One or more test paths to queue on Momentic Cloud.
|
|
3814
3814
|
|
|
3815
|
-
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic pull hello-world'.`),
|
|
3815
|
+
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic pull hello-world'.`),Av=new lo("<tests...>",`One or more test paths to import from Momentic Cloud.
|
|
3816
3816
|
|
|
3817
|
-
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic import hello-world'.`).argOptional(),
|
|
3817
|
+
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic import hello-world'.`).argOptional(),Iv=new lo("<tests...>","One or more test file path or folders that exist on the local machine: 'npx momentic run hello-world.test.yaml'.").argOptional(),Pv=new lo("<suites...>",`One or more suite paths that exist on Momentic Cloud.
|
|
3818
3818
|
|
|
3819
|
-
The suite path is a lowercased version of your suite name where spaces and special characters are replaced with dashes, such as 'production-tests'.`),
|
|
3819
|
+
The suite path is a lowercased version of your suite name where spaces and special characters are replaced with dashes, such as 'production-tests'.`),Eme=new lo("<envs...>","One or more environment names to push").argOptional(),Lv=new lo("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),Ov=new lo("<results>","Path to the results archive.").argRequired(),fv=q.object({apiKey:q.preprocess(n=>n!==void 0?n:process.env.MOMENTIC_API_KEY,q.string()),server:q.string().default("https://api.momentic.ai"),config:q.string().optional(),filter:q.string().optional(),yes:q.boolean().optional(),fix:q.boolean().optional(),pixelRatio:q.coerce.number().optional(),port:q.coerce.number().default($l).optional(),wait:q.preprocess(n=>!!n,q.boolean()).optional(),waitTimeout:q.coerce.number().optional(),start:q.string().optional(),waitOn:q.string().optional(),waitOnTimeout:q.coerce.number().default(60).optional(),customHeaders:q.string().array().optional(),env:q.string().optional(),urlOverride:q.string().url().optional(),all:q.boolean().optional(),parallel:q.coerce.number().optional(),retries:q.coerce.number().optional(),shardIndex:q.coerce.number().optional(),shardCount:q.coerce.number().optional(),inputCsv:q.string().optional(),updateGoldenFiles:q.boolean().optional().default(!1),tests:q.array(q.string()).optional(),suites:q.array(q.string()).optional(),paths:q.array(q.string()).optional(),envs:q.array(q.string()).optional(),include:q.array(q.string()).optional(),exclude:q.array(q.string()).optional(),labels:q.array(q.string()).optional(),reporter:q.nativeEnum(Yi).optional(),reporterDir:q.string().optional(),outputDir:q.string().optional(),uploadResults:q.boolean().optional(),saveCache:q.boolean().optional(),disableCache:q.boolean().optional()}),vn=async n=>{let e={},t;try{let r=Object.assign(e,fv.partial().parse(n));t=fv.parse(r)}catch(r){y.error(`Error parsing command line arguments: ${r.message}`),process.exit(1)}try{ik(t)}catch(r){y.error(`Invalid command line arguments: ${r.message}`),process.exit(1)}return t};var ik=n=>{for(let[e,t]of Object.entries(n))switch(e){case"shardIndex":if(!n.shardCount)throw new Error("The --shard-count flag must be provided alongside --shard-index");if(n.shardCount&&n.shardIndex&&n.shardIndex>n.shardCount)throw new Error("Shard index cannot be greater than shard count");if(n.shardIndex!==void 0&&n.shardIndex<1)throw new Error("Shard index must be greater than 0");break;case"waitTimeout":case"pixelRatio":try{n[e]=q.number().int().optional().parse(t)}catch{throw new Error(`Invalid ${e} provided does not parse a number: ${t}`)}break;case"urlOverride":if(t===void 0)break;try{q.string().url().parse(t)}catch(r){throw new Error(`Invalid URL provided for ${e}`,{cause:r})}break;case"server":if(typeof t!="string")throw new Error(`Expected a string for ${e}`);if(!t.startsWith("http"))throw new Error("--server option must be a fully qualified URL beginning with http");break;case"parallel":if(t===void 0)break;if(typeof t!="number"||isNaN(t))throw new Error(`Expected a number for ${e}`);gv().length<t*2&&y.warn(`You requested to run tests in parallel ${t} at a time on a machine with ${gv().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);break;default:break}};function ql(n){if(n===void 0)return;let e={};for(let t of n){let r=t.indexOf("=");if(r===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,r),i=t.slice(r+1);ok(o,i),e[o]=i}return e}async function du(n){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(y.error(`Node.js version 18 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),y.debug(`Identified node version ${e}`);let r=await n.client.getAuthInfo();return y.debug("Got auth info from API"),r}import{Console as Mv}from"console";import{format as Fa}from"util";var pu=class extends Error{constructor(e,t,r){let o=Error.stackTraceLimit;r&&(Error.stackTraceLimit=Math.max(r,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},Kl=class n extends Mv{_buffer=[];_groupDepth=0;Console=Mv;constructor(){super({write:e=>(n.write(this._buffer,"log",e),!0)})}static write(e,t,r,o=2){let i=new pu(void 0,n.write).stack;if(!i)return e;let a=i.split(`
|
|
3820
3820
|
`).slice(o).filter(Boolean).join(`
|
|
3821
|
-
`);return e.push({message:r,origin:a,type:t}),e}_log(e,t){n.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",
|
|
3821
|
+
`);return e.push({message:r,origin:a,type:t}),e}_log(e,t){n.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Fa(e,...t))}error(e,...t){this._log("error",Fa(e,...t))}info(e,...t){this._log("info",Fa(e,...t))}log(e,...t){this._log("log",Fa(e,...t))}warn(e,...t){this._log("warn",Fa(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function Nv(n){let e=globalThis.console,t=new Kl;globalThis.console=t;try{n()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
|
|
3822
3822
|
`);process.stderr.write(`${o}
|
|
3823
|
-
`),globalThis.console=e}}var
|
|
3824
|
-
${[...r].map(i=>`${
|
|
3823
|
+
`),globalThis.console=e}}var sk=5;async function Yl({getResults:n,checkDone:e,name:t,timeoutMs:r=tu}){let o=Date.now(),i=0;for(;Date.now()-o<r;){let a;i>sk&&(y.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await n(),i=0}catch(c){i++,ee.warn({err:c},"Failed to fetch run status, retrying..."),y.warn({err:c},"Failed to fetch run status, retrying..."),await new Promise(d=>setTimeout(d,1500*i));continue}if(e(a))return a;let l=Math.max(1e4,Math.floor(r/100));await new Promise(c=>setTimeout(c,l))}y.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(r/1e3)}s).`),process.exit(1)}function Ti({results:n,startTime:e,entity:t,getDisplayLine:r,onFailed:o}){let i=n.filter(l=>l.status==="PASSED"),a=n.filter(l=>l.status==="FAILED"),s=n.filter(l=>l.status==="CANCELLED");return Nv(()=>{a.forEach(l=>{y.log(""),o(l)}),a.length&&(y.log(""),y.error(`${a.length} ${t}s failed:`),a.forEach(l=>{y.dimmed(r(l))})),s.length&&(y.log(""),y.warn(`${s.length} ${t}s cancelled:`),s.forEach(l=>{y.dimmed(r(l))})),i.length&&(y.log(""),y.success(`${i.length} ${t}s passed:`),i.forEach(l=>{y.dimmed(r(l))})),y.log(""),y.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{passed:i.length,failed:a.length,cancelled:s.length}}var Jl=(n,e)=>{if(!n.failureDetails||!n.failureReason)return;let t=is[n.failureDetails?.classification?.reason||n.failureReason],r=n.failureDetails?.classification?.summary||Po[n.failureReason];y.error(e),y.log(`${jt}Reason: ${kv.red(t)}`),y.log(`${jt}Description: ${kv.red(r)}`)};async function uu({fix:n,project:e}){let t=we(e,y),r=Object.values(t.tests),o={},i={},a={},s=new Set,l={},c=new Set,d=0;for(let u of r)try{let m=Xr(u.fullFilePath,ee,t),h=m.steps;if(!h||h.length===0||!Array.isArray(h)){y.debug(`Test ${u.name} (${u.relativePath}) has no steps, skipping...`);continue}let g=vt.parse(m),f=await Wr(g,h,y),S=!1,w=!1;f.steps=f.steps.map((v,b)=>{v.id||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) does not have an ID`),w=!0,n&&(S=!0,v.id=po())),_v.string().uuid().safeParse(v.id)||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has an ID that does not parse as a UUID: '${v.id}'`),w=!0,n&&(S=!0,v.id=po()));let T=o[v.id]?.testId,C=o[v.id]?.testRelativePath;if(T?(d++,w=!0,T===u.id?y.error(`Multiple steps in the test '${u.name}' (${u.relativePath}) have the same ID '${v.id}'`):y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has the ID ${v.id} which is duplicated in ${C}`),n&&(S=!0,v.id=po())):o[v.id]={testId:u.id,testRelativePath:u.relativePath},v.type==="PRESET_ACTION"){let A=v.command.id,k=a[A]?.testId,L=a[A]?.testRelativePath;k?(d++,w=!0,k===u.id?y.error(`Multiple commands in the test '${u.name}' (${u.relativePath}) have the same ID '${A}'`):y.error(`Command ${b} in test '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in test ${L}`),n&&(S=!0,v.command.id=po())):a[A]={testId:u.id,testRelativePath:u.relativePath}}return be.parse(v)}),w&&y.dimmed("=".repeat(80)),S&&n&&(Wn({relativeTestPath:u.relativePath,steps:{beforeSteps:m.beforeSteps,steps:f.steps,afterSteps:m.afterSteps},schemaVersion:_e,project:e}),s.add(u.fullFilePath))}catch(m){y.error({err:m},`Failed to parse test ${u.name} (${u.relativePath})`);continue}let p=Object.values(t.modules);for(let u of p)try{let m=Gn(u.fullFilePath,y),h=m.steps;if(!h||h.length===0||!Array.isArray(h)){y.debug(`Module ${u.name} (${u.relativePath}) has no steps, skipping...`);continue}let g,f;try{let b=await Wr({id:m.moduleId,schemaVersion:m.schemaVersion},m.steps,y);g=b.steps,f=b.newVersion}catch(b){y.error({err:b},`Failed to migrate module ${u.name} (${u.relativePath})`);continue}let S=!1,w=!1,v=g.map((b,T)=>{if(_v.string().uuid().safeParse(b.id)||(y.error(`Step ${T} in module '${u.name}' (${u.relativePath}) has an ID that does not parse as a UUID: '${b.id}'`),w=!0,n&&(S=!0,b.id=po())),o[b.id]?.testId){let A=o[b.id]?.testRelativePath;d++,w=!0,y.error(`Step ${T} in module '${u.name}' (${u.relativePath}) has the ID ${b.id} which is duplicated in test ${A}`),n&&(S=!0,b.id=po())}if(b.type==="PRESET_ACTION"){let A=b.command.id,k=a[A],L=l[A];k||L?(d++,w=!0,L?.moduleId===u.id?y.error(`Multiple commands in module '${u.name}' (${u.relativePath}) have the same ID '${A}'`):k?y.error(`Command in module '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in test ${k.testRelativePath}`):y.error(`Command ${T} in module '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in module ${L.moduleRelativePath}`),n&&(S=!0,b.command.id=po())):l[A]={moduleId:u.id,moduleRelativePath:u.relativePath}}return be.parse(b)});w&&y.dimmed("=".repeat(80)),S&&n&&(Yr({content:{...m,steps:v},schemaVersion:f,momenticFiles:t,project:e,forceSaveOnNoDiffs:!0}),c.add(u.fullFilePath))}catch(m){y.error({err:m},`Failed to parse module ${u.name} (${u.relativePath})`);continue}return{errors:d,modifiedTestFilePaths:s,modifiedModuleFilePaths:c}}async function Dv({fix:n,project:e}){let{errors:t,modifiedTestFilePaths:r,modifiedModuleFilePaths:o}=await uu({fix:n,project:e});t>0?(y.error(`Found errors in ${t} steps`),n?(y.warn(`Modified the following test files:
|
|
3824
|
+
${[...r].map(i=>`${jt}- ${i}`).join(`
|
|
3825
3825
|
`)}`),o.size>0&&y.warn(`Modified the following module files:
|
|
3826
|
-
${[...o].map(i=>`${
|
|
3827
|
-
`)}`)):y.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(y.success("No step ID errors found!"),process.exit(0))}async function
|
|
3828
|
-
${e}`)}}async function Uv({project:n,orgId:e,apiClient:t}){y.info("Pulling browser and AI configuration options from Cloud");let r=await Vl.init(e);n.config.browser={autoExpandIframes:r.isBooleanFlagEnabled("auto_expand_iframes"),disableSecondaryCacheResolution:r.isBooleanFlagEnabled("disable_secondary_cache_resolution"),globalLocatorRedirect:r.isBooleanFlagEnabled("global_locator_redirect"),visualActions:r.isBooleanFlagEnabled("visual_actions"),...n.config.browser},n.config.advanced={fakerConstantSeed:r.isBooleanFlagEnabled("faker_constant_seed"),...n.config.advanced},n.config.ai={aiPageFiltering:r.isBooleanFlagEnabled("rag_v2"),agentConfig:await t.getAgentConfig(),...n.config.ai},y.info(`Updated ${n.configFilePath} to include V2 browser and AI configuration options`),y.info("Determining main Git branch"),n.config.gitMainBranch=QN(),Zo(n.config,n.configFilePath),y.success("Migration complete!")}function Bv(n){return n?Me(n):"Unknown suite"}async function zv({client:n,orgId:e,suitePaths:t,wait:r,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await n.queueSuiteRuns({paths:t,...i});ne.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:t},"Queued suites remotely"),y.dimmed(`Queued ${t.length} suites.`),r||process.exit(0);let l=Date.now();y.dimmed(`Waiting for ${t.length} suites to complete.`);let c=new Set,d=[],p=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(w=>w.status==="FAILED"&&(w.failureReason||w.finishedAt&&Date.now()-w.finishedAt.getTime()>30*1e3)||w.status==="PASSED"||w.status==="CANCELLED"),u=await Gl({name:"suites",getResults:async()=>{let f=s.filter(v=>!d.some(b=>b.id===v)),S=await n.bulkGetRunGroupStatus(f),w=[];for(let v of S)p(v)?d.push(v):w.push(v);return[...d,...w]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(c.has(S.id)||(c.add(S.id),y.log(`${c.size}/${s.length} ${Bv(S.suite?.name)}`)))}),f.every(p))}),m=n.getAppUrl(),g=vi({results:u,startTime:l,onFailed:f=>{let S=Bv(f.suite?.name),w=f.runs.filter(b=>b.status==="FAILED").length,v=f.runs.length;y.error(`${S} (${w}/${v} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let x=b.testName||b.test?.name;y.error(` ${x?Me(x):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Me(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function Hv({tests:n,client:e,orgId:t,...r}){!r.yes&&!await ht(`This command will queue ${n.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:n,...r});if(ne.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),y.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.`),r.wait||process.exit(0),!i.length)return;y.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=e.getAppUrl(),d=Date.now(),p=await Gl({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)l(f)?s.push(f):g.push(f);return[...s,...g]},timeoutMs:r.waitTimeout?r.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(h=>{if(h.status==="RUNNING"&&!a.has(h.id)){a.add(h.id);let g=h.testName||h.test?.name;g&&y.log(`${a.size}/${o.length} ${Me(g)}`)}}),m.every(l))}),u=vi({results:p,startTime:d,onFailed:m=>{let h=m.testName||m.test?.name;Wl(m,h?Me(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Me(h):"Unknown test"}`;return m.id&&(g+=` (${c}/runs/${m.id})`),g},entity:"test"});process.exit(u.failed>0?1:0)}import xi,{supportsColor as Rk}from"chalk";import Ak from"fs";import{existsSync as uk,mkdirSync as mk,statSync as hk}from"fs";import{randomUUID as cu}from"crypto";import ql from"fs";import{hostname as ek}from"os";import Na from"path";async function Kl(n,e,t,r,o){if(r){let i=Na.extname(r),a=`${cu()}-screenshot${i}`,s=Na.join(t,a),c=await(await fetch(r)).arrayBuffer();return ql.writeFileSync(s,Buffer.from(c)),a}if(o){let i=await e.getScreenshot(n,o);if(i){let a=`${o}-screenshot.jpeg`,s=Na.join(t,a);return ql.writeFileSync(s,i),a}}}async function tk(n,e,t,r){let o=r.runId??cu(),i={uuid:o,historyId:o,testCaseId:r.test.id,fullName:r.test.name,name:Me(r.test.name),status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"skipped":"failed",start:r.lastAttemptStartedAt.getTime(),stop:r.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:ek()},{name:"platform",value:"momentic"},{name:"attempts",value:r.attempts.toString()}],steps:[]};r.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${r.runId}`});for(let[s,l]of Object.entries(r.parameters))l!=null&&i.parameters.push({name:s,value:JSON.stringify(l)});r.results&&await nk(n,e,t.folder,i.steps,r.results);let a=`${o}-result.json`;ql.writeFileSync(Na.join(t.folder,a),JSON.stringify(i,void 0,2))}async function Ti(n,e,t,r){let o={name:dn(r),start:r.startedAt.getTime(),stop:r.finishedAt.getTime(),status:r.status==="SUCCESS"?"passed":r.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};r.beforeUrl&&o.labels?.push({name:"URL before step",value:r.beforeUrl}),r.afterUrl&&o.labels?.push({name:"URL after step",value:r.afterUrl});let i=await Kl(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Kl(n,e,t,r.afterScreenshot,r.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),r.message&&(o.statusDetails={message:r.message}),r.data){let s=`${cu()}-attachment.json`,l=Na.join(t,s);ql.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:s,type:"text/plain"})}return o}async function nk(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await Ti(n,e,t,i));break}case"CONDITIONAL":{let a=await Ti(n,e,t,i);a.steps=[],i.assertion&&a.steps.push(await Ti(n,e,t,i.assertion)),a.steps.push(...await Promise.all(i.results.map(s=>Ti(n,e,t,s)))),r.push(a);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let a=await Ti(n,e,t,i);if(a.steps=await Promise.all(i.results.map(s=>Ti(n,e,t,s))),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,l]of Object.entries(i.inputs))a.parameters.push({name:s,value:l})}r.push(a)}}}async function $v(n,e,t,r){for(let o of r.runs)await tk(n,e,{folder:t,suiteName:r.suiteName},o)}import jv from"junit-report-builder";import Gv from"path";function rk(n,e){let t=e??jv.testCase();if(t.name(n.test.name).className(n.test.name).file(Gv.relative(".",n.filePath)).property("id",n.test.id),n.baseUrl&&t.property("baseUrl",n.baseUrl),n.runId&&t.property("runUrl",`https://app.momentic.ai/runs/${n.runId}`),n.status==="FAILED"){if(n.failureReason){let r=Qa[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||Ao[n.failureReason];n.runId&&(o+=` See details: https://app.momentic.ai/runs/${n.runId}`),t.failure(o,r)}n.failureDetails?.errorStack&&t.stacktrace(n.failureDetails.errorStack)}else n.status==="CANCELLED"&&t.skipped();t.time((n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime())/1e3).property("startedAt",n.lastAttemptStartedAt.toISOString()).property("finishedAt",n.finishedAt.toISOString()).property("attempts",n.attempts.toString());for(let r of["testInputs","customHeaders"]){let o=n.parameters[r];Object.keys(o??{}).length>0&&t.multilineProperty(r,JSON.stringify(o))}for(let r of["envName","urlOverride"])n.parameters[r]!==void 0&&t.property(r,n.parameters[r]);return Object.keys(n.outputs).length&&t.multilineProperty("testOutputs",JSON.stringify(n.outputs)),t}function ok(n,{suiteId:e,suiteName:t,startedAt:r,finishedAt:o,runs:i}){let a=n.testSuite().name(t);e&&a.property("id",e),a.timestamp(r).property("startedAt",r.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-r.getTime())/1e3);for(let s of i){let l=a.testCase();rk(s,l)}return a}function Wv(n,e){let t=jv.newBuilder();ok(t,e),t.writeTo(Gv.join(n,`${e.suiteName}.xml`))}import ik from"fs";import ak from"path";function Vv(n){return{title:dn(n),duration:n.finishedAt.getTime()-n.startedAt.getTime(),error:n.status==="FAILED"?{value:n.failureReason}:void 0,steps:n.results&&n.type!=="PRESET_ACTION"?n.results.map(Vv):[]}}async function sk(n,e,t,r){if(r.results?.length){let o=await Kl(n,e,t,r.results[r.results.length-1].afterScreenshot,r.results[r.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function lk(n,e,t,r){return{status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"interrupted":"failed",duration:r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime(),error:r.status==="FAILED"&&r.failureReason?{value:r.failureDetails?.classification?.reason||r.failureReason,message:r.failureDetails?.classification?.summary||Ao[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(Vv)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await sk(n,e,t,r)}}async function ck(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await lk(n,e,t,r)]}}async function dk(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await ck(n,e,t,r)],id:r.runId,file:r.filePath}}function du(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function pk(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>dk(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:du(r.runs,o=>o.status==="PASSED"),unexpected:du(r.runs,o=>o.status!=="PASSED"),flaky:du(r.runs,o=>!!o.isFlake),skipped:0}}}async function qv(n,e,t,r){let o=await pk(n,e,t,r);ik.writeFileSync(ak.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function Kv(n,e,t,r,o){switch(uk(o)?hk(o).isDirectory()||(y.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)):(y.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),mk(o,{recursive:!0})),t){case"junit":Wv(o,r);return;case"allure":case"allure-json":await $v(n,e,o,r);return;case"playwright-json":await qv(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import Ik from"wait-on";import pu from"fs";import{compact as gk}from"lodash-es";import uu from"path";import{cwd as fk}from"process";import Sk from"semver";async function Yv({tests:n,momenticFiles:e,project:t,yes:r,include:o,exclude:i,labels:a}){let s=new Set;if(n&&n.length>0){let c=n.some(p=>pu.existsSync(p)),d=fk();c?(d!==t.rootDir&&y.warn(`The current working directory ('${d}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),y.info(`Reading tests from the following local file paths:
|
|
3829
|
-
${n.map(p=>`${
|
|
3826
|
+
${[...o].map(i=>`${jt}- ${i}`).join(`
|
|
3827
|
+
`)}`)):y.warn("To fix these errors automatically, re-run this check with the --fix flag and then commit the resulting changes"),process.exit(1)):(y.success("No step ID errors found!"),process.exit(0))}async function Fv({project:n}){let e=we(n,y),t=Object.values(e.tests),r=await js(e,ee),o={},i={},a={},s={},l=new Set,c=new Set,d=new Set,p=new Set;for(let m of t)o[m.id]?a[m.id]?a[m.id].push(m.fullFilePath):a[m.id]=[o[m.id],m.fullFilePath]:o[m.id]=m.fullFilePath,i[m.name]?s[m.name]?s[m.name].push(m.fullFilePath):s[m.name]=[i[m.name],m.fullFilePath]:i[m.name]=m.fullFilePath;for(let m of r)p.has(m.moduleId)&&l.add(m.moduleId),d.has(m.name)&&c.add(m.name),p.add(m.moduleId),d.add(m.name);if(Object.entries(a).length>0||Object.entries(s).length>0||l.size>0||c.size>0){for(let[m,h]of Object.entries(a))for(let g of h)y.error(`Test ID ${m} is duplicated in ${g}`);for(let[m,h]of Object.entries(s))for(let g of h)y.error(`Test Name ${m} is duplicated in ${g}`);for(let m of l)y.error(`Module id ${m} is duplicated in your project`);for(let m of c)y.error(`Module name ${m} is duplicated in your project`);process.exit(1)}y.success("No duplicates detected. All test and module names and ids are unique."),process.exit(0)}import{cloneDeep as lk}from"lodash-es";async function Uv({client:n,skipPrompts:e,project:t}){let r=await n.getAllEnvironments(),o=lk(t.config);o.environments||(o.environments=[]);for(let i of r){let a=o.environments?.find(s=>s.name===i.name);if(a)!e&&!await ft(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),a.baseUrl=i.variables[Ge],delete i.variables[Ge],a.envVariables=i.variables;else{let s=i.variables[Ge];delete i.variables[Ge],o.environments.push({name:i.name,baseUrl:s,envVariables:i.variables})}}ei(o,t.configFilePath),y.success(`Pulled ${r.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as Bv}from"crypto";import zv from"fs";async function mu({testsToFetch:n,client:e,all:t,yes:r}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:n,all:t}),a=0;for(let[l,c]of Object.entries(o)){let d=Hv(l,Ae.TEST);!r&&!await eu(d)||(a+=1,zv.writeFileSync(d,c,"utf-8"),ee.info({checksum:Bv("md5").update(c).digest("hex")},`Wrote '${d}'`))}let s=0;for(let[l,c]of Object.entries(i)){let d=Hv(l,Ae.MODULE);!r&&!await eu(d)||(s+=1,zv.writeFileSync(d,c,"utf-8"),ee.info({checksum:Bv("md5").update(c).digest("hex")},`Wrote '${d}'`))}a===0?y.success("Pulled 0 tests."):y.success(`Pulled ${a} test${a>1?"s":""}${s?` and ${s} module${s>1?"s":""}`:""}!`)}function Hv(n,e){switch(e){case Ae.TEST:return`${Ne(n)}.${Mt.TEST}`;case Ae.MODULE:return`${Ne(n)}.${Mt.MODULE}`;default:throw new Error(`Unknown entity type ${e}`)}}async function jv(n){let{project:e,client:t,skipPrompts:r}=n;y.info("Welcome to the Momentic Cloud importer wizard! \u{1F636}\u200D\u{1F32B}\uFE0F"),y.info("Importing environments from Momentic Cloud."),y.info(`This command will overwrite all local environment configuration in ${e.configFilePath} with environments from Momentic Cloud.`),await ft("Are you sure you want to proceed?",!0)||(y.info("Aborting..."),process.exit(1)),await Uv({client:t,project:e,skipPrompts:r}),y.success(`Successfully imported environments from Momentic Cloud. We recommend pulling secrets out of ${e.configFilePath} into .env files or dynamically set environment variables for security.`),y.info("Importing tests and modules from Momentic Cloud."),await mu({testsToFetch:[],client:t,all:!0,yes:r}),y.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}async function $v(n){let{client:e,skipPrompts:t,paths:r}=n;await mu({testsToFetch:r,client:e,all:void 0,yes:t}),y.success("Successfully imported tests and modules from Momentic Cloud. You can move them to the desired location in your project. We recommend committing these files to version control so you can share them with team members and run Momentic tests in CI.")}import ck from"fs";import{tmpdir as dk}from"os";import pk from"path";import{registry as Ua}from"playwright-core/lib/server";import Gv from"proper-lockfile";var Wv=pk.join(dk(),"momenticBrowserInstallation");var hu=["chrome","chromium","chrome-for-testing"],uk={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},Vv={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell"};function qv(n){let e=Vv[uk[n]??""]??"",t=Ua.findExecutable(e);return!t||t.installType==="none"?!1:gu(t)}function gu(n){let e=n.executablePath();return ck.existsSync(e)}function mk(n,e){let t=Vv[n];if(!t)throw new Error(`Requested install of unknown browser type ${n}`);let r=Ua.findExecutable(t);if(!r||r.installType==="none")throw new Error(`Requested install of unknown browser type ${n}`);if(!(!e&&gu(r)))return r}async function hk({browser:n,force:e}){let t=mk(n,e);if(!t){y.info(`Browser '${n}' is already installed, skipping...`);return}y.info(`Installing browser '${n}'...`);try{await Ua.installDeps([t],!1),await Ua.install([t],!1)}catch(r){if(r.message.includes("Lock file is already being held")){y.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=Ua.findExecutable(n),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!gu(o);)y.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw r}}async function Kv({rawBrowsers:n,force:e=!1,all:t=!1}){let r=t?hu:Array.from(new Set(n));try{await Gv.lock(Wv,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(o){y.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${o}. Continuing without installation...`);return}try{for(let o of r)try{await hk({browser:o,force:e})}catch(i){y.error(`Failed to install the ${o} browser: ${i}`)}}finally{await Gv.unlock(Wv,{realpath:!1})}}async function Yv(n){let e=we(n,y),t=Object.values(e.tests);for(let r of t)try{let o=Xr(r.fullFilePath,y,e),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){y.debug(`Test ${r.name} (${r.relativePath}) has no steps, skipping...`);continue}let a=vt.parse(o),s=await Wr(a,i,y);y.dimmed(`Updating ${r.relativePath}`),Wn({relativeTestPath:r.relativePath,steps:{beforeSteps:o.beforeSteps,steps:s.steps,afterSteps:o.afterSteps},schemaVersion:_e,project:n,forceSaveOnNoDiffs:!0})}catch(o){y.error({err:o},`Failed to read or migrate test ${r.name} (${r.relativePath}), continuing...`)}for(let r of Object.values(e.modules)){y.dimmed(`Updating ${r.relativePath}`);try{let o=Gn(r.fullFilePath,y),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){y.debug(`Module ${r.name} (${r.relativePath}) has no steps, skipping...`);continue}let a=await Wr({id:o.moduleId,schemaVersion:o.schemaVersion},i,y);Yr({content:{...o,steps:a.steps},schemaVersion:_e,momenticFiles:e,project:n,forceSaveOnNoDiffs:!0})}catch(o){y.error({err:o},`Failed to read or migrate module ${r.name} (${r.relativePath}), continuing...`)}}}import{spawnSync as fk}from"child_process";import{PostHog as gk}from"posthog-node";async function Jv(n,e){let t,r=0,o=3,i,a;for(;r<o;)try{let s=await D(n.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=s.featureFlags||{},a=s.featureFlagPayloads||{};break}catch(s){t=s,r++,await new Promise(l=>setTimeout(l,100*r))}if(i&&a)return{flags:i,payloads:a};throw t}var Xl=class n extends ta{constructor(t,r,o,i){super(o,i);this.client=t;this.orgId=r}static async init(t){let r=new gk("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await Jv(r,t);return new n(r,t,o,i)}async refresh(){let{flags:t,payloads:r}=await Jv(this.client,this.orgId);this.flags=t,this.payloads=r}};function Sk(){try{let e=fk("git remote show origin",{encoding:"utf8",maxBuffer:5242880}).stdout.match(/HEAD branch: (.*)$/m);if(e&&e[1])return e[1].trim();y.warn("Could not determine your Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field.");return}catch(n){let e=n instanceof Error?n.message:String(n);y.warn(`Could not determine Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field. Error:
|
|
3828
|
+
${e}`)}}async function Xv({project:n,orgId:e,apiClient:t}){y.info("Pulling browser and AI configuration options from Cloud");let r=await Xl.init(e);n.config.browser={autoExpandIframes:r.isBooleanFlagEnabled("auto_expand_iframes"),disableSecondaryCacheResolution:r.isBooleanFlagEnabled("disable_secondary_cache_resolution"),globalLocatorRedirect:r.isBooleanFlagEnabled("global_locator_redirect"),visualActions:r.isBooleanFlagEnabled("visual_actions"),...n.config.browser},n.config.advanced={fakerConstantSeed:r.isBooleanFlagEnabled("faker_constant_seed"),...n.config.advanced},n.config.ai={aiPageFiltering:r.isBooleanFlagEnabled("rag_v2"),agentConfig:await t.getAgentConfig(),...n.config.ai},y.info(`Updated ${n.configFilePath} to include V2 browser and AI configuration options`),y.info("Determining main Git branch"),n.config.gitMainBranch=Sk(),ei(n.config,n.configFilePath),y.success("Migration complete!")}function Zv(n){return n?Ne(n):"Unknown suite"}async function Qv({client:n,orgId:e,suitePaths:t,wait:r,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await n.queueSuiteRuns({paths:t,...i});ee.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:t},"Queued suites remotely"),y.dimmed(`Queued ${t.length} suites.`),r||process.exit(0);let l=Date.now();y.dimmed(`Waiting for ${t.length} suites to complete.`);let c=new Set,d=[],p=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(w=>w.status==="FAILED"&&(w.failureReason||w.finishedAt&&Date.now()-w.finishedAt.getTime()>30*1e3)||w.status==="PASSED"||w.status==="CANCELLED"),u=await Yl({name:"suites",getResults:async()=>{let f=s.filter(v=>!d.some(b=>b.id===v)),S=await n.bulkGetRunGroupStatus(f),w=[];for(let v of S)p(v)?d.push(v):w.push(v);return[...d,...w]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(c.has(S.id)||(c.add(S.id),y.log(`${c.size}/${s.length} ${Zv(S.suite?.name)}`)))}),f.every(p))}),m=n.getAppUrl(),g=Ti({results:u,startTime:l,onFailed:f=>{let S=Zv(f.suite?.name),w=f.runs.filter(b=>b.status==="FAILED").length,v=f.runs.length;y.error(`${S} (${w}/${v} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let T=b.testName||b.test?.name;y.error(` ${T?Ne(T):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Ne(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function ex({tests:n,client:e,orgId:t,...r}){!r.yes&&!await ft(`This command will queue ${n.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:n,...r});if(ee.info({queuedTests:o,runIds:i,orgId:t},"Queued tests remotely"),y.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.`),r.wait||process.exit(0),!i.length)return;y.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=e.getAppUrl(),d=Date.now(),p=await Yl({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)l(f)?s.push(f):g.push(f);return[...s,...g]},timeoutMs:r.waitTimeout?r.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(h=>{if(h.status==="RUNNING"&&!a.has(h.id)){a.add(h.id);let g=h.testName||h.test?.name;g&&y.log(`${a.size}/${o.length} ${Ne(g)}`)}}),m.every(l))}),u=Ti({results:p,startTime:d,onFailed:m=>{let h=m.testName||m.test?.name;Jl(m,h?Ne(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Ne(h):"Unknown test"}`;return m.id&&(g+=` (${c}/runs/${m.id})`),g},entity:"test"});process.exit(u.failed>0?1:0)}import Ci,{supportsColor as Gk}from"chalk";import Wk from"fs";import{existsSync as Lk,mkdirSync as Ok,statSync as Mk}from"fs";import{randomUUID as fu}from"crypto";import Zl from"fs";import{hostname as yk}from"os";import Ba from"path";async function Ql(n,e,t,r,o){if(r){let i=Ba.extname(r),a=`${fu()}-screenshot${i}`,s=Ba.join(t,a),c=await(await fetch(r)).arrayBuffer();return Zl.writeFileSync(s,Buffer.from(c)),a}if(o){let i=await e.getScreenshot(n,o);if(i){let a=`${o}-screenshot.jpeg`,s=Ba.join(t,a);return Zl.writeFileSync(s,i),a}}}async function bk(n,e,t,r){let o=r.runId??fu(),i={uuid:o,historyId:o,testCaseId:r.test.id,fullName:r.test.name,name:Ne(r.test.name),status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"skipped":"failed",start:r.lastAttemptStartedAt.getTime(),stop:r.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:yk()},{name:"platform",value:"momentic"},{name:"attempts",value:r.attempts.toString()}],steps:[]};r.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${r.runId}`});for(let[s,l]of Object.entries(r.parameters))l!=null&&i.parameters.push({name:s,value:JSON.stringify(l)});r.results&&await wk(n,e,t.folder,i.steps,r.results);let a=`${o}-result.json`;Zl.writeFileSync(Ba.join(t.folder,a),JSON.stringify(i,void 0,2))}async function Ei(n,e,t,r){let o={name:un(r),start:r.startedAt.getTime(),stop:r.finishedAt.getTime(),status:r.status==="SUCCESS"?"passed":r.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};r.beforeUrl&&o.labels?.push({name:"URL before step",value:r.beforeUrl}),r.afterUrl&&o.labels?.push({name:"URL after step",value:r.afterUrl});let i=await Ql(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Ql(n,e,t,r.afterScreenshot,r.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),r.message&&(o.statusDetails={message:r.message}),r.data){let s=`${fu()}-attachment.json`,l=Ba.join(t,s);Zl.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:s,type:"text/plain"})}return o}async function wk(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await Ei(n,e,t,i));break}case"CONDITIONAL":{let a=await Ei(n,e,t,i);a.steps=[],i.assertion&&a.steps.push(await Ei(n,e,t,i.assertion)),a.steps.push(...await Promise.all(i.results.map(s=>Ei(n,e,t,s)))),r.push(a);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let a=await Ei(n,e,t,i);if(a.steps=await Promise.all(i.results.map(s=>Ei(n,e,t,s))),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,l]of Object.entries(i.inputs))a.parameters.push({name:s,value:l})}r.push(a)}}}async function tx(n,e,t,r){for(let o of r.runs)await bk(n,e,{folder:t,suiteName:r.suiteName},o)}import nx from"junit-report-builder";import rx from"path";function vk(n,e){let t=e??nx.testCase();if(t.name(n.test.name).className(n.test.name).file(rx.relative(".",n.filePath)).property("id",n.test.id),n.baseUrl&&t.property("baseUrl",n.baseUrl),n.runId&&t.property("runUrl",`https://app.momentic.ai/runs/${n.runId}`),n.status==="FAILED"){if(n.failureReason){let r=is[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||Po[n.failureReason];n.runId&&(o+=` See details: https://app.momentic.ai/runs/${n.runId}`),t.failure(o,r)}n.failureDetails?.errorStack&&t.stacktrace(n.failureDetails.errorStack)}else n.status==="CANCELLED"&&t.skipped();t.time((n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime())/1e3).property("startedAt",n.lastAttemptStartedAt.toISOString()).property("finishedAt",n.finishedAt.toISOString()).property("attempts",n.attempts.toString());for(let r of["testInputs","customHeaders"]){let o=n.parameters[r];Object.keys(o??{}).length>0&&t.multilineProperty(r,JSON.stringify(o))}for(let r of["envName","urlOverride"])n.parameters[r]!==void 0&&t.property(r,n.parameters[r]);return Object.keys(n.outputs).length&&t.multilineProperty("testOutputs",JSON.stringify(n.outputs)),t}function xk(n,{suiteId:e,suiteName:t,startedAt:r,finishedAt:o,runs:i}){let a=n.testSuite().name(t);e&&a.property("id",e),a.timestamp(r).property("startedAt",r.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-r.getTime())/1e3);for(let s of i){let l=a.testCase();vk(s,l)}return a}function ox(n,e){let t=nx.newBuilder();xk(t,e),t.writeTo(rx.join(n,`${e.suiteName}.xml`))}import Tk from"fs";import Ek from"path";function ix(n){return{title:un(n),duration:n.finishedAt.getTime()-n.startedAt.getTime(),error:n.status==="FAILED"?{value:n.failureReason}:void 0,steps:n.results&&n.type!=="PRESET_ACTION"?n.results.map(ix):[]}}async function Ck(n,e,t,r){if(r.results?.length){let o=await Ql(n,e,t,r.results[r.results.length-1].afterScreenshot,r.results[r.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function Rk(n,e,t,r){return{status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"interrupted":"failed",duration:r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime(),error:r.status==="FAILED"&&r.failureReason?{value:r.failureDetails?.classification?.reason||r.failureReason,message:r.failureDetails?.classification?.summary||Po[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(ix)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await Ck(n,e,t,r)}}async function Ak(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await Rk(n,e,t,r)]}}async function Ik(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await Ak(n,e,t,r)],id:r.runId,file:r.filePath}}function Su(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function Pk(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>Ik(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:Su(r.runs,o=>o.status==="PASSED"),unexpected:Su(r.runs,o=>o.status!=="PASSED"),flaky:Su(r.runs,o=>!!o.isFlake),skipped:0}}}async function ax(n,e,t,r){let o=await Pk(n,e,t,r);Tk.writeFileSync(Ek.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function sx(n,e,t,r,o){switch(Lk(o)?Mk(o).isDirectory()||(y.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)):(y.info(`Reporter output directory '${o}' does not exist on disk, creating it now...`),Ok(o,{recursive:!0})),t){case"junit":ox(o,r);return;case"allure":case"allure-json":await tx(n,e,o,r);return;case"playwright-json":await ax(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import Vk from"wait-on";import yu from"fs";import{compact as Nk}from"lodash-es";import bu from"path";import{cwd as kk}from"process";import _k from"semver";async function lx({tests:n,momenticFiles:e,project:t,yes:r,include:o,exclude:i,labels:a}){let s=new Set;if(n&&n.length>0){let c=n.some(p=>yu.existsSync(p)),d=kk();c?(d!==t.rootDir&&y.warn(`The current working directory ('${d}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),y.info(`Reading tests from the following local file paths:
|
|
3829
|
+
${n.map(p=>`${jt}- ${p}`).join(`
|
|
3830
3830
|
`)}
|
|
3831
|
-
`),n.forEach(p=>{if(!
|
|
3832
|
-
${n.map(p=>`${
|
|
3833
|
-
`)}`),Object.values(e.tests).forEach(p=>{n.some(u=>p.relativePath.includes(u))&&s.add(p.fullFilePath)}))}else{!r&&!await ht("No test paths or substrings were provided. Do you want to run all tests?")&&(y.error("Cancelled by user."),process.exit(1));let c=Object.values(e.tests);y.info(`Reading all ${c.length} tests in the project from local disk.`),c.forEach(d=>{s.add(d.fullFilePath)})}for(let c of s){let d=uu.relative(t.rootDir,c);o&&!o.some(p=>new RegExp(p).test(d))&&s.delete(c),i&&i.some(p=>new RegExp(p).test(d))&&s.delete(c)}let l=Array.from(s).map(async c=>{try{let d=await ia(c,ne,e);if(Sk.gt(d.schemaVersion,_e)&&y.warn(`Test ${c} 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.`),d.disabled)return null;if(a&&a.length>0){let p=d.labels||[];if(!a.some(m=>p.includes(m)))return null}return{...d,fullFilePath:c,relativeFilePath:uu.relative(t.rootDir,c)}}catch(d){y.error(`Failed to read and resolve test at '${c}': ${d}`),process.exit(1)}});return Promise.all(l).then(gk)}import{cloneDeep as eT}from"lodash-es";async function Jv({orgId:n,codeEvalTools:e,logger:t,outputDefinitions:r,testContext:o,flagStore:i}){let a={};for(let s of r){let{name:l,value:c}=s;a[l]=await Bt({orgId:n,s:c,localTools:e,logger:t,context:o,flagStore:i})}return a}async function Xv({baseUrl:n,envName:e,devicePixelRatio:t,apiClient:r,test:o,storageClient:i,codeEvalTools:a,generator:s,orgId:l,variables:c,logger:d,customHeaders:p,testInputs:u,localBrowserConfig:m,visualDiffScreenshotStorage:h,flagStore:g}){let f=await gl({settings:m,customHeaders:p,envVariables:c,envName:e,baseUrl:n,logger:d,localTools:a,orgId:l,flagStore:g}),S={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:ne},w=g.isBooleanFlagEnabled("icon_knowledge_base")?await i.fetchIconKnowledgeBase(l,d):null,v=f.browserType??"Chromium";if(!kv(v)){let A=`Browser ${v} is required by the test named ${o.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browser' before running tests. Attempting to continue...`;y.warn(A),ne.warn(A)}let b=await kn.init({baseUrl:n,logger:d,userBrowserSettings:f,storage:i,flagStore:g,enricher:new si(S,s),contextArgs:{viewport:o.advanced.viewport??Gt,locale:o.advanced.locale??Io,geolocation:o.advanced.geolocation??Lo,timezoneId:o.advanced.timezone??Po,colorScheme:o.advanced.colorScheme,deviceScaleFactor:t},iconKnowledgeBase:w}),x=new gi({browser:b,generator:s,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:f.slowMoMs,autoFollowNewTabs:f.autoFollowNewTabs},storage:i,flagStore:g,localCodeEvalTools:a,visualDiffScreenshotStorage:h,analytics:new Si}),C=new Rt({baseUrl:n,currentUrl:x.browser.url(),variablesFromEnvironment:c,envName:e});return o.parameters&&await Promise.all(o.parameters.map(async A=>{let{name:N,defaultValue:P,required:H}=A,F=u?.[N];H&&F===void 0&&(y.error(`Required parameter '${N}' is required by test '${o.name}' but not provided`),process.exit(1));let O=await Bt({orgId:l,s:F??P,localTools:a,logger:d,context:Rt.dummyContext(C.getEnvName()),flagStore:g});C.setMomenticSystemVariable(N,O)})),{controller:x,context:C}}import{randomUUID as yk}from"crypto";async function Zv({testId:n,apiClient:e,testAdvancedSettings:t,aiSettingsFromEnv:r,logger:o}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!r?.failureRecovery)return!1;let i;try{i=await e.getPastTestResults(n,{afterTime:Date.now()-7*24*60*60*1e3})}catch(s){return o.error({err:s},"Test is not eligible for recovery since we failed to fetch the recent test results"),!1}return i.some(s=>s.status==="PASSED")?wi?!0:(o.warn("The CLI is not running in a CI environment and therefore ineligible for failure recovery"),y.warn("Test failed but is not eligible for failure recovery since this does not appear to be a CI environment"),!1):(o.debug({recentRuns:i},"Test is not eligible for recovery because there are only failures in the past 7 days"),!1)}async function Qv({attemptInputs:n,attemptFixtures:e,attemptMetadata:t}){let{attemptNumber:r,orgId:o,runId:i,runAttemptId:a}=t,{controller:s,context:l,flagStore:c,analytics:d,codeEvalTools:p,storageClient:u,debugDataStorage:m,logger:h,apiClient:g,billingReporter:f,tracer:S}=e,{test:w,orgSettings:v}=n;h.info(`Running test '${w.name}' locally (run link: https://app.momentic.ai/runs/${i})`);let b={controller:s,storage:u,debugDataStorage:m,billingReporter:f,analytics:d,context:l,logger:h,codeEvalTools:p},x={orgId:o,runId:i||yk(),runAttemptId:a,testMetadata:w,steps:w.steps,beforeSteps:w.beforeSteps,afterSteps:w.afterSteps},C={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await Zv({currentAttempt:r,testId:w.id,flagStore:c,apiClient:g,testAdvancedSettings:w.advanced,aiSettingsFromEnv:v.ai,logger:h})};return await hl({fixtures:b,inputs:x,options:C,callbacks:{step:{},test:{onTestComplete:async()=>{await s.browser.cleanup()},onProposedTestSteps:async P=>g.uploadProposedSteps(P,h)}},testParams:{tracer:S}})}async function tT(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await bk(n)}catch(o){let i="Fatal error running test";return y.error(`${i}: ${o.message}`),t.error({err:o},i),{parameters:n,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:r,lastAttemptStartedAt:r,finishedAt:new Date,outputs:{}}}}async function bk(n){let{testDefinition:e,project:t,apiClient:r,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:l,gitMetadata:c,alwaysSaveCache:d,noCache:p}=n,u=new oi(r,o),m=li({client:r,gitMetadata:c,alwaysSaveCache:d,noCache:p}),h=eT(e.steps);try{await m.resolveStepCacheEntries({organizationId:o,testId:e.id,steps:h,schemaVersion:e.schemaVersion,logger:l})}catch(x){throw l.error({err:x},"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: ${x}`)}let g=n.envName??vk(e),f,S={};if(g){try{f=aa(g,t,l)}catch(x){let C=`Failed to resolve environment ${g} for test ${e.name}: ${x}`;throw new Error(C)}S=f.variables}let w=e.baseUrl;if(i)w=i;else if(!w){let x=S[Ge];typeof x=="string"&&(w=x)}if(!w){let x=`Cannot run test with no base URL and no ${Ge} variable defined in its environment`;throw new Error(x)}let v=await s.startRun({logger:l,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testLabels:e.labels,baseUrl:w,environmentName:g,schemaVersion:e.schemaVersion}),b=l.child(v.loggerBindings||{});Object.entries(v.envVarBindings||{}).forEach(([x,C])=>{S[x]=C});try{let x=await wk({...n,variables:S,envName:g,stepsWithCaches:h,resolvedEnv:f,baseUrl:w,storageClient:u,tracer:v,logger:b,cacheStorage:m});return await v.finish({logger:l,status:x.status,finishedAt:x.finishedAt,failureDetails:x.failureDetails,failureReason:x.failureReason,isFlake:x.isFlake}),{runId:v.runId,...x}}finally{a?.pop()}}async function wk(n){let{testDefinition:e,stepsWithCaches:t,project:r,regenerateGoldenFiles:o,apiClient:i,generator:a,baseUrl:s,storageClient:l,orgId:c,envName:d,urlOverride:p,customHeaders:u,testInputs:m,variables:h,resolvedEnv:g,retriesOverride:f,devicePixelRatio:S,logUpdate:w,tracer:v,logger:b,flagStore:x,cacheStorage:C}=n,A=new Date,N=new ei(r,o),P={ai:r.config.ai},H={envName:d,urlOverride:p,customHeaders:u,testInputs:m},F,O=Math.abs(f??r.config.retries??e.retries??0),B=[];b.info({labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let L=0;L<=O;L++){let K=await v.startAttempt(),U=b.child(K.loggerBindings||{}),J={...e,steps:eT(t)};L!==0&&w("RETRY",`attempt ${L+1}/${O+1}`);let Z=new Date,gt=new mr({httpClient:new Ot({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:U}),fakerSeed:x.isBooleanFlagEnabled("faker_constant_seed")?dh:void 0});try{let{controller:re,context:ve}=await Xv({baseUrl:s,envName:d,apiClient:i,devicePixelRatio:S,logger:U,storageClient:l,codeEvalTools:gt,test:J,generator:a,orgId:c,variables:h,customHeaders:u,testInputs:m,localBrowserConfig:{...r.config.browser||{},...g?.browser||{},...J.advanced},visualDiffScreenshotStorage:N,flagStore:x});F=await Qv({attemptMetadata:{attemptNumber:L+1,orgId:c,runId:v.runId},attemptFixtures:{logger:U,storageClient:l,billingReporter:new _o,analytics:new Si,debugDataStorage:new _r,codeEvalTools:gt,flagStore:x,apiClient:i,context:ve,controller:re,tracer:K},attemptInputs:{test:J,orgSettings:P}});let Oe=new Date;F?.status==="PASSED"&&await As({logger:b,cacheStorage:C,orgId:c,testId:e.id,originalSteps:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},updatedSteps:{steps:J.steps,beforeSteps:J.beforeSteps,afterSteps:J.afterSteps}}),await K.finish({logger:U,result:F}),B.unshift(F.status);let _t=await Jv({orgId:c,codeEvalTools:gt,logger:U,outputDefinitions:e.outputs??[],testContext:ve,flagStore:x}),an=Hm(B),Dn=L+1;if(F.status!=="FAILED")return{...F,parameters:H,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:Oe,attempts:Dn,baseUrl:s,outputs:_t,isFlake:an};let Zn=F.failedStepResult,sn=Zn?.message||"Unknown failure",j=Zn?.failureReason??wh(sn)??"UnknownError",Ei=U.child({errResult:Zn,failureReason:j,errorMessage:sn,numAttempts:O+1,name:J.name});if(L<O){Ei.warn(`Retrying failed execution attempt for run: ${sn}`);continue}return Ei.error(`Test failed after all exhausting attempts: ${sn}`),{...F,parameters:H,failureDetails:{errorMessage:sn},failureReason:j,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:Oe,attempts:L+1,baseUrl:s,outputs:_t}}catch(re){Ri(re);let ve=`Encountered fatal platform error while running test '${J.name}': ${re}`,Oe=new Date,_t=L+1;U.error({err:re},ve),y.error(ve);let an={errorMessage:re.message,errStack:re.stack},Dn={status:"FAILED",failureDetails:an,failureReason:"InternalPlatformError",finishedAt:Oe};return await K.finish({logger:U,result:{status:"FAILED",results:[]}}),{...Dn,parameters:H,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:new Date,attempts:_t,baseUrl:s,outputs:{}}}}throw new Error("This code should not be reachable")}function vk(n){for(let e of n.envs??[])if(e.default)return e.name}import{randomUUID as rT}from"crypto";import Tk from"adm-zip";import Jn from"fs";import co from"path";var ka=class n{constructor(e){this.filePath=e;Jn.rmSync(this.filePath,{recursive:!0,force:!0}),Jn.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new n(co.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=co.join(this.filePath,t);Jn.writeFileSync(o,r)}createRunArchive(e){return new mu(co.join(this.filePath,"runs"),e)}},mu=class{constructor(e,t){this.filePath=e;this.tempPath=co.join(e,`.${t}`),this.finalPath=co.join(e,`${t}.zip`),Jn.rmSync(this.tempPath,{recursive:!0,force:!0}),Jn.rmSync(this.finalPath,{recursive:!0,force:!0}),Jn.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;cd(e){return new ka(co.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=co.join(this.tempPath,t);Jn.writeFileSync(o,r)}close(){let e=new Tk;e.addLocalFolder(this.tempPath,void 0,r=>r!==".DS_Store");let t=e.toBuffer();Jn.writeFileSync(this.finalPath,t),Jn.rmSync(this.tempPath,{recursive:!0,force:!0})}};async function nT(n,e,t,r,o){let i=Ji(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let a=Xi(o.command);a&&await e.reportCreditsUsed(n,o.command.type,a,{testId:t,testName:r})}}function xk(n){switch(n){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 Ek(n){switch(n){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var hu=class{constructor(e,t,r,o,i,a){this.testId=e;this.testName=t;this.metadata=r;this.diskStorage=o;this.billingReporter=i;this.asyncWork=a}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.jpeg",contents:r})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.jpeg",contents:r})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.html",contents:r})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.html",contents:r})}heal(e){let{healType:t}=e;this.metadata.healMetadata={healType:t,healedAt:new Date}}async finishInternal(e){if(this.finished)return;this.finished=!0,await Promise.all(this.children.map(r=>r.finish({status:Ek(e.status),finishedAt:e.finishedAt})));let t={...this.metadata,status:e.status,finishedAt:e.finishedAt,message:e.message};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)})}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=this.diskStorage.cd("substeps"),t=new Yl(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},Yl=class{constructor(e,t,r,o,i){this.testId=e;this.testName=t;this.diskStorage=r;this.billingReporter=o;this.asyncWork=i}children=[];finished=!1;getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;this.asyncWork.push(nT(t,this.billingReporter,this.testId,this.testName,r));let o=this.diskStorage.cd(r.id),i={step:r,status:"RUNNING",startedAt:new Date};o.storeFile({name:"metadata.json",contents:JSON.stringify(i,null,2)});let a=new hu(this.testId,this.testName,i,o,this.billingReporter,this.asyncWork);return this.children.push(a),a}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:xk(e.status),finishedAt:e.finishedAt}))))}},gu=class{constructor(e,t,r,o,i,a,s,l,c){this.orgId=e;this.testId=t;this.testName=r;this.originalSteps=o;this.metadata=i;this.client=a;this.diskStorage=s;this.billingReporter=l;this.asyncWork=c}finished=!1;children=[];trackStatus(){}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)})}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,result:r}=e,o={...this.metadata,status:r.status,finishedAt:new Date,results:Ps(r.results,t),beforeResults:r.beforeResults?Ps(r.beforeResults,t):void 0,afterResults:r.afterResults?Ps(r.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 startStepList(){let e=this.diskStorage.cd("steps"),t=new Yl(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},fu=class{constructor(e,t,r,o,i,a,s,l,c,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.originalSteps=i;this.metadata=a;this.client=s;this.diskStorage=l;this.billingReporter=c;this.asyncWork=d}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[hy]: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};await Promise.all(this.children.map(r=>r.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()}trackStatus(){}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={schemaVersion:_e,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)});let r=new gu(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork);return this.children.push(r),r}},Jl=class n{constructor(e,t,r,o,i,a){this.orgId=e;this.runGroupId=t;this.metadata=r;this.client=o;this.diskStorage=i;this.billingReporter=a;this.asyncWork=[]}children=[];finished=!1;asyncWork;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start(e,t,r,o,i,a){let s=rT(),l={...a,trigger:Wt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:yn},c=new ka(r);return c.storeFile({name:"metadata.json",contents:JSON.stringify(l,null,2)}),new n(t,s,l,o,c,i)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,r={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:r.status,finishedAt:r.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let t=rT(),r=this.diskStorage.createRunArchive(t),o={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,cliVersion:yn,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0};r.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)}),this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{eventId:t,testId:e.testId,testName:e.testName}));let i=new fu(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork);return this.children.push(i),i}};import oT from"adm-zip";import iT from"fs";import Xl from"path";function Ck(n){let e=new oT;e.addLocalFile(Xl.join(n,"metadata.json"));for(let t of iT.readdirSync(Xl.join(n,"runs"))){if(!t.endsWith(".zip"))continue;let r=t.replace(/\.zip$/,""),o=new oT(Xl.join(n,"runs",t));for(let i of o.getEntries())i.isDirectory||e.addFile(Xl.join("runs",r,i.entryName),i.getData())}return e.toBuffer()}async function Zl(n){let{client:e,consoleLogger:t,resultsPath:r}=n;if(!iT.existsSync(r)){t.warn("Results path does not exist, skipping upload.");return}let o=new sl(e);try{let i=Ck(r),a=await o.uploadResultsArchive(i),s=`${e.getAppUrl()}/run-groups/${a}`;t.success(`Successfully uploaded test results. Once processed, your results can be found at ${s}`);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}}async function aT(n){let{logger:e,tests:t,yes:r,start:o,waitOn:i,client:a,debugDataStorage:s,billingReporter:l,flagStore:c,project:d,retriesOverride:p,urlOverride:u,envName:m,orgId:h,devicePixelRatio:g,customHeaders:f,testInputMatrix:S,reporter:w,include:v,exclude:b,labels:x,reporterDir:C=NS,outputDir:A=kS,uploadResults:N=!1,waitOnTimeout:P=60,parallel:H=d.config.parallel??1,shardIndex:F=1,shardCount:O=1,regenerateGoldenFiles:B,gitMetadata:L,alwaysSaveCache:K,noCache:U}=n;o&&(e.info({orgId:h},`Executing start command: ${o}`),await Kw(o,!1)),i&&(e.info({orgId:h},`Waiting for url: ${i} with timeout: ${P} seconds.`),await Ik({resources:[i],interval:2500,timeout:P*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let J=new ai(d.config.ai?.agentConfig,{baseUrl:a.baseUrl,apiKey:a.apiKey,logger:e}),Z=Pe(d,y),gt=await Yv({tests:t,momenticFiles:Z,yes:r,project:d,include:v,exclude:b,labels:x}),re=[];gt.forEach((rt,Tr)=>{S?S.forEach((mo,ft)=>{re.push({testIndex:Tr,inputs:mo,inputIndex:ft})}):re.push({testIndex:Tr,inputs:void 0,inputIndex:void 0})}),O&&O>1&&(re=Pk(re,F,O));let ve=`Running ${re.length} tests with ${H} workers:`;e.info({allTestsToRunWithInputs:re,shardCount:O,shardIndex:F,orgId:h},ve),y.info(ve),re.forEach(rt=>{y.info(`${zt}- ${[gt[rt.testIndex].relativeFilePath]}${typeof rt.inputIndex=="number"?` with input set ${rt.inputIndex}`:""}`)}),y.log("");let Oe=[],_t=new Date,an=new Set,Dn=async()=>{let rt=a.getAppUrl(),Tr=vi({results:Oe,startTime:_t.getTime(),onFailed:ft=>{Wl(ft,ft.filePath)},getDisplayLine:ft=>{let xr=`${zt}- ${ft.filePath}${ft.proposedTest?" [AUTO-HEALED] ":""}`;return ft.runId&&(xr+=` ( link when uploaded: ${rt}/runs/${ft.runId} )`),xr},entity:"test"}),mo=Oe.filter(ft=>!!ft.proposedTest);return mo.length>0&&y.warn(`${mo.length} tests passed with auto-healing. Please use the run links printed above to review proposed changes and apply them locally.`),y.log(""),N?(y.success(`Test results have been saved to the folder ${A}. Uploading to Momentic cloud.`),await Zl({client:a,consoleLogger:y,resultsPath:A})):y.success(`Test results have been saved to the folder ${A}. Upload them to Momentic cloud by running 'npx momentic results upload ${A}'.`),Tr};Ak.existsSync(A)&&y.warn(`Output directory ${A} already exists, removing before test execution...`);let Zn=await Jl.start(e,h,A,a,l,L),sn=e.child(Zn.loggerBindings||{}),j=[],Ei=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await Zn.finish({logger:sn,status:"CANCELLED"}),await Dn(),await Promise.allSettled(j.map(rt=>rt())),process.exit(1)};process.once("SIGINT",Ei);let uo={};for(let rt=0;rt<re.length;rt++){let Tr=Object.values(uo);Tr.length===H&&await Promise.race(Tr.map(xr=>xr.promise));let mo=re[rt],ft=`test-${rt}`;uo[ft]={done:!1,promise:(async({testIndex:xr,inputs:wu})=>{let ho=gt[xr];an.add({testIndex:xr,inputs:wu});let gT=ho.relativeFilePath.includes("..")?ho.fullFilePath:ho.relativeFilePath,_a=(lt,Ci)=>{lt=lt.toUpperCase();let Fn=lt,Qn;lt.includes("FAIL")?(Fn=xi.bgRed.white("FAIL"),Qn=3):lt.includes("PASS")?(Fn=xi.bgGreen.white("PASS"),Qn=3):lt.includes("START")?(Fn=xi.bgBlue.white("START"),Qn=2):lt.includes("CANCEL")?(Fn=xi.bgRgb(191,68,11).white("CANCEL"),Qn=1):lt.includes("RETRY")?(Fn=xi.bgRgb(191,68,11).white("RETRY"),Qn=2):lt.includes("RUN")||lt.includes("PROG")?(Fn=xi.bgMagenta.white("RUNNING"),Qn=0):(sn.warn(`Unknown status tried to be logged in run test locally: ${lt}`),Qn=0),Rk||(Fn=`${Fn}`),y.log(`${Fn}${" ".repeat(Qn)} ${gT} ${Ci?`${Ci} `:""}(${an.size}/${re.length})`)};_a("START");let fT=setInterval(()=>_a("RUN"),5*60*1e3),vu=sn.child({testId:ho.id});try{let lt=await tT({testDefinition:ho,project:d,testInputs:wu,orgId:h,devicePixelRatio:g,apiClient:a,runGroupTracer:Zn,generator:J,retriesOverride:p,urlOverride:u,envName:m,customHeaders:f,regenerateGoldenFiles:B,logUpdate:_a,runSigIntHandlers:j,logger:vu,flagStore:c,gitMetadata:L,alwaysSaveCache:K,noCache:U});_a(lt.status),Oe.push(lt)}catch(lt){let Ci=`Encountered unexpected fatal error when running test '${ho.name}': ${lt.message}`;y.error(Ci),vu.error(Ci)}finally{clearInterval(fT),uo[ft].done=!0,delete uo[ft]}})(mo)}}await Promise.allSettled(Object.values(uo).map(rt=>rt.promise));let bu="PASSED";return Oe.some(rt=>rt.status==="FAILED")&&(bu="FAILED"),await Zn.finish({logger:sn,status:bu}),process.off("SIGINT",Ei),w&&await Kv(sn,s,w,{projectConfigPath:d.configFilePath,suiteName:d.config.name,startedAt:_t,finishedAt:new Date,runs:Oe},C),Dn()}function Pk(n,e,t){if(t>n.length&&(y.warn(`Shard count ${t} is greater than the number of tests ${n.length}! Some workers won't have any tests to run.`),t=Math.max(t,n.length),e>t))return[];let r=Math.floor((e-1)*(n.length/t)),o=Math.floor(e*(n.length/t));return n.sort().filter((a,s)=>s>=r&&s<o)}import Xn from"fs";import po from"path";var sT={status:(n,e)=>{if(n.status===e.status)return n.status;if(n.status==="FAILED"||e.status==="FAILED")return"FAILED";if(n.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(n.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(n.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(n.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${n.status} and ${e.status}`)},startedAt:(n,e)=>n.startedAt<e.startedAt?n.startedAt:e.startedAt,updatedAt:(n,e)=>n.updatedAt>e.updatedAt?n.updatedAt:e.updatedAt,finishedAt:(n,e)=>!n.finishedAt||!e.finishedAt?new Date:n.finishedAt>e.finishedAt?n.finishedAt:e.finishedAt,gitCommitTimestamp:(n,e)=>{if(!(!n&&!e)){if(!n.gitCommitTimestamp||!e.gitCommitTimestamp||n.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${n.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return n.gitCommitTimestamp}},pipelineId:(n,e)=>n.pipelineId===e.pipelineId?n.pipelineId:!n.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&n.pipelineId?n.pipelineId:n.startedAt<e.startedAt?e.pipelineId:n.pipelineId};function lT(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function Lk(n,e,t){if(sT[t]){let i=sT[t];return i(n,e)}let r=lT(n,t),o=lT(e,t);if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}var cT=new Set([".DS_Store","__MACOSX"]);function dT(n,e){Xn.rmSync(n,{recursive:!0,force:!0});let t=Xn.readdirSync(e).filter(a=>!cT.has(a)).map(a=>po.join(e,a));Xn.mkdirSync(n,{recursive:!0});let r=po.join(t[0],"metadata.json"),o=id.parse(JSON.parse(Xn.readFileSync(r,"utf-8")));for(let a of t){let s=po.join(a,"runs");if(!Xn.existsSync(s))continue;let l=Xn.readdirSync(s);for(let p of l){if(cT.has(p))continue;let u=po.join(s,p),m=po.join(n,"runs",p);Xn.cpSync(u,m,{recursive:!0})}let c=po.join(a,"metadata.json"),d=id.parse(JSON.parse(Xn.readFileSync(c,"utf-8")));for(let p in d){let u=p;o[u]=Lk(o,d,u)}}let i=po.join(n,"metadata.json");Xn.writeFileSync(i,JSON.stringify(o,null,2))}var pT=new yi({platform:"cli"},{flushAt:1,flushInterval:0});tc||ne.warn("Sentry is not enabled in this environment due to unsupported node version");var Dk=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),Su=n=>{Dk&&y.dimmed(n)},kt=new Ok;kt.name("momentic").description("CLI").version(yn);kt.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: ${su.join(", ")}.`).action(async(n,e)=>{!e.all&&n.length===0&&(y.error("No browsers specified"),process.exit(1)),await _v({rawBrowsers:n,force:e.force,all:e.all})});kt.addOption(new on("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",n=>{n==="debug"&&y.info("Enabling debug logging"),y.setMinLevel(n.toLowerCase())});kt.addOption(new on("--verbose","enable verbose logging")).on("option:verbose",()=>{ne.enableConsoleLogs(),y.setMinLevel(0)});var yu=kt.command("checks").alias("check").description("Perform various project checks");yu.command("config").addOption(_n).action(async n=>{en({configFilePath:n.config})});yu.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(_n).addOption(uv).action(async n=>{let e=await bn(n),t=en({configFilePath:n.config});await xv({project:t,fix:e.fix})});yu.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(_n).action(async n=>{let e=en({configFilePath:n.config});await Ev({project:e})});var uT=kt.command("migrate").description("Migrate and upgrade tooling");uT.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(_n).action(async n=>{let e=en({configFilePath:n.config});await Dv(e)});uT.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(Yn).addOption(_n).addOption(Kn).action(async n=>{let e=await bn(n);!e.yes&&!await ht("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?",!0)&&process.exit(1);let t=en({configFilePath:n.config}),r=new st({baseUrl:e.server,apiKey:e.apiKey,logger:ne}),{orgId:o}=await r.getAuthInfo();await Uv({project:t,orgId:o,apiClient:r}),process.exit(0)});kt.command("import").addOption(Kn).addOption(Yn).addOption(_n).addOption(so).addArgument(hv).action(async(n,e)=>{let t=await bn(e),{apiKey:r,server:o,config:i,yes:a}=t,s=en({configFilePath:i}),l=new st({baseUrl:o,apiKey:r,logger:ne});!n||n.length===0?await Pv({client:l,project:s,skipPrompts:a}):await Lv({client:l,project:s,paths:n,skipPrompts:a}),process.exit(0)});kt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new on("--name <name>","Name of the project")).action(async n=>{y.info(`Welcome to the Momentic project setup wizard! \u{1F680}
|
|
3834
|
-
`),y.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."),
|
|
3831
|
+
`),n.forEach(p=>{if(!yu.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let u,m;try{u=yu.statSync(p),m=u.isDirectory()}catch(g){y.warn({err:g},`Skipping path ${p} because it cannot be read`);return}let h=bu.resolve(p);Object.values(e.tests).filter(g=>m?g.fullFilePath.startsWith(h):g.fullFilePath===h).forEach(g=>{s.add(g.fullFilePath)})})):(y.info(`Reading all tests from the project and running those matching the following substring filters:
|
|
3832
|
+
${n.map(p=>`${jt}- ${p}`).join(`
|
|
3833
|
+
`)}`),Object.values(e.tests).forEach(p=>{n.some(u=>p.relativePath.includes(u))&&s.add(p.fullFilePath)}))}else{!r&&!await ft("No test paths or substrings were provided. Do you want to run all tests?")&&(y.error("Cancelled by user."),process.exit(1));let c=Object.values(e.tests);y.info(`Reading all ${c.length} tests in the project from local disk.`),c.forEach(d=>{s.add(d.fullFilePath)})}for(let c of s){let d=bu.relative(t.rootDir,c);o&&!o.some(p=>new RegExp(p).test(d))&&s.delete(c),i&&i.some(p=>new RegExp(p).test(d))&&s.delete(c)}let l=Array.from(s).map(async c=>{try{let d=await la(c,ee,e);if(_k.gt(d.schemaVersion,_e)&&y.warn(`Test ${c} 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.`),d.disabled)return null;if(a&&a.length>0){let p=d.labels||[];if(!a.some(m=>p.includes(m)))return null}return{...d,fullFilePath:c,relativeFilePath:bu.relative(t.rootDir,c)}}catch(d){y.error(`Failed to read and resolve test at '${c}': ${d}`),process.exit(1)}});return Promise.all(l).then(Nk)}import{cloneDeep as mx}from"lodash-es";async function cx({orgId:n,codeEvalTools:e,logger:t,outputDefinitions:r,testContext:o,flagStore:i}){let a={};for(let s of r){let{name:l,value:c}=s;a[l]=await Ht({orgId:n,s:c,localTools:e,logger:t,context:o,flagStore:i})}return a}async function dx({baseUrl:n,envName:e,devicePixelRatio:t,apiClient:r,test:o,storageClient:i,codeEvalTools:a,generator:s,orgId:l,variables:c,logger:d,customHeaders:p,testInputs:u,localBrowserConfig:m,visualDiffScreenshotStorage:h,flagStore:g}){let f=await wl({settings:m,customHeaders:p,envVariables:c,envName:e,baseUrl:n,logger:d,localTools:a,orgId:l,flagStore:g}),S={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:ee},w=g.isBooleanFlagEnabled("icon_knowledge_base")?await i.fetchIconKnowledgeBase(l,d):null,v=f.browserType??"Chromium";if(!qv(v)){let A=`Browser ${v} is required by the test named ${o.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browser' before running tests. Attempting to continue...`;y.warn(A),ee.warn(A)}let b=await Dn.init({baseUrl:n,logger:d,userBrowserSettings:f,storage:i,flagStore:g,enricher:new ci(S,s),contextArgs:{viewport:o.advanced.viewport??Vt,locale:o.advanced.locale??Lo,geolocation:o.advanced.geolocation??Mo,timezoneId:o.advanced.timezone??Oo,colorScheme:o.advanced.colorScheme,deviceScaleFactor:t},iconKnowledgeBase:w}),T=new Si({browser:b,generator:s,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:f.slowMoMs,autoFollowNewTabs:f.autoFollowNewTabs},storage:i,flagStore:g,localCodeEvalTools:a,visualDiffScreenshotStorage:h,analytics:new bi}),C=new It({baseUrl:n,currentUrl:T.browser.url(),variablesFromEnvironment:c,envName:e});return o.parameters&&await Promise.all(o.parameters.map(async A=>{let{name:k,defaultValue:L,required:j}=A,U=u?.[k];j&&U===void 0&&(y.error(`Required parameter '${k}' is required by test '${o.name}' but not provided`),process.exit(1));let M=await Ht({orgId:l,s:U??L,localTools:a,logger:d,context:It.dummyContext(C.getEnvName()),flagStore:g});C.setMomenticSystemVariable(k,M)})),{controller:T,context:C}}import{randomUUID as Dk}from"crypto";async function px({testId:n,apiClient:e,testAdvancedSettings:t,aiSettingsFromEnv:r,logger:o}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!r?.failureRecovery)return!1;let i;try{i=await e.getPastTestResults(n,{afterTime:Date.now()-7*24*60*60*1e3})}catch(s){return o.error({err:s},"Test is not eligible for recovery since we failed to fetch the recent test results"),!1}return i.some(s=>s.status==="PASSED")?xi?!0:(o.warn("The CLI is not running in a CI environment and therefore ineligible for failure recovery"),y.warn("Test failed but is not eligible for failure recovery since this does not appear to be a CI environment"),!1):(o.debug({recentRuns:i},"Test is not eligible for recovery because there are only failures in the past 7 days"),!1)}async function ux({attemptInputs:n,attemptFixtures:e,attemptMetadata:t}){let{attemptNumber:r,orgId:o,runId:i,runAttemptId:a}=t,{controller:s,context:l,flagStore:c,analytics:d,codeEvalTools:p,storageClient:u,debugDataStorage:m,logger:h,apiClient:g,billingReporter:f,tracer:S}=e,{test:w,orgSettings:v}=n;h.info(`Running test '${w.name}' locally (run link: https://app.momentic.ai/runs/${i})`);let b={controller:s,storage:u,debugDataStorage:m,billingReporter:f,analytics:d,context:l,logger:h,codeEvalTools:p},T={orgId:o,runId:i||Dk(),runAttemptId:a,testMetadata:w,steps:w.steps,beforeSteps:w.beforeSteps,afterSteps:w.afterSteps},C={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await px({currentAttempt:r,testId:w.id,flagStore:c,apiClient:g,testAdvancedSettings:w.advanced,aiSettingsFromEnv:v.ai,logger:h})};return await bl({fixtures:b,inputs:T,options:C,callbacks:{step:{},test:{onTestComplete:async()=>{await s.browser.cleanup()},onProposedTestSteps:async L=>g.uploadProposedSteps(L,h)}},testParams:{tracer:S}})}async function hx(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await Fk(n)}catch(o){let i="Fatal error running test";return y.error(`${i}: ${o.message}`),t.error({err:o},i),{parameters:n,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:r,lastAttemptStartedAt:r,finishedAt:new Date,outputs:{}}}}async function Fk(n){let{testDefinition:e,project:t,apiClient:r,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:l,gitMetadata:c,alwaysSaveCache:d,noCache:p}=n,u=new ai(r,o),m=di({client:r,gitMetadata:c,alwaysSaveCache:d,noCache:p}),h=mx(e.steps);try{await m.resolveStepCacheEntries({organizationId:o,testId:e.id,steps:h,schemaVersion:e.schemaVersion,logger:l})}catch(T){throw l.error({err:T},"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: ${T}`)}let g=n.envName??Bk(e),f,S={};if(g){try{f=ca(g,t,l)}catch(T){let C=`Failed to resolve environment ${g} for test ${e.name}: ${T}`;throw new Error(C)}S=f.variables}let w=e.baseUrl;if(i)w=i;else if(!w){let T=S[Ge];typeof T=="string"&&(w=T)}if(!w){let T=`Cannot run test with no base URL and no ${Ge} variable defined in its environment`;throw new Error(T)}let v=await s.startRun({logger:l,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testLabels:e.labels,baseUrl:w,environmentName:g,schemaVersion:e.schemaVersion}),b=l.child(v.loggerBindings||{});Object.entries(v.envVarBindings||{}).forEach(([T,C])=>{S[T]=C});try{let T=await Uk({...n,variables:S,envName:g,stepsWithCaches:h,resolvedEnv:f,baseUrl:w,storageClient:u,tracer:v,logger:b,cacheStorage:m});return await v.finish({logger:l,status:T.status,finishedAt:T.finishedAt,failureDetails:T.failureDetails,failureReason:T.failureReason,isFlake:T.isFlake}),{runId:v.runId,...T}}finally{a?.pop()}}async function Uk(n){let{testDefinition:e,stepsWithCaches:t,project:r,regenerateGoldenFiles:o,apiClient:i,generator:a,baseUrl:s,storageClient:l,orgId:c,envName:d,urlOverride:p,customHeaders:u,testInputs:m,variables:h,resolvedEnv:g,retriesOverride:f,devicePixelRatio:S,logUpdate:w,tracer:v,logger:b,flagStore:T,cacheStorage:C}=n,A=new Date,k=new ni(r,o),L={ai:r.config.ai},j={envName:d,urlOverride:p,customHeaders:u,testInputs:m},U,M=Math.abs(f??r.config.retries??e.retries??0),z=[];b.info({labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let O=0;O<=M;O++){let K=await v.startAttempt(),B=b.child(K.loggerBindings||{}),J={...e,steps:mx(t)};O!==0&&w("RETRY",`attempt ${O+1}/${M+1}`);let Z=new Date,St=new gr({httpClient:new Nt({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:B}),fakerSeed:T.isBooleanFlagEnabled("faker_constant_seed")?yh:void 0});try{let{controller:re,context:Te}=await dx({baseUrl:s,envName:d,apiClient:i,devicePixelRatio:S,logger:B,storageClient:l,codeEvalTools:St,test:J,generator:a,orgId:c,variables:h,customHeaders:u,testInputs:m,localBrowserConfig:{...r.config.browser||{},...g?.browser||{},...J.advanced},visualDiffScreenshotStorage:k,flagStore:T});U=await ux({attemptMetadata:{attemptNumber:O+1,orgId:c,runId:v.runId},attemptFixtures:{logger:B,storageClient:l,billingReporter:new Fo,analytics:new bi,debugDataStorage:new Fr,codeEvalTools:St,flagStore:T,apiClient:i,context:Te,controller:re,tracer:K},attemptInputs:{test:J,orgSettings:L}});let Me=new Date;U?.status==="PASSED"&&await Ns({logger:b,cacheStorage:C,orgId:c,testId:e.id,originalSteps:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},updatedSteps:{steps:J.steps,beforeSteps:J.beforeSteps,afterSteps:J.afterSteps}}),await K.finish({logger:B,result:U}),z.unshift(U.status);let Ft=await cx({orgId:c,codeEvalTools:St,logger:B,outputDefinitions:e.outputs??[],testContext:Te,flagStore:T}),ln=Ym(z),Un=O+1;if(U.status!=="FAILED")return{...U,parameters:j,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:Me,attempts:Un,baseUrl:s,outputs:Ft,isFlake:ln};let er=U.failedStepResult,cn=er?.message||"Unknown failure",G=er?.failureReason??Ih(cn)??"UnknownError",Ri=B.child({errResult:er,failureReason:G,errorMessage:cn,numAttempts:M+1,name:J.name});if(O<M){Ri.warn(`Retrying failed execution attempt for run: ${cn}`);continue}return Ri.error(`Test failed after all exhausting attempts: ${cn}`),{...U,parameters:j,failureDetails:{errorMessage:cn},failureReason:G,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:Me,attempts:O+1,baseUrl:s,outputs:Ft}}catch(re){Ii(re);let Te=`Encountered fatal platform error while running test '${J.name}': ${re}`,Me=new Date,Ft=O+1;B.error({err:re},Te),y.error(Te);let ln={errorMessage:re.message,errStack:re.stack},Un={status:"FAILED",failureDetails:ln,failureReason:"InternalPlatformError",finishedAt:Me};return await K.finish({logger:B,result:{status:"FAILED",results:[]}}),{...Un,parameters:j,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:new Date,attempts:Ft,baseUrl:s,outputs:{}}}}throw new Error("This code should not be reachable")}function Bk(n){for(let e of n.envs??[])if(e.default)return e.name}import{randomUUID as fx}from"crypto";import zk from"adm-zip";import Zn from"fs";import uo from"path";var za=class n{constructor(e){this.filePath=e;Zn.rmSync(this.filePath,{recursive:!0,force:!0}),Zn.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new n(uo.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=uo.join(this.filePath,t);Zn.writeFileSync(o,r)}createRunArchive(e){return new wu(uo.join(this.filePath,"runs"),e)}},wu=class{constructor(e,t){this.filePath=e;this.tempPath=uo.join(e,`.${t}`),this.finalPath=uo.join(e,`${t}.zip`),Zn.rmSync(this.tempPath,{recursive:!0,force:!0}),Zn.rmSync(this.finalPath,{recursive:!0,force:!0}),Zn.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;cd(e){return new za(uo.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=uo.join(this.tempPath,t);Zn.writeFileSync(o,r)}close(){let e=new zk;e.addLocalFolder(this.tempPath,void 0,r=>r!==".DS_Store");let t=e.toBuffer();Zn.writeFileSync(this.finalPath,t),Zn.rmSync(this.tempPath,{recursive:!0,force:!0})}};async function gx(n,e,t,r,o){let i=Zi(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let a=Qi(o.command);a&&await e.reportCreditsUsed(n,o.command.type,a,{testId:t,testName:r})}}function Hk(n){switch(n){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 jk(n){switch(n){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var vu=class{constructor(e,t,r,o,i,a){this.testId=e;this.testName=t;this.metadata=r;this.diskStorage=o;this.billingReporter=i;this.asyncWork=a}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.jpeg",contents:r})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.jpeg",contents:r})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.html",contents:r})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:r}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.html",contents:r})}heal(e){let{healType:t}=e;this.metadata.healMetadata={healType:t,healedAt:new Date}}async finishInternal(e){if(this.finished)return;this.finished=!0,await Promise.all(this.children.map(r=>r.finish({status:jk(e.status),finishedAt:e.finishedAt})));let t={...this.metadata,status:e.status,finishedAt:e.finishedAt,message:e.message};this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)})}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=this.diskStorage.cd("substeps"),t=new ec(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},ec=class{constructor(e,t,r,o,i){this.testId=e;this.testName=t;this.diskStorage=r;this.billingReporter=o;this.asyncWork=i}children=[];finished=!1;getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:r}=e;this.asyncWork.push(gx(t,this.billingReporter,this.testId,this.testName,r));let o=this.diskStorage.cd(r.id),i={step:r,status:"RUNNING",startedAt:new Date};o.storeFile({name:"metadata.json",contents:JSON.stringify(i,null,2)});let a=new vu(this.testId,this.testName,i,o,this.billingReporter,this.asyncWork);return this.children.push(a),a}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:Hk(e.status),finishedAt:e.finishedAt}))))}},xu=class{constructor(e,t,r,o,i,a,s,l,c){this.orgId=e;this.testId=t;this.testName=r;this.originalSteps=o;this.metadata=i;this.client=a;this.diskStorage=s;this.billingReporter=l;this.asyncWork=c}finished=!1;children=[];trackStatus(){}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)})}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,result:r}=e,o={...this.metadata,status:r.status,finishedAt:new Date,results:_s(r.results,t),beforeResults:r.beforeResults?_s(r.beforeResults,t):void 0,afterResults:r.afterResults?_s(r.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 startStepList(){let e=this.diskStorage.cd("steps"),t=new ec(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},Tu=class{constructor(e,t,r,o,i,a,s,l,c,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.originalSteps=i;this.metadata=a;this.client=s;this.diskStorage=l;this.billingReporter=c;this.asyncWork=d}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[Ry]: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};await Promise.all(this.children.map(r=>r.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()}trackStatus(){}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={schemaVersion:_e,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)});let r=new xu(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork);return this.children.push(r),r}},tc=class n{constructor(e,t,r,o,i,a){this.orgId=e;this.runGroupId=t;this.metadata=r;this.client=o;this.diskStorage=i;this.billingReporter=a;this.asyncWork=[]}children=[];finished=!1;asyncWork;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start(e,t,r,o,i,a){let s=fx(),l={...a,id:s,trigger:qt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:wn},c=new za(r);return c.storeFile({name:"metadata.json",contents:JSON.stringify(l,null,2)}),new n(t,s,l,o,c,i)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,r={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:r.status,finishedAt:r.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let t=fx(),r=this.diskStorage.createRunArchive(t),o={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,cliVersion:wn,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0};r.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)}),this.asyncWork.push(this.billingReporter.reportBillableEvent(e.logger,"test-run",{eventId:t,testId:e.testId,testName:e.testName}));let i=new Tu(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork);return this.children.push(i),i}};import Sx from"adm-zip";import Eu from"fs";import nc from"path";function $k(n){let e=new Sx,t=nc.join(n,"metadata.json"),r=ra.parse(JSON.parse(Eu.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Eu.readdirSync(nc.join(n,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new Sx(nc.join(n,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(nc.join("runs",i,s.entryName),s.getData())}return{runGroupId:r.id,buffer:e.toBuffer()}}async function rc(n){let{client:e,consoleLogger:t,resultsPath:r}=n;if(!Eu.existsSync(r)){t.warn("Results path does not exist, skipping upload.");return}let o=new ul(e);try{let{runGroupId:i,buffer:a}=$k(r),s=await o.uploadResultsArchive(i,a),l=`${e.getAppUrl()}/run-groups/${s}`;t.success(`Successfully uploaded test results. Once processed, your results can be found at ${l}`);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}}async function yx(n){let{logger:e,tests:t,yes:r,start:o,waitOn:i,client:a,debugDataStorage:s,billingReporter:l,flagStore:c,project:d,retriesOverride:p,urlOverride:u,envName:m,orgId:h,devicePixelRatio:g,customHeaders:f,testInputMatrix:S,reporter:w,include:v,exclude:b,labels:T,reporterDir:C=WS,outputDir:A=VS,uploadResults:k=!1,waitOnTimeout:L=60,parallel:j=d.config.parallel??1,shardIndex:U=1,shardCount:M=1,regenerateGoldenFiles:z,gitMetadata:O,alwaysSaveCache:K,noCache:B}=n;o&&(e.info({orgId:h},`Executing start command: ${o}`),await sv(o,!1)),i&&(e.info({orgId:h},`Waiting for url: ${i} with timeout: ${L} seconds.`),await Vk({resources:[i],interval:2500,timeout:L*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let J=new li(d.config.ai?.agentConfig,{baseUrl:a.baseUrl,apiKey:a.apiKey,logger:e}),Z=we(d,y),St=await lx({tests:t,momenticFiles:Z,yes:r,project:d,include:v,exclude:b,labels:T}),re=[];St.forEach((ot,Er)=>{S?S.forEach((go,yt)=>{re.push({testIndex:Er,inputs:go,inputIndex:yt})}):re.push({testIndex:Er,inputs:void 0,inputIndex:void 0})}),M&&M>1&&(re=qk(re,U,M));let Te=`Running ${re.length} tests with ${j} workers:`;e.info({allTestsToRunWithInputs:re,shardCount:M,shardIndex:U,orgId:h},Te),y.info(Te),re.forEach(ot=>{y.info(`${jt}- ${[St[ot.testIndex].relativeFilePath]}${typeof ot.inputIndex=="number"?` with input set ${ot.inputIndex}`:""}`)}),y.log("");let Me=[],Ft=new Date,ln=new Set,Un=async()=>{let ot=a.getAppUrl(),Er=Ti({results:Me,startTime:Ft.getTime(),onFailed:yt=>{Jl(yt,yt.filePath)},getDisplayLine:yt=>{let Cr=`${jt}- ${yt.filePath}${yt.proposedTest?" [AUTO-HEALED] ":""}`;return yt.runId&&(Cr+=` ( link when uploaded: ${ot}/runs/${yt.runId} )`),Cr},entity:"test"}),go=Me.filter(yt=>!!yt.proposedTest);return go.length>0&&y.warn(`${go.length} tests passed with auto-healing. Please use the run links printed above to review proposed changes and apply them locally.`),y.log(""),k?(y.success(`Test results have been saved to the folder ${A}. Uploading to Momentic cloud.`),await rc({client:a,consoleLogger:y,resultsPath:A})):y.success(`Test results have been saved to the folder ${A}. Upload them to Momentic cloud by running 'npx momentic results upload ${A}'.`),Er};Wk.existsSync(A)&&y.warn(`Output directory ${A} already exists, removing before test execution...`);let er=await tc.start(e,h,A,a,l,O),cn=e.child(er.loggerBindings||{}),G=[],Ri=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await er.finish({logger:cn,status:"CANCELLED"}),await Un(),await Promise.allSettled(G.map(ot=>ot())),process.exit(1)};process.once("SIGINT",Ri);let ho={};for(let ot=0;ot<re.length;ot++){let Er=Object.values(ho);Er.length===j&&await Promise.race(Er.map(Cr=>Cr.promise));let go=re[ot],yt=`test-${ot}`;ho[yt]={done:!1,promise:(async({testIndex:Cr,inputs:Iu})=>{let fo=St[Cr];ln.add({testIndex:Cr,inputs:Iu});let Ax=fo.relativeFilePath.includes("..")?fo.fullFilePath:fo.relativeFilePath,Ha=(ct,Ai)=>{ct=ct.toUpperCase();let Bn=ct,tr;ct.includes("FAIL")?(Bn=Ci.bgRed.white("FAIL"),tr=3):ct.includes("PASS")?(Bn=Ci.bgGreen.white("PASS"),tr=3):ct.includes("START")?(Bn=Ci.bgBlue.white("START"),tr=2):ct.includes("CANCEL")?(Bn=Ci.bgRgb(191,68,11).white("CANCEL"),tr=1):ct.includes("RETRY")?(Bn=Ci.bgRgb(191,68,11).white("RETRY"),tr=2):ct.includes("RUN")||ct.includes("PROG")?(Bn=Ci.bgMagenta.white("RUNNING"),tr=0):(cn.warn(`Unknown status tried to be logged in run test locally: ${ct}`),tr=0),Gk||(Bn=`${Bn}`),y.log(`${Bn}${" ".repeat(tr)} ${Ax} ${Ai?`${Ai} `:""}(${ln.size}/${re.length})`)};Ha("START");let Ix=setInterval(()=>Ha("RUN"),5*60*1e3),Pu=cn.child({testId:fo.id});try{let ct=await hx({testDefinition:fo,project:d,testInputs:Iu,orgId:h,devicePixelRatio:g,apiClient:a,runGroupTracer:er,generator:J,retriesOverride:p,urlOverride:u,envName:m,customHeaders:f,regenerateGoldenFiles:z,logUpdate:Ha,runSigIntHandlers:G,logger:Pu,flagStore:c,gitMetadata:O,alwaysSaveCache:K,noCache:B});Ha(ct.status),Me.push(ct)}catch(ct){let Ai=`Encountered unexpected fatal error when running test '${fo.name}': ${ct.message}`;y.error(Ai),Pu.error(Ai)}finally{clearInterval(Ix),ho[yt].done=!0,delete ho[yt]}})(go)}}await Promise.allSettled(Object.values(ho).map(ot=>ot.promise));let Au="PASSED";return Me.some(ot=>ot.status==="FAILED")&&(Au="FAILED"),await er.finish({logger:cn,status:Au}),process.off("SIGINT",Ri),w&&await sx(cn,s,w,{projectConfigPath:d.configFilePath,suiteName:d.config.name,startedAt:Ft,finishedAt:new Date,runs:Me},C),Un()}function qk(n,e,t){if(t>n.length&&(y.warn(`Shard count ${t} is greater than the number of tests ${n.length}! Some workers won't have any tests to run.`),t=Math.max(t,n.length),e>t))return[];let r=Math.floor((e-1)*(n.length/t)),o=Math.floor(e*(n.length/t));return n.sort().filter((a,s)=>s>=r&&s<o)}import{randomUUID as Kk}from"crypto";import Qn from"fs";import mo from"path";var bx={status:(n,e)=>{if(n.status===e.status)return n.status;if(n.status==="FAILED"||e.status==="FAILED")return"FAILED";if(n.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(n.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(n.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(n.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${n.status} and ${e.status}`)},startedAt:(n,e)=>n.startedAt<e.startedAt?n.startedAt:e.startedAt,updatedAt:(n,e)=>n.updatedAt>e.updatedAt?n.updatedAt:e.updatedAt,finishedAt:(n,e)=>!n.finishedAt||!e.finishedAt?new Date:n.finishedAt>e.finishedAt?n.finishedAt:e.finishedAt,gitCommitTimestamp:(n,e)=>{if(!(!n&&!e)){if(!n.gitCommitTimestamp||!e.gitCommitTimestamp||n.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${n.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return n.gitCommitTimestamp}},pipelineId:(n,e)=>n.pipelineId===e.pipelineId?n.pipelineId:!n.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&n.pipelineId?n.pipelineId:n.startedAt<e.startedAt?e.pipelineId:n.pipelineId};function wx(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function Yk(n,e,t){if(bx[t]){let i=bx[t];return i(n,e)}let r=wx(n,t),o=wx(e,t);if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}var vx=new Set([".DS_Store","__MACOSX"]);function xx(n,e,t){let r=Kk(),o=n.child({runGroupId:r});Qn.rmSync(e,{recursive:!0,force:!0});let i=Qn.readdirSync(t).filter(c=>!vx.has(c)).map(c=>mo.join(t,c));Qn.mkdirSync(e,{recursive:!0});let a=mo.join(i[0],"metadata.json"),s={...ra.parse(JSON.parse(Qn.readFileSync(a,"utf-8"))),id:r};for(let c of i){let d=mo.join(c,"runs");if(!Qn.existsSync(d))continue;let p=Qn.readdirSync(d);for(let h of p){if(vx.has(h))continue;let g=mo.join(d,h),f=mo.join(e,"runs",h);Qn.cpSync(g,f,{recursive:!0})}let u=mo.join(c,"metadata.json"),m=ra.parse(JSON.parse(Qn.readFileSync(u,"utf-8")));o.info("Merging metadata from run groups",{runGroupId:m.id});for(let h in m){if(h==="id")continue;let g=h;s[g]=Yk(s,m,g)}}let l=mo.join(e,"metadata.json");Qn.writeFileSync(l,JSON.stringify(s,null,2))}var Tx=new wi({platform:"cli"},{flushAt:1,flushInterval:0});ac||ee.warn("Sentry is not enabled in this environment due to unsupported node version");var t_=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),Cu=n=>{t_&&y.dimmed(n)},Dt=new Jk;Dt.name("momentic").description("CLI").version(wn);Dt.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: ${hu.join(", ")}.`).action(async(n,e)=>{!e.all&&n.length===0&&(y.error("No browsers specified"),process.exit(1)),await Kv({rawBrowsers:n,force:e.force,all:e.all})});Dt.addOption(new sn("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",n=>{n==="debug"&&y.info("Enabling debug logging"),y.setMinLevel(n.toLowerCase())});Dt.addOption(new sn("--verbose","enable verbose logging")).on("option:verbose",()=>{ee.enableConsoleLogs(),y.setMinLevel(0)});var Ru=Dt.command("checks").alias("check").description("Perform various project checks");Ru.command("config").addOption(Fn).action(async n=>{nn({configFilePath:n.config})});Ru.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(Fn).addOption(Cv).action(async n=>{let e=await vn(n),t=nn({configFilePath:n.config});await Dv({project:t,fix:e.fix})});Ru.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(Fn).action(async n=>{let e=nn({configFilePath:n.config});await Fv({project:e})});var Ex=Dt.command("migrate").description("Migrate and upgrade tooling");Ex.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(Fn).action(async n=>{let e=nn({configFilePath:n.config});await Yv(e)});Ex.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(Xn).addOption(Fn).addOption(Jn).action(async n=>{let e=await vn(n);!e.yes&&!await ft("This command will modify your existing Momentic configuration. Please backup your local directory using Git or another version control system before proceeding. Continue?",!0)&&process.exit(1);let t=nn({configFilePath:n.config}),r=new lt({baseUrl:e.server,apiKey:e.apiKey,logger:ee}),{orgId:o}=await r.getAuthInfo();await Xv({project:t,orgId:o,apiClient:r}),process.exit(0)});Dt.command("import").addOption(Jn).addOption(Xn).addOption(Fn).addOption(co).addArgument(Av).action(async(n,e)=>{let t=await vn(e),{apiKey:r,server:o,config:i,yes:a}=t,s=nn({configFilePath:i}),l=new lt({baseUrl:o,apiKey:r,logger:ee});!n||n.length===0?await jv({client:l,project:s,skipPrompts:a}):await $v({client:l,project:s,paths:n,skipPrompts:a}),process.exit(0)});Dt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new sn("--name <name>","Name of the project")).action(async n=>{y.info(`Welcome to the Momentic project setup wizard! \u{1F680}
|
|
3834
|
+
`),y.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."),ic.existsSync(Qo)&&(y.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let t={name:n.name??await mv("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Hd};ei(t,Qo),y.success(`Initialized Momentic project file at ${oc.resolve(Qo)}`)});Dt.command("app").addOption(Jn).addOption(Xn).addOption(co).addOption(iu).addOption(xv).addOption(Fn).addOption(lu).addOption(cu).action(async n=>{let e=await vn(n),{apiKey:t,port:r=$l,yes:o,server:i,pixelRatio:a,disableCache:s,saveCache:l}=e,c=new lt({baseUrl:i,apiKey:t,logger:ee});await du({client:c,skipPrompts:o});let d=e_(import.meta.url),p=oc.dirname(d),u=oc.resolve(p,"..","static"),m=oc.resolve(p,"..","assets"),h=a??Jp();Xp(h),await ov({momenticServerUrl:i,apiKey:t,serverPort:r,appPort:r,staticDir:u,assetsDir:m,devicePixelRatio:h,version:wn,noCache:s,alwaysSaveCache:l});let g=`http://localhost:${r}`;await Qk(g)});var Cx=Dt.command("queue").description("Queue tests or suites to run on Momentic Cloud");Cx.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Jn).addOption(Xn).addOption(nu).addOption(ru).addOption(co).addArgument(Pv).addOption(Vl).addOption(Wl).addOption(Gl).action(async(n,e)=>{let{apiKey:t,server:r,wait:o,waitTimeout:i,env:a,urlOverride:s,customHeaders:l}=await vn(e),c=new lt({baseUrl:r,apiKey:t,logger:ee});(!n||!Array.isArray(n)||!n.length)&&(y.error("Must pass at least one suite to run."),process.exit(1));let{orgId:d}=await c.getAuthInfo();await Qv({client:c,orgId:d,wait:o,suitePaths:n,waitTimeout:i,env:a,urlOverride:s,customHeaders:ql(l)})});Cx.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Jn).addOption(Xn).addOption(co).addOption(Gl).addOption(au).addOption(Vl).addOption(Wl).addOption(nu).addOption(ru).addArgument(Rv).action(async(n,e)=>{let t=await vn(e),{all:r,apiKey:o,customHeaders:i,env:a,server:s,inputCsv:l,urlOverride:c,wait:d,waitTimeout:p,yes:u}=t,m=ql(i);for(let S of n)(S.endsWith(".yaml")||ic.existsSync(S))&&y.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 h=new lt({baseUrl:s,apiKey:o,logger:ee}),{orgId:g}=await h.getAuthInfo(),f;l&&(f=await Zp(l)),await ex({client:h,orgId:g,tests:n,all:r,customHeaders:m,env:a,urlOverride:c,wait:d,waitTimeout:p,testInputMatrix:f,yes:u}),process.exit(0)});var n_=Dt.command("run").alias("test").description("Run tests on the local machine");n_.addOption(Jn).addOption(Xn).addOption(Fn).addOption(su).addOption(co).addOption(Gl).addOption(au).addOption(lu).addOption(cu).addOption(Wl).addOption(Vl).addOption(iu).addOption(new sn("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new sn("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new sn("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.")).addOption(new sn("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.")).addOption(new sn("-p, --parallel <parallel>","When running with the --local flag, the number of tests to run in parallel. Defaults to 1.")).addOption(new sn("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new sn("--update-golden-files","Update locally stored golden files for steps that this is enabled for.")).addOption(Sv).addOption(yv).addOption(ou).addOption(bv).addOption(Tv).addOption(Ev).addOption(wv).addOption(vv).addArgument(Iv).action(async(n,e)=>{y.debug("Run tests invoked");let t=await vn(e);y.debug(t,"Parsed CLI options");let r=ql(t.customHeaders),o=nn({configFilePath:t.config,nameFilter:t.filter});y.debug({projectName:o.config.name},"Identified project config");let{errors:i}=await uu({project:o,fix:!1});i>0&&(y.error(`Found errors in ${i} steps`),y.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 lt({baseUrl:t.server,apiKey:t.apiKey,logger:ee});y.debug("Checking API key and dependencies");let{orgId:s,userId:l}=await du({client:a,skipPrompts:t.yes});y.debug("API key check and browser installation complete");let c=new dl(a),d=new pl(a),p=t.outputDir??o.config.outputDir,u=t.reporterDir??o.config.reporterDir,m=ee.child({orgId:s,userId:l,cliVersion:wn,trigger:"CLI"}),h=await oi(ee,a,o);m.debug(h,"Got local git metadata");let g=new ri(o.config),f=Tx.child({org_id:s,user_id:l,cli_version:wn,trigger:"CLI"}),S;t.inputCsv&&(S=await Zp(t.inputCsv));let w=t.pixelRatio??Jp();Xp(w);try{(await yx({...t,retriesOverride:t.retries,devicePixelRatio:w,tests:n,project:o,client:a,debugDataStorage:d,billingReporter:c,analytics:f,flagStore:g,outputDir:p,uploadResults:t.uploadResults,reporterDir:u,customHeaders:r,envName:t.env,orgId:s,testInputMatrix:S,logger:m,regenerateGoldenFiles:t.updateGoldenFiles,gitMetadata:h,alwaysSaveCache:t.saveCache,noCache:t.disableCache})).failed>0?process.exit(1):process.exit(0)}catch(v){y.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),y.error(v),process.exit(1)}});var r_=Dt.command("apply").description("Apply an operation to local resources");r_.command("patch").addOption(Jn).addOption(Xn).addOption(Fn).addOption(su).addOption(co).addOption(new sn("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new sn("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async n=>{let e=await vn(n),{apiKey:t,server:r,config:o,yes:i}=e,a=nn({configFilePath:o}),s=ee,l=new lt({baseUrl:r,apiKey:t,logger:s}),c=we(a,y),d=c.tests[n.to]??Object.values(c.tests).find(u=>Ne(u.name)===n.to.trim());d||(y.error(`No test matching '${n.to}' could be found in the current project.`),process.exit(1));let p=await l.fetchTestFragment(n.from);await hv({client:l,test:d,fragment:p,yes:i,entities:c,logger:ee}),process.exit(0)});var Rx=Dt.command("results").description("Merge and upload test results.");Rx.command("merge").description("Merge test results files.").addOption(ou).addArgument(Lv).action(async(n,e)=>{let t=await vn(e),{outputDir:r}=t;r||(y.error("Output directory is required."),process.exit(1)),ic.existsSync(n)||(y.warn("Results path does not exist, skipping merge."),process.exit(0)),ic.existsSync(r)&&y.warn(`Output directory ${r} already exists, removing before merging...`),xx(ee,r,n)});Rx.command("upload").description("Upload test results to Momentic cloud.").addOption(Jn).addOption(Xn).addArgument(Ov).action(async(n,e)=>{let t=await vn(e),{apiKey:r,server:o}=t,i=ee,a=new lt({baseUrl:o,apiKey:r,logger:i});await rc({consoleLogger:y,resultsPath:n,client:a}),process.exit(0)});async function o_(){Cu("Main program started"),await cv(ee),Cu("CLI version check complete");try{await Dt.parseAsync(process.argv)}catch(n){let e={};try{e.playwrightVersion=Xk("npx playwright --version").toString()}catch(t){ee.error({err:t},"Error fetching debug information")}ee.error({err:n,debugInfo:e},"Uncaught error in CLI"),ee.flush(),Ii(n,e),y.error(n),process.exit(1)}}Zk.setMaxListeners(50);process.on("warning",n=>{ee.warn({err:n},`Node warning received on CLI: ${n.message}`)});Cu("CLI parsing setup complete");o_();
|
|
3835
3835
|
//# sourceMappingURL=cli.js.map
|
|
3836
|
-
//# debugId=
|
|
3836
|
+
//# debugId=d8b5e4b1-ddb5-59d8-9465-6798a8d59560
|