momentic 2.3.0 → 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 ET=Object.create;var xu=Object.defineProperty;var CT=Object.getOwnPropertyDescriptor;var RT=Object.getOwnPropertyNames;var AT=Object.getPrototypeOf,IT=Object.prototype.hasOwnProperty;var Eu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var PT=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of RT(e))!IT.call(n,o)&&o!==t&&xu(n,o,{get:()=>e[o],enumerable:!(r=CT(e,o))||r.enumerable});return n};var LT=(n,e,t)=>(t=n!=null?ET(AT(n)):{},PT(e||!n||!n.__esModule?xu(t,"default",{value:n,enumerable:!0}):t,n));var zf=Eu((xK,Bf)=>{"use strict";Bf.exports=Ff;function Ff(n,e,t){n instanceof RegExp&&(n=Df(n,t)),e instanceof RegExp&&(e=Df(e,t));var r=Uf(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 Df(n,e){var t=e.match(n);return t?t[0]:null}Ff.range=Uf;function Uf(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 Kf=Eu((EK,qf)=>{"use strict";var Hf=zf();qf.exports=TA;var $f="\0SLASH"+Math.random()+"\0",jf="\0OPEN"+Math.random()+"\0",Sd="\0CLOSE"+Math.random()+"\0",Gf="\0COMMA"+Math.random()+"\0",Wf="\0PERIOD"+Math.random()+"\0";function fd(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function wA(n){return n.split("\\\\").join($f).split("\\{").join(jf).split("\\}").join(Sd).split("\\,").join(Gf).split("\\.").join(Wf)}function vA(n){return n.split($f).join("\\").split(jf).join("{").split(Sd).join("}").split(Gf).join(",").split(Wf).join(".")}function Vf(n){if(!n)return[""];var e=[],t=Hf("{","}",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=Vf(i);return i.length&&(a[a.length-1]+=s.shift(),a.push.apply(a,s)),e.push.apply(e,a),e}function TA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),la(wA(n),!0).map(vA)):[]}function xA(n){return"{"+n+"}"}function EA(n){return/^-?0\d/.test(n)}function CA(n,e){return n<=e}function RA(n,e){return n>=e}function la(n,e){var t=[],r=Hf("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?la(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+Sd+r.post,la(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=Vf(r.body),u.length===1&&(u=la(u[0],!1).map(xA),u.length===1))return i.map(function(H){return r.pre+u[0]+H});var m;if(d){var h=fd(u[0]),g=fd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(fd(u[2])):1,w=CA,v=g<h;v&&(S*=-1,w=RA);var b=u.some(EA);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,la(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 Ai=(n,e)=>{},nc=!1;try{let n=await import("@sentry/node");Ai=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),nc=!0}catch{}import{Command as Uk,Option as on}from"@commander-js/extra-typings";import{execSync as Bk}from"child_process";import Yw from"body-parser";import vN from"cors";import TN from"dedent";import xN from"events";import Jw,{Router as EN}from"express";import{diff as SA}from"deep-object-diff";import pn from"fs";import qr from"path";import{diff as jR}from"deep-object-diff";import{z as Cu}from"zod";var Jk=Cu.object({input:Cu.string()});import{z as Ve}from"zod";var Qk=Ve.object({srcs:Ve.array(Ve.string()),urls:Ve.array(Ve.string()),desiredSrc:Ve.string().optional(),desiredUrl:Ve.string().optional()}),Ru=Ve.object({srcRegex:Ve.string().optional(),urlRegex:Ve.string().optional()}),Au=Ve.object({x:Ve.number(),y:Ve.number(),correlation:Ve.number()}),e_=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 Iu=ge.object({plan:ge.string().optional(),evidence:ge.string().optional(),thoughts:ge.string(),result:ge.boolean(),relevantElements:ge.array(ge.number()).optional()}),ho=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(ho||{});var OT=ge.object({type:ge.literal("ELEMENT_CONTENT"),negated:ge.boolean().optional(),operation:ge.nativeEnum(ho),value:ge.string()}).openapi({ref:"ElementContentAssertion"}),MT=ge.object({type:ge.literal("ELEMENT_ATTRIBUTE"),negated:ge.boolean().optional(),operation:ge.nativeEnum(ho),attr:ge.string(),value:ge.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Ii=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(Ii||{}),NT=ge.object({type:ge.literal("ELEMENT_EXISTENCE"),negated:ge.boolean().optional(),condition:ge.nativeEnum(Ii).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Pu=ge.discriminatedUnion("type",[OT,MT,NT]).openapi({ref:"ManualElementAssertion"});var kT=ge.object({type:ge.literal("CONTENT"),negated:ge.boolean().optional(),value:ge.string()}).openapi({ref:"PageContentAssertion"}),Lu=ge.discriminatedUnion("type",[kT]).openapi({ref:"ManualPageAssertion"});import*as F from"zod";Te(F);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||{}),_T=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),xr=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:_T.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(er).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional()}).openapi({ref:"A11yTargetWithCache"});function Ou(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var DT=F.object({type:F.literal("description"),elementDescriptor:F.string(),a11yData:xr.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),FT=F.object({x:F.number(),y:F.number()}),UT=F.object({type:F.literal("coordinates"),pixels:FT}).openapi({ref:"CoordinatesTarget"});function tr(n){return n.type==="description"}function wn(n){return n.type==="coordinates"}var ct=F.discriminatedUnion("type",[DT,UT]).openapi({ref:"ElementTarget"});function rc(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 Fa=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")}),Mu=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")}),Ua=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:xr}).optional().openapi({ref:"SingleTargetCache"}),Ba=T.object({loadTimeout:T.number().int().max(60).optional().describe("Max seconds for the page to load")}),BT=Y.merge(Ba).merge(T.object({type:T.literal("NAVIGATE"),url:T.string()})).openapi({ref:"NavigateCommand"}),za=Ht.merge(T.object({cache:vn})),go=Y.merge(za.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_UP"),deltaY:T.number().optional()}))).openapi({ref:"ScrollUpCommand"}),fo=Y.merge(za.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_DOWN"),deltaY:T.number().optional()}))).openapi({ref:"ScrollDownCommand"}),So=Y.merge(za.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_LEFT"),deltaX:T.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),yo=Y.merge(za.merge(T.object({target:ct.optional(),type:T.literal("SCROLL_RIGHT"),deltaX:T.number().optional()}))).openapi({ref:"ScrollRightCommand"}),S_=T.discriminatedUnion("type",[go,fo,So,yo]).openapi({ref:"AllScrollCommands"}),zT=Y.merge(T.object({type:T.literal("DIALOG"),action:T.union([T.literal("ACCEPT"),T.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),HT=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()})]),jT=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")}),GT=Y.extend({type:T.literal("WAIT_FOR_URL"),matcher:$T}).merge(jT).openapi({ref:"WaitUrlCommand"}),WT=Y.merge(Ba).merge(T.object({type:T.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),VT=Y.merge(T.object({type:T.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),qT=Y.merge(T.object({type:T.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),KT=Y.extend({type:T.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),YT=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"}),ic=Y.merge(Ht).extend({type:T.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),JT=Y.extend({type:T.literal("COPY"),value:T.string()}).openapi({ref:"CopyCommand"}),XT=Y.extend({type:T.literal("PASTE")}).openapi({ref:"PasteCommand"}),ZT=Y.merge(Ua).extend({type:T.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Li=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"}),Oi=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:xr.optional(),toTarget:xr.optional()}).optional()})).openapi({ref:"DragCommand"}),Mi=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"}),Ni=Y.merge(Ht).merge(T.object({type:T.literal("HOVER"),target:ct,cache:vn})).openapi({ref:"HoverCommand"}),ki=Y.merge(Ht).merge(T.object({type:T.literal("FOCUS"),target:ct,cache:vn})).openapi({ref:"FocusCommand"}),_i=Y.merge(Ht).extend({type:T.literal("BLUR"),target:ct.optional(),cache:vn}).openapi({ref:"BlurCommand"}),QT=T.object({type:T.literal("URL"),url:T.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),ex=T.object({type:T.literal("USER_FILE"),name:T.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),tx=Y.extend({type:T.literal("FILE_UPLOAD"),fileSource:T.discriminatedUnion("type",[QT,ex]),filename:T.string().optional()}).openapi({ref:"FileUploadCommand"}),nx=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()})]),Di=Y.merge(Ht).extend({type:T.literal("SELECT_OPTION"),target:ct,cache:vn,choice:nx.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),ac=T.union([T.literal("MULTIMODAL"),T.literal("VISION_ONLY")]),Nu=Y.merge(T.object({type:T.literal("AI_ASSERTION"),assertion:T.string(),disableCache:T.boolean().optional(),iframeUrl:T.string().optional(),contextChoice:ac.optional(),timeout:T.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),Tn=5,sc=600,Fi=Y.merge(Ht).extend({type:T.literal("ELEMENT_CHECK"),target:ct,assertion:Pu,cache:vn,timeout:T.number().int().min(0).max(sc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),rx=Y.extend({type:T.literal("PAGE_CHECK"),assertion:Lu,iframeUrl:T.string().optional().describe("url or url regex for the iframe"),timeout:T.number().int().min(0).max(sc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),ox=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"}),ix=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()}),ku=25,Ui=Y.merge(Ht).merge(ix).extend({type:T.literal("TYPE"),target:ct.optional(),value:T.string(),cache:vn}).openapi({ref:"TypeCommand"}),ax=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"}),sx=T.object({type:T.literal("SUBSTRING"),substring:T.string()}),lx=T.object({type:T.literal("REGEX"),pattern:T.string()}),cx=T.object({type:T.literal("INDEX"),index:T.coerce.string()}),dx=T.discriminatedUnion("type",[sx,lx,cx]),px=Y.merge(Ba).merge(T.object({type:T.literal("TAB"),action:dx})).openapi({ref:"TabCommand"}),ux=Y.merge(Ba).merge(T.object({type:T.literal("NEW_TAB"),url:T.string()})).openapi({ref:"NewTabCommand"}),mx=Y.merge(T.object({type:T.literal("COOKIE"),value:T.string()})).openapi({ref:"CookieCommand"}),hx=Y.merge(T.object({type:T.literal("LOCAL_STORAGE"),key:T.string(),value:T.string()})).openapi({ref:"LocalStorageCommand"}),gx=Y.extend({type:T.literal("REQUEST")}).merge(Fa).openapi({ref:"RequestCommand"}),fx=Y.extend({type:T.literal("GRAPHQL_REQUEST")}).merge(Mu).openapi({ref:"GraphQLRequestCommand"}),Sx=Y.merge(T.object({type:T.literal("SUCCESS"),condition:Nu.optional()})).openapi({ref:"SuccessCommand"}),yx=Y.merge(T.object({type:T.literal("FAILURE")})).openapi({ref:"FailureCommand"}),bx=T.object({data:T.string().describe("location at which to find a jpg"),width:T.number(),height:T.number()}),Bi=Y.merge(Ht).merge(T.object({type:T.literal("VISUAL_DIFF"),threshold:T.number().optional().describe("default 0.1"),target:ct.optional(),screenshot:bx.optional(),cache:vn})).openapi({ref:"VisualDiffCommand"}),wx=Y.merge(T.object({type:T.literal("REGISTER_REQUEST_LISTENER"),pattern:T.string(),key:T.string()})).openapi({ref:"RegisterRequestListenerCommand"}),vx=Y.merge(T.object({type:T.literal("AWAIT_LISTENER"),key:T.string(),timeout:T.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),Tx=Y.merge(T.object({type:T.literal("RECORD_REQUESTS"),pattern:T.string(),key:T.string()})).openapi({ref:"RecordRequestsCommand"}),xx=Y.merge(T.object({type:T.literal("GET_RECORDED_REQUESTS"),key:T.string()})).openapi({ref:"GetRecordedRequestsCommand"}),Ex=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"}),_u=T.discriminatedUnion("type",[Li,Ui,ax,Di,BT,fo,go,Nu,Ni,HT,Sx]),Cx=T.discriminatedUnion("type",[ox,YT,KT,ic,mx,JT,zT,Oi,Fi,tx,VT,qT,ZT,hx,Mi,ux,rx,XT,WT,gx,fx,So,yo,px,Bi,ki,_i,GT,wx,vx,Tx,xx,Ex]),bo=T.discriminatedUnion("type",[..._u.options,...Cx.options]).openapi({ref:"Command"}),Ha=T.discriminatedUnion("type",[..._u.options,yx]);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 Du(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 Rx}from"zod";var T_=Rx.discriminatedUnion("type",[_i,ic,Li,Oi,ki,Ni,Mi,go,fo,So,yo,Di,Ui,Bi,Fi]);function Fu(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as Ax}from"zod";var Tt={type:!0,cache:!0},Er=Ax.discriminatedUnion("type",[_i.pick(Tt),Li.pick(Tt),Oi.pick(Tt),Fi.pick(Tt),ki.pick(Tt),Ni.pick(Tt),Mi.pick(Tt),go.pick(Tt),fo.pick(Tt),So.pick(Tt),yo.pick(Tt),Di.pick(Tt),Ui.pick(Tt),Bi.pick(Tt)]),lc=Object.values(De).filter(n=>Er.options.some(e=>e.shape.type.safeParse(n).success));bo.options.forEach(n=>{if("target"in n.shape&&!lc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as dc}from"zod";import{z as cc}from"zod";import{z as wo}from"zod";var xt=wo.object({index:wo.number().optional().describe("global index within a test (in-order traversal)"),id:wo.string(),skipped:wo.boolean().optional(),envKey:wo.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:wo.boolean().optional()});Te(cc);var Et=xt.extend({type:cc.literal("PRESET_ACTION"),command:bo,skipped:cc.boolean().optional()}).openapi({ref:"PresetAction"});Te(dc);var Cr=xt.extend({type:dc.literal("AI_ACTION"),text:dc.string(),steps:Et.array().optional()}).openapi({ref:"AIAction"});import{z as le}from"zod";var Ix=le.object({cacheKey:le.string(),cacheExpiryMs:le.number()}),pc=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:Ix.optional()}),Bn=pc.extend({type:le.literal("MODULE"),moduleId:le.string().uuid()}),Px=le.union([Bn.pick({type:!0,moduleId:!0}),le.record(le.unknown())]),Lx=le.object({type:le.literal("URL_REGEX"),regex:le.string()}),Ox=le.object({type:le.literal("PAGE_CHECK"),substring:le.string()}),uc=le.object({cacheInvalidation:le.discriminatedUnion("type",[Ox,Lx]).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:uc.nullish()});import{z as ot}from"zod";import{z as mc}from"zod";Te(mc);var vo=xt.extend({type:mc.literal("AI_ACTION_DYNAMIC"),text:mc.string()}).openapi({ref:"AIActionDynamic"});import{z as Uu}from"zod";var hc=xt.extend({type:Uu.literal("CONDITIONAL"),skipped:Uu.boolean().optional()});import{z as $a}from"zod";var Mx=$a.object({type:$a.literal("url"),url:$a.string()}),zi=xt.extend({type:$a.literal("IFRAME"),identifier:Mx});import{z as $t}from"zod";var gc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(gc||{});var Nx=$t.discriminatedUnion("type",[$t.object({type:$t.literal("NAVIGATE_URL"),url:$t.string().url()}),$t.object({type:$t.literal("GO_TO_SECTION_START")})]),kx=$t.object({trigger:$t.nativeEnum(gc).optional(),attempts:$t.number().int().optional(),restartBehavior:Nx}),Hi=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:kx.optional()});var Bu=Ct.merge(pc).extend({type:ot.literal("RESOLVED_MODULE"),steps:ot.lazy(()=>Ae.array())}),fc=Ct.extend({steps:ot.lazy(()=>Ae.array())}),Sc=zi.extend({steps:ot.lazy(()=>ye.array())}),_x=zi.extend({steps:ot.lazy(()=>Ae.array())}),yc=Hi.extend({steps:ot.lazy(()=>ye.array())}),Dx=Hi.extend({steps:ot.lazy(()=>Ae.array())}),Rr=hc.extend({blocks:ot.object({assertion:ot.lazy(()=>Et),steps:ot.lazy(()=>ye.array())}).array(),elseSteps:ot.lazy(()=>ye.array().optional())}),Fx=hc.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,Cr,vo,Bn,Rr,Sc,yc]),Ae=ot.discriminatedUnion("type",[Et,Cr,vo,Bu,Fx,_x,Dx]);import{z as jt}from"zod";var Ux=jt.object({steps:ye.array(),beforeSteps:ye.array().nullish(),afterSteps:ye.array().nullish()}),To=jt.object({steps:Ae.array(),beforeSteps:Ae.array().nullish(),afterSteps:Ae.array().nullish()}),Ar=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 bc=nr.object({key:nr.string(),testId:nr.string().optional(),moduleId:nr.string().optional(),organizationId:nr.string(),value:Er}),Bx=bc.extend({uniqueKey:nr.string()}),zu=nr.record(nr.string(),Bx);var Hu=M.object({phrase:M.string()}),wc=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()])}),vF=M.object({text:M.string()}),$u=M.object({thoughts:M.string(),review:M.string().optional(),id:M.number().int()}),ja=(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))(ja||{});var ju=M.object({thoughts:M.string(),category:M.nativeEnum(ja)}),zx=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()})]),TF=M.object({thoughts:M.string(),patches:zx.array()}),Gu=[M.literal("add"),M.literal("replace"),M.literal("remove")],Hx=M.object({op:M.union(Gu),path:M.string(),value:Ae.optional()}),Wu=M.object({patches:Hx.array(),thoughts:M.string()});var $x=M.object({thoughts:M.string(),op:M.union(Gu),value:M.union([M.null(),Ae])}),Vu=M.object({reasoning:M.string(),scenario:M.string(),patch:$x.or(M.null())}),xF=M.object({thoughts:M.string(),evaluation:M.number().min(1).max(10)}),EF=M.object({observations:M.string(),reasoning:M.string(),command:Ha});var vc=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 _}from"zod";import*as ee from"zod";var LF=ee.object({thoughts:ee.string().optional().describe("only provided if a description was provided"),target:xr.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")}),qu=ee.union([ee.literal("ELEMENT_CHECK"),ee.literal("NEGATED_CHECK"),ee.literal("SELECT_OPTION"),ee.literal("TYPE")]);function Ir(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||{}),xo=ee.object({matched:ee.boolean(),reason:ee.string().optional().describe("Human understandable description"),logs:ee.string().array().optional().describe("Logs for debugging")}),jx=xo.extend({type:ee.literal("USER_SELECTOR")}),Gx=xo.extend({type:ee.literal("CSS_SELECTOR"),selectors:ee.string().array()}),Wx=xo.extend({type:ee.literal("HYBRID_SELECTOR")}),Vx=xo.extend({type:ee.literal("HTML_DISTANCE"),distance:ee.number().optional(),closestElement:ee.string().optional(),savedElement:ee.string().optional()}),qx=xo.extend({type:ee.literal("TEMPLATE_MATCHING"),elementImageUrl:ee.string().url()}),Kx=xo.extend({type:ee.literal("AUTO_FRAME"),logs:ee.string().array().optional()}),Ku=ee.discriminatedUnion("type",[jx,Gx,Wx,Vx,qx,Kx]);import{z as qi}from"zod";import{z as fC}from"zod";import*as X from"zod";import{cloneDeep as Gi}from"lodash-es";var Yx=n=>{let e=Yu(n,0);if(e===void 0||!Xx(n[e]))return;let t=Yu(n,e+1);if(t!==void 0)return Zx(n,e,t)},Ju=Yx,Yu=(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}`)}},aC=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?Xu(e,t):gm(e,t);import*as Lr from"zod";import{z as ln}from"zod";import{z as St}from"zod";var Mc=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 Im=1e4,Pm=6e4,Pr=Mc.extend({pageLoadTimeoutMs:St.number().optional().refine(n=>n===void 0||n<=Pm&&n>=-1,{message:`Page load timeout must be between 0 and ${Pm/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<=Im&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${Im/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",Qa="CURRENT_URL",Co="ENV_NAME",H0={[Ge]:"https://www.google.com"},Lm=ln.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),es=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:Pr.optional()});Te(Lr);var Wi=Lr.object({env:Lr.record(Lr.unknown())}).openapi({ref:"TestContextSnapshot"}),sC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",lC=[Ge,Co],Mm=[Qa,Ge,Co],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[Qa]??"about:blank",i=e.env[Co],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=Gi(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){lC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Co]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Gi(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,sC]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Eo(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Eo(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[Qa]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Gi(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ge,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Co,e.envName)}getDynamicVariablesCopy(){return Gi(this.env)}getVariablesFromEnvironmentCopy(){return Gi(this.varsFromMomenticEnvironment)}};import{z as Or}from"zod";Te(Or);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"],ts={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"},Ro={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."},Nc=Or.object({reason:Or.nativeEnum(ce),summary:Or.string()}).openapi({ref:"TestResultClassification"}),ns=Or.object({errorMessage:Or.string(),errorStack:Or.string().optional(),classification:Nc.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||{}),kc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(kc||{}),_c=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()}),cC=_c.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(kc),message:X.string().optional(),elementInteracted:X.string().optional()}),rr=_c.extend({status:X.nativeEnum(xe),message:X.string().optional(),data:X.unknown().optional(),beforeTestContext:Wi.optional(),afterTestContext:Wi.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"}),rs=rr.merge(Et).extend({results:cC.array(),proposedStep:Et.optional()}),dC=rr.merge(Cr).extend({results:X.lazy(()=>rs.array())}),pC=rr.merge(vo).extend({results:X.lazy(()=>rs.array())}),uC=rr.merge(Bn).extend({moduleName:X.string().optional(),results:X.lazy(()=>At.array())}),mC=rr.merge(Rr).extend({assertion:rs.optional(),results:X.lazy(()=>At.array()).describe("results for the block actually executed")}),hC=rr.merge(zi).extend({results:X.lazy(()=>At.array())}),gC=rr.merge(Hi).extend({results:X.lazy(()=>At.array()),healingAttempts:X.lazy(()=>At.array().array()).optional()}),At=X.discriminatedUnion("type",[dC,pC,rs,uC,mC,hC,gC]),os=rr.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),is=_c.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var Dc=fC.object({results:At.array().describe("main results"),beforeResults:At.array().optional(),afterResults:At.array().optional()}),as=Dc.partial();import{z as G}from"zod";import{z as Ee}from"zod";var SC=Ee.object({type:Ee.literal("FAILURE_RECOVERY"),thoughts:Ee.string()}),yC=Ee.object({type:Ee.literal("DESCRIPTION_UPDATE"),thoughts:Ee.string()}),ss=Ee.discriminatedUnion("type",[yC,SC]),ls=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(ls||{}),bC=Ee.object({testId:Ee.string(),name:Ee.string(),orgId:Ee.string(),runId:Ee.string(),purpose:Ee.nativeEnum(ls).catch("AUTO_HEALING"),steps:Ae.array(),details:ss.or(ss.array()).optional()}),mU=bC.pick({name:!0,orgId:!0}),Fc=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(ls).catch("AUTO_HEALING"),runId:Ee.string().nullish(),details:ss.or(ss.array()).nullish(),applied:Ee.boolean().nullish(),appliedAt:Ee.coerce.date().nullish()}),km=Fc.extend({steps:Ae.array()});import{isValidCron as wC}from"cron-validator";import{z as oe}from"zod";import{z as Uc}from"zod";var zn=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r))(zn||{});var cs=Uc.object({width:Uc.number().min(200).max(1e4),height:Uc.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}},fU=Object.keys(_m);var Gt=_m["Desktop Large"],Ao="en-us",Io="America/Los_Angeles";var Po={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,ds=Pr.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(),longitude:oe.coerce.number()}).optional(),disableJavaScript:oe.boolean().optional(),locale:oe.string().optional(),timezone:oe.enum(Dm).optional(),colorScheme:oe.enum(["light","dark"]).optional()}),Um=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],vC=oe.object({disableAICaching:oe.boolean().optional(),failureRecovery:oe.boolean().optional().describe("undefined means inherit org settings")});var TC=oe.object({viewport:cs.optional()}),Lo=TC.merge(vC).merge(ds),Oo=oe.object({cron:oe.string().refine(n=>wC(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()}),Mo=oe.object({onSuccess:oe.boolean().default(!1),failureMessage:oe.string().optional(),onFailure:oe.boolean().default(!0),successMessage:oe.string().optional()}),xC=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")}),ps=xC.array(),EC=oe.object({name:oe.string(),value:oe.string()}),Bm=EC.array(),us=oe.object({name:oe.string(),default:oe.boolean().optional(),fixtures:Lm.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||{}),ms=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(ms||{});var We=G.string().pipe(G.coerce.date()).or(G.date()),Vi=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(ms).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:ns.nullish(),testFragments:G.array(Fc).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"}),CC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},hs=Vi.pick({...CC,test:!0}),zm=Vi.omit({failureReason:!0,failureDetails:!0,test:!0}),Bc=Vi.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:Lo.nullish()}).nullish()}).merge(Dc),Hm=n=>n.includes("PASSED")&&n.includes("FAILED");var RC=qi.object({id:qi.string().uuid(),startedAt:We.or(qi.null()),finishedAt:We.or(qi.null()),status:qi.nativeEnum(ie)}).merge(as),UU=RC.array();var Ki=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Ki||{});import{z as qe}from"zod";var AC=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=AC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:hs.array()});import{z as Xe}from"zod";var IC=Xe.object({type:Xe.literal("TARGETING"),name:Xe.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:Ku.array(),pageState:Xe.string().optional(),targetSource:Xe.nativeEnum(er).optional(),targetUpdateTime:Xe.string().optional()}),PC=Xe.object({type:Xe.literal("AI_LOCATION"),matched:Xe.boolean(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional(),thoughts:Xe.string().optional()}),LC=Xe.object({type:Xe.literal("ASSERTION"),relevantElementsSerialized:Xe.string().array().optional(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional()}),jm=Xe.discriminatedUnion("type",[IC,PC,LC]);function gs(){return{details:[]}}import{z as Fe}from"zod";var OC=Fe.object({id:Fe.string(),name:Fe.string()}),ZU=OC.merge(Fe.object({createdAt:We,createdBy:Fe.string(),schedule:Oo,notification:Mo,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:Vi.array()}),QU=Gm.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),Wm=Gm.extend({runs:hs.array()});import{z as Vt}from"zod";import{cloneDeep as rB}from"lodash-es";import{z as ue}from"zod";var lB=ue.object({thoughts:ue.string(),subGoals:ue.object({instruction:ue.string()}).array()}),cB=ue.object({thoughts:ue.string(),newPlanMarkdown:ue.string()}),dB=ue.object({thoughts:ue.string(),correct:ue.boolean(),failedActionIndex:ue.number().optional()}),MC=ue.object({type:ue.literal("PLANNING"),beforePlan:ue.string(),goalDecision:ue.string(),thoughts:ue.string()}),NC=ue.object({type:ue.literal("RUNNING"),stepDisplayName:ue.string(),status:ue.nativeEnum(xe),results:At.array()}),kC=ue.object({type:ue.literal("REVISING"),beforePlan:ue.string(),afterPlan:ue.string(),errString:ue.string(),diffs:ue.string(),thoughts:ue.string()}),_C=ue.object({type:ue.literal("SYSTEM"),message:ue.string()}),DC=ue.discriminatedUnion("type",[MC,NC,kC,_C]),Vm=DC.array();var gB=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=_.object({disableCache:_.boolean().optional(),loggerTags:_.record(_.string(),_.string()).optional(),langfuseSessionId:_.string().optional(),agentConfigVersion:_.string().optional()}),FC=_.object({screenshotBase64AfterCommand:_.string(),urlAfterCommand:_.string(),serializedCommand:_.string(),elementInteracted:_.string().optional(),thoughts:_.string().optional()}),qm=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),source:qu.optional().catch(void 0)}),Km=_.object({target:_.string().or(_.number()),browserState:_.string().optional(),screenshot:_.string().optional(),boundingBox:_.object({x:_.number(),y:_.number(),height:_.number(),width:_.number()}).optional()}),Ym=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string().optional(),returnSchema:_.string().optional()}),Jm=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),url:_.string(),contextChoice:ac.optional()}),Xm=_.object({command:bo}),zc=_.object({goal:_.string(),browserState:_.string(),startingScreenshot:_.string().optional(),screenshot:_.string(),url:_.string(),history:FC.array(),actionHint:_.string().optional(),lastError:_.string().optional()}),Zm=_.object({results:is.array(),errorMessage:_.string(),errorStack:_.string().optional()}),Qm=_.object({results:is.array(),goal:_.string(),errorMessage:_.string()}),eh=_.object({failedResults:is.array(),nextStepsSerialized:_.string().array(),currentUrl:_.string(),currentPageState:_.string(),currentScreenshot:_.string()}),_B=_.object({description:_.string(),type:_.union([_.literal("locator"),_.literal("assertion"),_.literal("ai-action")]),excerpt:_.string()});import{z as Yi}from"zod";var UB=Yi.object({goal:Yi.string()}),th=Yi.object({keywords:Yi.array(Yi.string())});import{z as yt}from"zod";var Hc=yt.object({content:yt.string(),ids:yt.string().array(),tokenLength:yt.number()}),UC=yt.object({chunks:Hc.array()}),HB=yt.object({ids:yt.string().array(),score:yt.number(),tokenLength:yt.number()}),$B=UC.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 $c}from"zod";var jc=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))(jc||{}),WB=$c.nativeEnum(jc),BC=$c.enum(["v1","v2"]),VB=BC.or($c.string().describe("for people with special configurations"));var oh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as Mr}from"zod";var ih=Mr.object({id:Mr.string().uuid(),skipped:Mr.boolean().optional(),envKey:Mr.string().optional().describe("key in the environment to save the result of this step to")}),Gc=ih.merge(Fa).extend({type:Mr.literal("REQUEST")}),Wc=ih.merge(Ua).extend({type:Mr.literal("JAVASCRIPT")}),Vc=Mr.discriminatedUnion("type",[Wc,Gc]);import{z as Kt}from"zod";import{z as Nr}from"zod";var zC=/^[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 fs=Nr.string().min(1).max(255).superRefine((n,e)=>{try{No(n)}catch(t){return e.addIssue({code:Nr.ZodIssueCode.custom,message:t.message,fatal:!0}),Nr.NEVER}});function No(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(zC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Ss=Nr.preprocess(n=>n===null?"":n,Nr.union([Nr.string().url(),Nr.literal("")])).optional();var ah=Kt.object({id:Kt.string(),name:fs,description:Kt.string().optional().nullish(),baseUrl:Ss.nullish(),schemaVersion:Kt.string(),advanced:Kt.unknown().optional(),retries:Kt.number(),envs:Kt.array(us).nullish(),parameters:ps.nullish()}),HC=Kt.object({createdAt:Kt.coerce.date(),updatedAt:Kt.coerce.date(),schedule:Oo.nullish(),notification:Mo.nullish(),createdBy:Kt.string(),organizationId:Kt.string()}),$C=ah.merge(HC),m1=$C.extend({steps:Vc.array()}),h1=ah.extend({steps:Vc.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()}),GC=sh.merge(Wc).extend({type:It.literal("JAVASCRIPT")}),WC=sh.merge(Gc).extend({type:It.literal("REQUEST")}),VC=It.discriminatedUnion("type",[GC,WC]),lh=It.object({startedAt:It.coerce.date(),finishedAt:It.coerce.date().nullish(),status:It.nativeEnum(ie),results:VC.array(),failureReason:It.string().nullish(),failureDetails:ns.nullish()});import{z as Pt}from"zod";var qC=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()}),x1=qC.pick({status:!0,startedAt:!0,finishedAt:!0});var Ji=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Ji||{}),ch=3;function KC(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function Xi(n){if(!KC(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 Zi(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 ko=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function qc(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as YC,splitCookiesString as JC}from"set-cookie-parser";import{z as he}from"zod";var Kc=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 ys(n,e){let t=[],r=JC(n);for(let o of r){let i=YC(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=Kc.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 XC=he.object({origin:he.string(),localStorage:he.array(he.object({name:he.string(),value:he.string()}))}),ZC=he.object({entries:he.record(he.string(),he.array(he.tuple([he.unknown(),he.unknown()]))),version:he.number().optional()}),bs=he.object({cookies:Kc.array().optional(),origins:XC.array().optional(),idb:he.record(he.string(),ZC).optional().describe("key is db name")});function ws(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=Kc.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 W1=new Set(Object.values(De));var QC={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"},V1={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:[]},q1={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 X1}from"@faker-js/faker";import{z as W}from"zod";var dh=55555,tz=W.object({body:W.string(),to:W.string(),from:W.string()}),nz=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()}),rz=W.object({to:W.string(),from:W.string(),subject:W.string(),body:W.string()}),oz=W.object({inbox:W.string(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),timeout:W.number().optional(),trimWhitespace:W.boolean().optional()}),iz=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()}),az=W.object({id:W.string().optional(),orgId:W.string(),momenticLambdaAuthHash:W.string(),code:W.string(),fragment:W.boolean(),state:Wi,timeoutMs:W.number().optional()}),or=15e3;import*as pt from"zod";Te(pt);var eR=pt.object({url:pt.string(),lineNumber:pt.number(),columnNumber:pt.number()}).openapi({ref:"CodeLocation"}),vs=pt.object({timestamp:pt.number(),text:pt.string(),type:pt.string(),tabIndex:pt.number(),args:pt.unknown().array().optional(),url:pt.string().optional(),location:eR.optional()}).openapi({ref:"ConsoleLog"}),uh=vs.array(),tR=uh.array();import*as Jc from"zod";import{z as I}from"zod";var nR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),rR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),oR=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:oR,comment:I.string().optional()}),iR=I.array(hh),aR=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(aR),sR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),fh=I.array(sR),lR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),cR=I.array(lR),dR=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),pR=I.array(dR),uR=I.object({mimeType:I.string(),params:pR,text:I.string(),comment:I.string().optional()}),mR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:gh,headers:fh,queryString:cR,postData:uR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),hR=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()}),gR=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:gh,headers:fh,content:hR,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()}),fR=I.object({beforeRequest:mh.optional(),afterRequest:mh.optional(),comment:I.string().optional()}),SR=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:mR,response:gR.optional(),cache:fR.optional(),timings:SR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),yR=I.array(Sh),bR=I.object({version:I.string().default("1.1"),creator:nR.optional(),browser:rR.optional(),pages:iR.optional(),entries:yR,comment:I.string().optional()}),wR=I.object({log:bR}),yh=I.record(I.string(),hh),bh=I.record(I.string(),Sh);function Yc(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(Jc);var vR=Jc.object({logsPerPage:vs.array().array(),harPages:yh.optional(),harEntries:bh.optional()}).openapi({ref:"DebugData"});var kr=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 Ts=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 Xc(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 Qi(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 _r=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as TR}from"lodash-es";import{z as En}from"zod";var Dt=(p=>(p.AutoExpandIframes="auto_expand_iframes",p.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",p.FakerConstantSeed="faker_constant_seed",p.ShowZeroOpacityElements="show_zero_opacity_elements",p.GlobalLocatorRedirect="global_locator_redirect",p.IconKnowledgeBase="icon_knowledge_base",p.MiniModelInitialAssertion="mini_model_initial_assertion",p.MiniModelInitialLocator="mini_model_initial_locator",p.ShowTestPlans="show_test_plans",p.RagV2="rag_v2",p.VisualActions="visual_actions",p))(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))]),ea=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=TR(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")}},Kz=new ea({},{});var Zc={".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(Zc);import*as Eh from"zod";var Zz=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 tH=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:fs,baseUrl:Ss,description:Ke.string().optional().nullish(),schemaVersion:Ke.string(),advanced:Lo,retries:Ke.number(),envs:Ke.array(us).nullish(),parameters:ps.nullish(),disabled:Ke.boolean().optional(),labels:Ke.array(Ke.string()).optional().catch([])}),lH=bt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),xR=Ke.object({labels:Ke.array(Ke.string()).optional(),outputs:Bm.nullish()}),Yt=bt.merge(xR),ER=Ke.object({createdAt:Ke.coerce.date(),updatedAt:Ke.coerce.date(),updatedBy:Ke.string().nullable(),schedule:Oo,notification:Mo,createdBy:Ke.string(),organizationId:Ke.string(),folderId:Ke.string().nullable().optional()}),CR=bt.merge(ER),cH=CR.merge(To),ta=bt.merge(To),dH=bt.merge(Ar);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()}),yH=V.array(Ch.extend({id:V.string(),name:V.string(),description:V.string().optional(),labels:V.string().array().optional()})),bH=V.array(Ch.extend({id:V.string(),name:V.string(),description:V.string().optional(),content:fc})),wH=ta.merge(Yt),Rh=V.object({schemaVersion:V.string(),stepLists:To}),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:cs.optional(),folderPath:V.string().optional()}),vH=ta.merge(V.object({relativeFilePath:V.string().describe("relative to project root")})),Ph=V.object({name:V.string()}),TH=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 xH=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")}),EH=V.string().array(),CH=V.object({message:V.string(),newRelativeTestPath:V.string().optional()});var xs=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],kh=xs.map(n=>`**/${n}/**`);import Cn from"chalk";var RR=["app","version","env","namespace","host"];function Ue(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!RR.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var Qc=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 Qc(1,{}),Dr={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Dr,flush:()=>{},bindings:()=>({})},Es={},Fr=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...a)=>{let s=Es[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},Es[e]=s),s.totalCount++,s.count<t&&(s.count++,n.debug(o,i,...a)),s.timer=setTimeout(()=>{let l=Es[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete Es[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:uc.nullish()}),UH=_h.extend({steps:Ze.lazy(()=>ye.array())}),Dh=5*60*1e3,ed=Ct.merge(_h.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as HH}from"date-fns-tz";import{z as Be}from"zod";var td=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()}),WH=Be.object({ai:td.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:Mc.optional()}),VH=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",a$=E.object({error:E.boolean(),reason:E.string(),message:E.string()}),s$=qt.merge(zc),Gh=Ha,l$=qt.merge(zc);var c$=qt.merge(Jm).extend({useConsensus:E.boolean().optional(),attemptNumber:E.number().optional()}),nd=Iu,d$=qt.merge(Xm),Wh=ju,p$=qt.merge(qm),Vh=$u,u$=qt.merge(Km),qh=Hu,m$=qt.merge(Ym);var h$=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()}),Yh=ta,Jh=E.string().array(),g$=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")})]),Xh=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"))}),AR=E.object({test:E.string().describe("test YAML"),modules:E.record(E.string().describe("moduleId"),E.string().describe("module YAML"))}),f$=AR.array(),S$=E.object({testId:E.string(),schemaVersion:E.string()}).merge(Ar),y$=E.object({entries:E.array(bc),testId:E.string()}),b$=E.object({testId:E.string(),uniqueKeys:E.string().array()}),w$=E.object({steps:E.array(E.record(E.unknown())),testId:E.string(),schemaVersion:E.string(),organizationId:E.string()}),Zh=zu,Qh=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()}),eg=E.object({id:E.string()}),tg=E.object({status:E.nativeEnum(ie),updatedAt:E.coerce.date().optional(),finishedAt:E.coerce.date().optional()}),ng=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(ms).optional()}),rg=E.object({id:E.string()}),IR=Bc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),og=IR.array(),ig=Bc.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(),ag=E.object({id:E.string()}),sg=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()}),v$=E.object({screenshot:E.string()}),lg=E.object({key:E.string()}),cg=E.object({orgId:E.string(),userId:E.string()}),dg=E.array(es),pg=E.record(E.string(),E.union([E.string(),E.boolean()])),T$=E.object({paths:E.string().array(),env:E.string().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional()}),ug=E.object({suiteRunIds:E.string().array(),runGroupIds:E.string().array()}),x$=E.object({suiteRunIds:E.string().array()}),mg=Wm.array(),E$=E.object({runGroupIds:E.string().array()}),_o=E.object({uploadUrl:E.string()}),C$=qt.merge(Zm),R$=qt.merge(eh),A$=qt.merge(Qm),PR=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()}),LR=E.object({transactionId:E.string(),timestamp:E.string(),event:E.nativeEnum(Ji),properties:PR}),I$=LR.array(),hg=km.omit({steps:!0}).extend({steps:E.array(E.record(E.string(),E.unknown())).describe("unparsed ResolvedStep[]")}),P$=E.object({limit:E.number().max(10).optional(),afterTime:E.number().optional()}),gg=zm.array(),L$=E.object({applied:E.boolean().optional(),appliedAt:E.coerce.date().optional()}),O$=qt.extend({chunks:Hc.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()}),fg=_o.extend({id:E.string()}),Sg=E.object({runGroupId:E.string()});import{z as Ie}from"zod";var yg=Ie.object({orgId:Ie.string(),cacheKeys:Ie.string().array()}),k$=Ie.object({keyParams:yg,clientMetadata:Ie.string(),lockAcquisitionTimeoutMs:Ie.number().optional()}),bg=Ie.object({acquired:Ie.boolean(),acquiredByMetadata:Ie.string(),keyPrefix:Ie.string()}),_$=Ie.object({keyPrefix:Ie.string(),result:Ie.string(),ttlMs:Ie.number()}),D$=Ie.union([Ie.object({keyPrefix:Ie.string()}),yg]),OR=Ie.object({remainingTtlMs:Ie.number(),value:Ie.string().nullish()}),F$=Ie.object({results:Ie.record(Ie.string(),OR),activeLocks:Ie.string().array()}),wg=0,vg=5*60*1e3;import{z as cn}from"zod";var Tg="test",xg="module",Lt=(t=>(t.TEST=`${Tg}.yaml`,t.MODULE=`${xg}.yaml`,t))(Lt||{}),Ce=(t=>(t.TEST=`momentic/${Tg}`,t.MODULE=`momentic/${xg}`,t))(Ce||{}),G$=bt.merge(Ar),rd=Ct.extend({steps:cn.array(cn.record(cn.string(),cn.unknown())),schemaVersion:cn.string()}),W$=rd.extend({fileType:cn.literal(Ce.MODULE)}),V$=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 MR=it.object({version:it.string(),json:it.record(it.unknown()),hash:it.string()}),Eg=it.record(it.unknown()),J$=it.object({newSvgs:it.array(MR),metadata:Eg.optional()}),NR=it.object({version:it.string(),json:it.record(it.unknown()).nullish(),hash:it.string(),description:it.string().nullish(),metadata:Eg.nullish()}),Cg=it.record(it.string().describe("icon hash"),NR);import{validator as tj}from"@exodus/schemasafe";var Rg=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as mj}from"zod";import{z as Ye}from"zod";var fj=Ye.object({repositoriesIndexed:Ye.boolean(),indexingInProgress:Ye.boolean(),indexesOutdated:Ye.boolean()}),Ag=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(Ag||{}),Ig=(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))(Ig||{}),Sj=Ye.object({name:Ye.string(),status:Ye.nativeEnum(Ag),conclusion:Ye.nativeEnum(Ig).nullable()}),od=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 id=Ne.object({assertion:Ne.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),kR=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:id.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.")}),Pg=kR.extend({subSteps:Ne.lazy(()=>Pg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),Lg=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")}),Og=Lg.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)}),vj=Og.extend({testGenRuns:Ne.tuple([]).or(Ne.tuple([Ne.object({id:Ne.string(),startedAt:Ne.coerce.date(),status:Ne.nativeEnum(ie)})]))}),Mg=Ne.object({preConditions:id.array().nullish().transform(n=>n??[]),postConditions:id.array().nullish().transform(n=>n??[]),steps:Pg.array().nullish().transform(n=>n??[])}),Tj=Og.extend({plan:Mg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),_R=Lg.extend({plan:Mg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),xj=_R.array().nullish().transform(n=>n??[]);var Ij=90*24*60*60*1e3,Pj=14*24*60*60*1e3,Lj=7*24*60*60*1e3;import{z as ke}from"zod";var DR=ke.object({step:Ae,status:ke.nativeEnum(xe),startedAt:ke.coerce.date(),finishedAt:ke.coerce.date().optional(),healMetadata:ke.object({healType:ke.nativeEnum($i).or(ke.literal("AI")),healedAt:ke.coerce.date()}).optional(),beforeSnapshotId:ke.string().uuid().optional(),afterSnapshotId:ke.string().uuid().optional(),message:ke.string().optional()}),Fj=DR.extend({finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)}),FR=ke.object({startedAt:ke.coerce.date()}).merge(sg).merge(as),Uj=FR.extend({finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)}),UR=ig.merge(ng).extend({status:ke.nativeEnum(ie),startedAt:ke.coerce.date(),attempts:ke.number()}),Bj=UR.extend({finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)}),BR=Qh.merge(tg).extend({startedAt:ke.coerce.date(),cliVersion:ke.string()}),ad=BR.extend({updatedAt:ke.coerce.date().optional().transform(n=>n??new Date),finishedAt:ke.coerce.date().optional().transform(n=>n??new Date)});import zR from"semver";import{z as HR}from"zod";var jj=HR.string().refine(n=>zR.valid(n),{message:"must be a valid semver string"});var Cs=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};function sd(n){let e={parentChain:[]};return Rs(n,e),e}function Rs(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||Rs({...n,steps:l.steps},e)&&i)return!0;if(Rs({...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),Rs({...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 Ng(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 sd({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function kg(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?As(r,e):typeof r=="object"&&kg(r,e))}}function As(n,e){for(let t of n)t&&(Array.isArray(t)?As(t,e):typeof t=="object"&&kg(t,e))}import{cloneDeep as _g}from"lodash-es";import{v4 as ld}from"uuid";async function Jt(n){let e=new Map,t=new Set,r=_g(n.stepLists.steps),o=await Ur({...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=_g(n.stepLists[a]);if(!s)continue;let l=await Ur({...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 Ur({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?ld():d.id,d.type){case"PRESET_ACTION":{let u=d.command;u.id=l?ld():u.id,Fg(u),"cache"in u&&u.cache&&(r&&(c.cachesToSave=c.cachesToSave.concat(Dg({id:u.id,orgId:r.orgId,testId:r.testId,value:Er.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?ld():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 Ur({...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 Ur({...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 Ur({...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 Ur({...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 Ur({...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=Er.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=GR(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(!lc.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 Ug(n,e){return e?`${e}:${n}`:n}function GR(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 Dg(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:Ug(n.id,a),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:Ug(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function Fg(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 Bg(n){let e=new Set;return As(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 zg(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 Is({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 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"},cd={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},dd={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function WR(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?dd[n.condition]:cd[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 VW={CONTENT:"The page"};function VR(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 pd(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 qR(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 Br(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=VR(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)} ${WR(n.assertion)}`;case"PAGE_CHECK":return`Check the page ${qR(n.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${pd(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 Hg(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 KR}from"lodash-es";import{cloneDeep as JW,unset as XW}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 Br(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,jg=3e6,YR="[FAILED]";async function Gg(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 Ps(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?zr(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=`${YR} ${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 Gg(n,e,p.afterScreenshot,p.afterSnapshot),i&&(m.beforeScreenshot=await Gg(n,e,p.beforeScreenshot,p.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function zr(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 qg(n,e){try{if(!n)return n;if(typeof n=="string")return ze(n,3e4);if(typeof n=="object"){let{jsonString:t}=Eo(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 ud(n,e){for(let t=0;t<n.length;t++){let r=n[t];try{if(r.data){let{jsonString:o}=Eo(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":Wg(r);break;case"CONDITIONAL":r.assertion&&Wg(r.assertion),ud(r.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"IFRAME":case"MODULE":case"SECTION":{ud(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 Wg(n){let e=n.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Vg(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 Ls(n,e){let t=KR(n);if(ud(t,e),t.length>$g)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,$g);let r=Vg(t,e);if(r.length>jg)for(e.error({serializedLength:r.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");r.length>jg;)t.pop(),r=Vg(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 fV}from"lodash-es";var JR=/^(?!.*\S+\s+\S+).*$/,XR=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,ZR=/style="([^"]*)/g,QR=/data-[\w-]+/g,eA=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 Kg(n){let e=eA(n),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:JR.test(t)&&XR.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:ZR.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"}:QR.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 Yg(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 Tf}from"lodash-es";import iA from"diff-lines";import Ms,{gte as aA}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 Xg={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 tA=["target","fromTarget","toTarget"];function Zg(n){for(let e of tA){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var Qg={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 Zg(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])Zg(r);return e}default:return e}})};import{v4 as nA}from"uuid";var ef={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=nA()),e;default:return e}})};import{v4 as tf}from"uuid";var nf={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??tf(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??tf()}})),delete e.commands),e;default:return e}})};var rf={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 rA}from"uuid";var of={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=rA()),e))};import{v4 as af}from"uuid";var sf={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=af())}return e.id=af(),e})};var lf={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 oA}from"uuid";var cf={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=oA()),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 df={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 pf={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&&uf(t),e})};function uf(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){uf(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 mf={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 hf={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 gf={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 ff={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 Sf={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 Os=new Set(["CLICK","TYPE","SELECT_OPTION"]),yf={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||Os.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||Os.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||Os.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||Os.has(m))&&(p.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var bf={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 wf={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 Hr=[Sf,bf,wf,yf,Jg,Xg,Qg,ef,nf,rf,of,sf,lf,cf,df,pf,mf,hf,gf,ff];if(_e!==Hr[Hr.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Hr.forEach((n,e)=>{if(!Ms.valid(n.toVersion)||!Ms.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Ms.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if(Hr[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function sA(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var na=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:a}=n,s=Hr.findIndex(d=>Ms.gt(d.toVersion,i));if(s===-1)return{steps:o,newVersion:i};let l=i;for(let d=s;d<Hr.length;d++){if(r&&aA(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let p=Hr[d],u={id:a,migration:p.name,toVersion:p.toVersion};try{o=await vf(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=iA(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 vf(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)||sA(i)&&(r[o]=await vf(i,e))}return t}async function xf({rawSteps:n,metadata:e,logger:t,callbacks:r}){Yg(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await Ns({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 Ns({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});s[l]=d}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function $r(n,e,t){let{newVersion:r,steps:o}=await na({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 Ts(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function Ns({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await $r(e,n,t),s=[];for(let l of a)s.push(await ra({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function ra({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{...Tf(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 na({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=>ra({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]=Tf(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 ra({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 ra({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 ra({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 lA(n){return typeof n=="object"&&n!==null}function Hn(n){if(Array.isArray(n))return n.map(Hn);if(lA(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=Hn(r))}),e}return n}import{cloneDeep as cA}from"lodash-es";import{stringify as Ef}from"yaml";async function Cf({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 dA({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:Ef(a),modules:o}}async function dA({originalStepLists:n,modules:e,processedModuleNames:t,createNewCacheIds:r}){let o=cA(n);Object.values(o).forEach(s=>{pA(s??[])});let{stepsToSave:i,moduleUpdates:a}=await Jt({stepLists:o,createNewCacheIds:r});for(let s of a)t.has(s.name)||(e[s.name]=uA(s),t.add(s.name));return i}function pA(n){sd({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 uA(n){let e=Ct.parse(n),t={fileType:Ce.MODULE,...e,schemaVersion:_e,steps:n.steps};return Ef(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 oa({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 jr({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 oa({promiseGenerator:n,signal:a.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(l)}}function ks(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:ks(t.steps)};e.push(ye.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:ks(o.steps)})),elseSteps:t.elseSteps?ks(t.elseSteps):void 0};e.push(Rr.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 _s(n){return ks([n])[0]}import mA from"picomatch";var Rf=(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||mA(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r},Ds=(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}},Af=n=>!n.toLowerCase().startsWith("http"),Uo=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function Gr(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 Of}from"zod";import{execSync as hA}from"child_process";function Wr(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{hA(r,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")}}import{diff as If}from"deep-object-diff";import lr from"fs";import{cloneDeep as gA}from"lodash-es";import md from"path";import{v4 as fA}from"uuid";import ia from"yaml";function Vr({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=ia.parse(a),l;if(n.name&&n.name!==s.name){let m=`${Me(n.name)}.${Lt.MODULE}`;if(l=md.join(md.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,...ed.parse(c),steps:ye.array().parse(n.steps)}),p=If(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=ia.stringify(d);lr.writeFileSync(i,u,"utf-8"),l&&lr.renameSync(i,l),Wr(l||i,r.config)}function Pf({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,...ed.parse(s),steps:a.steps}),c=If(l,a);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let d=ia.stringify(l);lr.writeFileSync(i,d,"utf-8"),Wr(i,r.config)}async function Lf({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let a=Me(n),s=md.join(o,`${a}.module.yaml`),l=fA(),{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=ia.stringify(d);return lr.writeFileSync(s,p,"utf-8"),Wr(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=ia.parse(t);try{return rd.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 hd(n,e,t,r){let o=$n(n.fullFilePath,t),{resolvedSteps:i}=await Ns({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]=gA(a)),a}async function Fs(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await hd(r,n,e,t)})),Array.from(Object.values(t))}async function Mf({test:n,name:e,folder:t}){let r=await Cf({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=qr.join(t,i);return pn.writeFileSync(a,r.test,"utf-8"),a}function gd(n,e,t){let r=qr.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=qr.join(qr.dirname(n),u),s=qr.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),Wr(r,t.config),{newRelativeTestPath:a}}function jn({relativeTestPath:n,steps:e,schemaVersion:t,project:r,forceSaveOnNoDiffs:o}){let i=qr.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(Of.undefined()).parse(e.beforeSteps),steps:ye.array().parse(e.steps),afterSteps:ye.array().or(Of.undefined()).parse(e.afterSteps)}),d=SA(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}`),Wr(i,r.config)}function Us(n,e){let t=qr.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 Kr(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 aa(n,e,t){let r=Kr(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 xf({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 yA from"@dotenvx/dotenvx";import bA from"fs";import Nf from"path";function _f(n,e){return(n.config.environments??[]).map(t=>sa(t.name,n,e))}function kf(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 sa(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]:kf(r.baseUrl)};if(r.envVariables){let a={};for(let[s,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=kf(l);c&&(a[s]=c)}else{let c=l.fromFile,d;try{d=bA.readFileSync(Nf.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=yA.config({path:Nf.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 XI,readdirSync as ZI,writeFileSync as QI}from"fs";var nS=LT(Kf(),1);var ca=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var AA={"[: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]},da=n=>n.replace(/[[\]\\-]/g,"\\$&"),IA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Yf=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(AA))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(da(p)+"-"+da(g)):g===p&&r.push(da(g)),p="",i++;continue}if(n.startsWith("-]",i+1)){r.push(da(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){p=g,i+=2;continue}r.push(da(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[IA(g),!1,d-t,!1]}let u="["+(c?"^":"")+Yf(r)+"]",m="["+(c?"":"^")+Yf(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 PA=new Set(["!","?","+","*","@"]),Xf=n=>PA.has(n),LA="(?!(?:^|/)\\.\\.?(?:$|/))",Bs="(?!\\.)",OA=new Set(["[","."]),MA=new Set(["..","."]),NA=new Set("().*{}+?[]^$\\!"),kA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),yd="[^/]",Zf=yd+"*?",Qf=yd+"+?",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&&Xf(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(Xf(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&&MA.has(this.#r[0]))){let h=OA,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?LA:f?Bs:""}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||!Bs?"":this.#m(!0);a===i&&(a=""),a&&(i=`(?:${i})(?:${a})*?`);let s="";if(this.type==="!"&&this.#o)s=(this.isStart()&&!t?Bs:"")+Qf;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?Bs:"")+Zf+")":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+=(NA.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+=Qf:i+=Zf,t=!0;continue}if(l==="?"){i+=yd,t=!0;continue}i+=kA(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={})=>(ca(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Ft(e,t).match(n)),_A=/^\*+([^+@!?\*\[\(]*)$/,DA=n=>e=>!e.startsWith(".")&&e.endsWith(n),FA=n=>e=>e.endsWith(n),UA=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),BA=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),zA=/^\*+\.\*+$/,HA=n=>!n.startsWith(".")&&n.includes("."),$A=n=>n!=="."&&n!==".."&&n.includes("."),jA=/^\.\*+$/,GA=n=>n!=="."&&n!==".."&&n.startsWith("."),WA=/^\*+$/,VA=n=>n.length!==0&&!n.startsWith("."),qA=n=>n.length!==0&&n!=="."&&n!=="..",KA=/^\?+([^+@!?\*\[\(]*)?$/,YA=([n,e=""])=>{let t=rS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},JA=([n,e=""])=>{let t=oS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},XA=([n,e=""])=>{let t=oS([n]);return e?r=>t(r)&&r.endsWith(e):t},ZA=([n,e=""])=>{let t=rS([n]);return e?r=>t(r)&&r.endsWith(e):t},rS=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},oS=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},iS=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",eS={win32:{sep:"\\"},posix:{sep:"/"}},QA=iS==="win32"?eS.win32.sep:eS.posix.sep;wt.sep=QA;var at=Symbol("globstar **");wt.GLOBSTAR=at;var eI="[^/]",tI=eI+"*?",nI="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",rI="(?:(?!(?:\\/|^)\\.).)*?",oI=(n,e={})=>t=>wt(t,n,e);wt.filter=oI;var Xt=(n,e={})=>Object.assign({},n,e),iI=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=iI;var aS=(n,e={})=>(ca(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,nS.default)(n));wt.braceExpand=aS;var aI=(n,e={})=>new Ft(n,e).makeRe();wt.makeRe=aI;var sI=(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=sI;var tS=/[?*]|[+@!]\(.*?\)|\[|\]/,lI=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={}){ca(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||iS,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]==="?"||!tS.test(i[2]))&&!tS.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 aS(this.pattern,this.options)}parse(e){ca(e);let t=this.options;if(e==="**")return at;if(e==="")return"";let r,o=null;(r=e.match(WA))?o=t.dot?qA:VA:(r=e.match(_A))?o=(t.nocase?t.dot?BA:UA:t.dot?FA:DA)(r[1]):(r=e.match(KA))?o=(t.nocase?t.dot?JA:YA:t.dot?XA:ZA)(r):(r=e.match(zA))?o=t.dot?$A:HA:(r=e.match(jA))&&(o=GA);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?tI:t.dot?nI:rI,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"?lI(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 zI}from"node:url";var $o=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,lS=new Set,bd=typeof process=="object"&&process?process:{},cS=(n,e,t,r)=>{typeof bd.emitWarning=="function"?bd.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},zs=globalThis.AbortController,sS=globalThis.AbortSignal;if(typeof zs>"u"){sS=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},zs=class{constructor(){e()}signal=new sS;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=bd.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{n&&(n=!1,cS("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 cI=n=>!lS.has(n),GK=Symbol("type"),cr=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),dS=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)}},wd=class n{heap;length;static#e=!1;static create(e){let t=dS(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]}},pa=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?dS(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=wd.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";cI(N)&&(lS.add(N),cS("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 zs,{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 zs}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 wI,win32 as Ld}from"node:path";import{fileURLToPath as vI}from"node:url";import{lstatSync as TI,readdir as xI,readdirSync as EI,readlinkSync as CI,realpathSync as RI}from"fs";import*as AI from"node:fs";import{lstat as PI,readdir as LI,readlink as OI,realpath as MI}from"node:fs/promises";import{EventEmitter as Ad}from"node:events";import gS from"node:stream";import{StringDecoder as dI}from"node:string_decoder";var pS=typeof process=="object"&&process?process:{stdout:null,stderr:null},pI=n=>!!n&&typeof n=="object"&&(n instanceof pr||n instanceof gS||uI(n)||mI(n)),uI=n=>!!n&&typeof n=="object"&&n instanceof Ad&&typeof n.pipe=="function"&&n.pipe!==gS.Writable.prototype.pipe,mI=n=>!!n&&typeof n=="object"&&n instanceof Ad&&typeof n.write=="function"&&typeof n.end=="function",Gn=Symbol("EOF"),Wn=Symbol("maybeEmitEnd"),dr=Symbol("emittedEnd"),Hs=Symbol("emittingEnd"),ua=Symbol("emittedError"),$s=Symbol("closed"),uS=Symbol("read"),js=Symbol("flush"),mS=Symbol("flushChunk"),mn=Symbol("encoding"),Go=Symbol("decoder"),Qe=Symbol("flowing"),ma=Symbol("paused"),Wo=Symbol("resume"),et=Symbol("buffer"),vt=Symbol("pipes"),tt=Symbol("bufferLength"),vd=Symbol("bufferPush"),Gs=Symbol("bufferShift"),ut=Symbol("objectMode"),He=Symbol("destroyed"),Td=Symbol("error"),xd=Symbol("emitData"),hS=Symbol("emitEnd"),Ed=Symbol("emitEnd2"),Rn=Symbol("async"),Cd=Symbol("abort"),Ws=Symbol("aborted"),ha=Symbol("signal"),Yr=Symbol("dataListeners"),Ut=Symbol("discarded"),ga=n=>Promise.resolve().then(n),hI=n=>n(),gI=n=>n==="end"||n==="finish"||n==="prefinish",fI=n=>n instanceof ArrayBuffer||!!n&&typeof n=="object"&&n.constructor&&n.constructor.name==="ArrayBuffer"&&n.byteLength>=0,SI=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),Vs=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()}},Rd=class extends Vs{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)}},yI=n=>!!n.objectMode,bI=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",pr=class extends Ad{[Qe]=!1;[ma]=!1;[vt]=[];[et]=[];[ut];[mn];[Rn];[Go];[Gn]=!1;[dr]=!1;[Hs]=!1;[$s]=!1;[ua]=null;[tt]=0;[He]=!1;[ha];[Ws]=!1;[Yr]=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");yI(t)?(this[ut]=!0,this[mn]=null):bI(t)?(this[mn]=t.encoding,this[ut]=!1):(this[ut]=!1,this[mn]=null),this[Rn]=!!t.async,this[Go]=this[mn]?new dI(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[ha]=r,r.aborted?this[Cd]():r.addEventListener("abort",()=>this[Cd]()))}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}[Cd](){this[Ws]=!0,this.emit("abort",this[ha]?.reason),this.destroy(this[ha]?.reason)}get aborted(){return this[Ws]}set aborted(e){}write(e,t,r){if(this[Ws])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]?ga:hI;if(!this[ut]&&!Buffer.isBuffer(e)){if(SI(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(fI(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[js](!0),this[Qe]?this.emit("data",e):this[vd](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[js](!0),this[Qe]?this.emit("data",e):this[vd](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[uS](e||null,this[et][0]);return this[Wn](),t}[uS](e,t){if(this[ut])this[Gs]();else{let r=t;e===r.length||e===null?this[Gs]():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[ma])&&this[Wn](),this}[Wo](){this[He]||(!this[Yr]&&!this[vt].length&&(this[Ut]=!0),this[ma]=!1,this[Qe]=!0,this.emit("resume"),this[et].length?this[js]():this[Gn]?this[Wn]():this.emit("drain"))}resume(){return this[Wo]()}pause(){this[Qe]=!1,this[ma]=!0,this[Ut]=!1}get destroyed(){return this[He]}get flowing(){return this[Qe]}get paused(){return this[ma]}[vd](e){this[ut]?this[tt]+=1:this[tt]+=e.length,this[et].push(e)}[Gs](){return this[ut]?this[tt]-=1:this[tt]-=this[et][0].length,this[et].shift()}[js](e=!1){do;while(this[mS](this[Gs]())&&this[et].length);!e&&!this[et].length&&!this[Gn]&&this.emit("drain")}[mS](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===pS.stdout||e===pS.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[vt].push(t.proxyErrors?new Rd(this,e,t):new Vs(this,e,t)),this[Rn]?ga(()=>this[Wo]()):this[Wo]()),e}unpipe(e){let t=this[vt].find(r=>r.dest===e);t&&(this[vt].length===1?(this[Qe]&&this[Yr]===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[Yr]++,!this[vt].length&&!this[Qe]&&this[Wo]();else if(e==="readable"&&this[tt]!==0)super.emit("readable");else if(gI(e)&&this[dr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[ua]){let o=t;this[Rn]?ga(()=>o.call(this,this[ua])):o.call(this,this[ua])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Yr]=this.listeners("data").length,this[Yr]===0&&!this[Ut]&&!this[vt].length&&(this[Qe]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Yr]=0,!this[Ut]&&!this[vt].length&&(this[Qe]=!1)),t}get emittedEnd(){return this[dr]}[Wn](){!this[Hs]&&!this[dr]&&!this[He]&&this[et].length===0&&this[Gn]&&(this[Hs]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[$s]&&this.emit("close"),this[Hs]=!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]?(ga(()=>this[xd](r)),!0):this[xd](r);if(e==="end")return this[hS]();if(e==="close"){if(this[$s]=!0,!this[dr]&&!this[He])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[ua]=r,super.emit(Td,r);let i=!this[ha]||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}[xd](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}[hS](){return this[dr]?!1:(this[dr]=!0,this.readable=!1,this[Rn]?(ga(()=>this[Ed]()),!0):this[Ed]())}[Ed](){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(Td,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(Td,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[$s]&&t.close(),e?this.emit("error",e):this.emit(He),this}static get isStream(){return pI}};var II=RI.native,Sa={lstatSync:TI,readdir:xI,readdirSync:EI,readlinkSync:CI,realpathSync:II,promises:{lstat:PI,readdir:LI,readlink:OI,realpath:MI}},wS=n=>!n||n===Sa||n===AI?Sa:{...Sa,...n,promises:{...Sa.promises,...n.promises||{}}},vS=/^\\\\\?\\([a-z]:)\\?$/i,NI=n=>n.replace(/\//g,"\\").replace(vS,"$1\\"),kI=/[\\\/]/,Qt=0,TS=1,xS=2,An=4,ES=6,CS=8,Jr=10,RS=12,Zt=15,fa=~Zt,Id=16,fS=32,ya=64,hn=128,qs=256,Ys=512,SS=ya|hn|Ys,_I=1023,Pd=n=>n.isFile()?CS:n.isDirectory()?An:n.isSymbolicLink()?Jr:n.isCharacterDevice()?xS:n.isBlockDevice()?ES:n.isSocket()?RS:n.isFIFO()?TS:Qt,yS=new Map,ba=n=>{let e=yS.get(n);if(e)return e;let t=n.normalize("NFKD");return yS.set(n,t),t},bS=new Map,Ks=n=>{let e=bS.get(n);if(e)return e;let t=ba(n.toLowerCase());return bS.set(n,t),t},Js=class extends pa{constructor(){super({max:256})}},Od=class extends pa{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},AS=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?Ks(e):ba(e),this.#n=t&_I,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=wS(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&=~Id,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?Ks(e):ba(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)===CS}isDirectory(){return(this.#n&Zt)===An}isCharacterDevice(){return(this.#n&Zt)===xS}isBlockDevice(){return(this.#n&Zt)===ES}isFIFO(){return(this.#n&Zt)===TS}isSocket(){return(this.#n&Zt)===RS}isSymbolicLink(){return(this.#n&Jr)===Jr}lstatCached(){return this.#n&fS?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!==Jr||this.#n&qs||this.#n&hn)}calledReaddir(){return!!(this.#n&Id)}isENOENT(){return!!(this.#n&hn)}isNamed(e){return this.nocase?this.#b===Ks(e):this.#b===ba(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|=Id;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#_()}}#_(){this.#n&hn||(this.#n=(this.#n|hn)&fa,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#_()}#I(){this.#n|=Ys,this.#D()}#D(){if(this.#n&ya)return;let e=this.#n;(e&Zt)===An&&(e&=fa),this.#n=e|ya,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|=qs,e==="ENOENT"&&(t|=hn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=fa),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=Pd(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&Zt;return i!==An&&i!==Jr&&i!==Qt&&(o.#n|=ya),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?Ks(e.name):ba(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&fa|Pd(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=Pd(e);this.#n=this.#n&fa|b|fS,b!==Qt&&b!==An&&b!==Jr&&(this.#n|=ya)}#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&SS)return!1;let e=Zt&this.#n;return e===Qt||e===An||e===Jr}shouldWalk(e,t){return(this.#n&An)===An&&!(this.#n&SS)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((Ys|qs|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(!((Ys|qs|hn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[AS](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}},Xs=class n extends mt{sep="\\";splitSep=kI;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 Ld.parse(e).root}getRoot(e){if(e=NI(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(vS,"$1\\"),e===t}},Zs=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)}},Qs=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:a=Sa}={}){this.#r=wS(a),(e instanceof URL||e.startsWith("file://"))&&(e=vI(e));let s=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(s),this.#e=new Js,this.#t=new Js,this.#i=new Od(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[AS](t)}},Vo=class extends Qs{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,Ld,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return Ld.parse(e).root.toUpperCase()}newRoot(e){return new Xs(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 Qs{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,wI,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new Zs(this.rootPath,An,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},wa=class extends qo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},n3=process.platform==="win32"?Xs:Zs,IS=process.platform==="win32"?Vo:process.platform==="darwin"?wa:qo;var DI=n=>n.length>=1,FI=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(!DI(e))throw new TypeError("empty pattern list");if(!FI(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 UI=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=UI}){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 Md=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()]))}},Nd=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)])}},kd=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())}},va=class n{hasWalkedCache;matches=new Nd;subwalks=new kd;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Md}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 BI=(n,e)=>typeof n=="string"?new Yo([n],e):Array.isArray(n)?new Yo(n,e):n,el=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=BI(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 va(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 va(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()}},Ta=class extends el{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}},xa=class extends el{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 HI=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=zI(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||HI,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"?wa:t.platform?qo:IS;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 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}).walk()]}walkSync(){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}).walkSync()]}stream(){return new xa(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 xa(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 _d=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Ft(t,e).hasMagic())return!0;return!1};function tl(n,e={}){return new gn(n,e).streamSync()}function OS(n,e={}){return new gn(n,e).stream()}function Jo(n,e={}){return new gn(n,e).walkSync()}async function PS(n,e={}){return new gn(n,e).walk()}function nl(n,e={}){return new gn(n,e).iterateSync()}function MS(n,e={}){return new gn(n,e).iterate()}var $I=tl,jI=Object.assign(OS,{sync:tl}),GI=nl,WI=Object.assign(MS,{sync:nl}),VI=Object.assign(Jo,{stream:tl,iterate:nl}),LS=Object.assign(PS,{glob:PS,globSync:Jo,sync:VI,globStream:OS,stream:jI,globStreamSync:tl,streamSync:$I,globIterate:MS,iterate:WI,globIterateSync:nl,iterateSync:GI,Glob:gn,hasMagic:_d,escape:Ho,unescape:un});LS.glob=LS;import Xr,{dirname as DS}from"path";import{cwd as zd}from"process";import FS from"yaml";import{z as de}from"zod";import NS from"fs";import rl from"path";import qI from"yaml";import{z as Dd}from"zod";var kS=!1,Fd=[`**/*.${Lt.TEST}`,`**/*.${Lt.MODULE}`],Ud=Dd.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),Bd=50,KI=Dd.object({fileType:Dd.nativeEnum(Ce)});function Pe(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??Fd,o=Array.from(n.config.exclude??[]).concat(kh),i=Jo(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:Bd,nodir:!0});for(let a of i)YI(n.rootDir,a,t,e);return kS=!0,t}function YI(n,e,t,r){let o=rl.join(n,e),i;try{i=NS.readFileSync(o,"utf-8")}catch(p){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${p}`);return}let a;try{if(a=qI.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=KI.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=NS.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:rl.sep,fullPathSegments:o.split(rl.sep),fileName:rl.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 sP(n){let e=iP(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:zd(),dotRelative:!1,maxDepth:Bd,nodir:!0}),o=[];for(let i of r){let a=Xr.join(zd(),i),s=Hd(a);s&&o.push({configFilePath:a,config:s,rootDir:DS(a)})}return o}function $d(n){if(n){n=Xr.resolve(n);let t=Hd(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:Xr.dirname(n)}]}if(JI(_S)){let t=sP(_S);if(t)return t}return aP()}function Zo(n,e){let t=FS.stringify(n);QI(e,t)}import Qo from"fs";import jd from"path";import{z as Gd}from"zod";var BS="golden/visual-diff",zS="reports",HS="test-results";var lP=Gd.object({width:Gd.number(),height:Gd.number()}),ei=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=jd.join(e.rootDir,e.config.goldenFileDir??BS);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=jd.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Qo.mkdirSync(jd.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=lP.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}}isBooleanFlagEnabled(e){return this.flags[e]}getAllFlags(){return{...this.flags}}getFlagPayload(e){}async refresh(){}};import cP from"simple-git";var be=cP();function ol(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 dP(){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 pP(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 uP(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 mP(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?ol(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 hP(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?ol(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 gP(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?ol(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 fP(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?ol(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 SP(n){let e=n.config.gitProtectedBranches??[];return n.config.gitMainBranch&&e.push(n.config.gitMainBranch),{gitMainBranch:n.config.gitMainBranch,gitProtectedBranches:e}}async function yP(n,e){let t=dP();if(!t)return fP(n,e);switch(t){case"GithubActions":return pP(n);case"GitlabCI":return uP(n);case"CircleCI":return mP(n);case"Buildkite":return hP(n);case"AzureDevOps":return gP(n)}}async function bP(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 SP(t),o=await yP(n,r.gitMainBranch),i={...r,...o},a=await bP(n,e,i);return{...r,...o,...a}}import CN from"http";import{z as Vd}from"zod";var k="v1",Ea="2.3.0";var wP=9e4,vP=15e3,fn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function TP(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 Ea&&(e[Uh]=Ea),e}async sendRequest(e,t,r=3,o=wP){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||r===0)throw l;let c=1500,d=i-r,p=Math.min(c*Math.pow(2,d-1),vP);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 TP(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(`/${k}/auth/check`,{method:"GET",noLog:!0},10,5e3),{orgId:t,userId:r}=cg.parse(e);return{orgId:t,userId:r}}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${k}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return og.parse(t)}async createRunGroup(e){let t=await this.sendRequest(`/${k}/run-groups`,{method:"POST",body:e,noLog:!0},10,5e3);return eg.parse(t)}async updateRunGroup(e,t){await this.sendRequest(`/${k}/run-groups/${e}`,{method:"PATCH",body:t,noLog:!0},5,5e3)}async createRun(e){let t=await this.sendRequest(`/${k}/runs`,{method:"POST",body:e,noLog:!0},10,5e3);return rg.parse(t)}async updateRun(e,t){await this.sendRequest(`/${k}/runs/${e}`,{method:"PATCH",body:t,noLog:!0},3,5e3)}async createRunAttempt(e){let t=await this.sendRequest(`/${k}/runs/${e}/attempts`,{method:"POST",noLog:!0},10,5e3);return ag.parse(t)}async updateRunAttempt(e,t,r){await this.sendRequest(`/${k}/runs/${e}/attempts/${t}`,{method:"PATCH",body:r,noLog:!0},3,5e3)}async getTest(e){let t=await this.sendRequest(`/${k}/tests/${e}`,{method:"GET"},3,5e3);return Yh.parse(t)}async getAllTestIds(){let e=await this.sendRequest(`/${k}/tests`,{method:"GET"},3,5e3);return Jh.parse(e)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${k}/tests/export`,{method:"POST",body:e},3,3e4);return Xh.parse(t)}async updateTestWithYAML(e){await this.sendRequest(`/${k}/tests/update`,{method:"POST",body:e},3,5e3)}async updateStepCaches(e,t){await this.sendRequest(`/${k}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${k}/cache`,{method:"POST",body:e,extraHeaders:t},10,1e4);return Zh.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${k}/tests/queue`,{method:"POST",body:e},3,1e4);return Kh.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${k}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return lg.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${k}/environments`,{method:"GET"},3,5e3);return dg.parse(e)}async getEnvironment(e){let t=await this.sendRequest(`/${k}/environments/${e}`,{method:"GET"},3,5e3);return es.parse(t)}async getAllFeatureFlags(){let e=await this.sendRequest(`/${k}/auth/flags`,{method:"GET",noLog:!0},10,1e4);return pg.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${k}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return bg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${k}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${k}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${k}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${k}/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(`/${k}/suites/queue`,{method:"POST",body:e},3,5e3);return ug.parse(t)}async bulkGetSuiteStatus(e){let t={suiteRunIds:e},r=await this.sendRequest(`/${k}/suites/status`,{method:"POST",body:t,noLog:!0},3,5e3);return mg.parse(r)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${k}/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(`/${k}/cache/last-used-at`,{method:"PATCH",body:{uniqueKeys:t,testId:e},noLog:!0,extraHeaders:o},3,5e3)}catch(i){r.error({err:i},"Failed to update cache last used date")}}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${k}/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(`/${k}/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(`/${k}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return _o.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${k}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return _o.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${k}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return _o.parse(r)}async generateA11yTreeSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${k}/snapshots/${t}/a11y`,{method:"POST",noLog:!0},3,1e4);return _o.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${k}/billing/events`,{method:"POST",body:t,noLog:!0},10,5e3)}catch(r){e.error({err:r},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${k}/test-fragments/${e}`,{method:"GET",noLog:!0});return hg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${k}/test-fragments/${e}`,{method:"PATCH",body:t},3,5e3)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${k}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return gg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${k}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return fg.parse(e)}async startProcessingResultsUpload(e){let t=await this.sendRequest(`/${k}/results/uploads/${e}/process`,{method:"POST",noLog:!0},3,1e4);return Sg.parse(t)}async fetchIconKnowledgeBase(e,t){try{let r=await this.sendRequest(`/${k}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return Cg.parse(r)}catch(r){return t.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${k}/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(`/${k}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return od.parse(a)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${k}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return od.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${k}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return Vd.record(Vd.string(),Vd.string()).parse(e)}};import{randomUUID as $S}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??$S(),properties:qc({},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??$S(),properties:qc({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 xP,en as EP}from"@faker-js/faker";var ii="v1",ur=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 xP({locale:EP}),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 CP}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(`/${k}/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(`/${k}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Ea,...e},signal:t.abortSignal});return nh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${k}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return CP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${k}/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(`/${k}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return nd.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${k}/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(`/${k}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return nd.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${k}/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(`/${k}/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(`/${k}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return vc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${k}/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(`/${k}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return wc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${k}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Nc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${k}/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(`/${k}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Wu.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${k}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Vu.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${k}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Ru.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(`/${k}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Au.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 Cs: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 tN}from"socket.io";import{cloneDeep as RP}from"lodash-es";var AP={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:RP(AP)}),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 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 mr={};var IP=n=>()=>{let{sessionId:e}=n.metadata;mr[e]?.abort?.abort()},GS={event:"cancelApiTest",createHandler:IP};import{CookieJar as qP}from"tough-cookie";import{randomUUID as DP}from"crypto";import{faker as PP}from"@faker-js/faker";import LP from"assert";import OP from"axios";import MP from"moment";import*as NP from"otpauth";import kP from"pg";var ci=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var WS=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(WS(p)),s=()=>{c(WS(p))},p.addEventListener("abort",s)}if(t===Number.POSITIVE_INFINITY){n.then(l,c);return}let d=new ci;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)})}async function VS(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=ys(r,e);t.push(...o)}),t}var _P=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 _P("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(OP,MP,i.fakerInstance??PP,LP,kP,d,p,NP,VS,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 ci?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 KS({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:a=or}){let s=DP(),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 FP,randomUUID as UP}from"crypto";import BP from"fetch-retry";var zP=BP(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}}),YS=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,JS=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function XS({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=or,retries:i=2,signal:a,logger:s}){if(!YS)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!JS)throw new Error("Missing lambda auth secret.");let p=FP("sha256",JS).update(n).digest("hex");for(;d<=i;){d++,a?.throwIfAborted();let m={id:UP(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await D(zP(YS,{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 XS(n);else if(n.localTools)e=await KS({...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 HP}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 di(n){return ZS(n)}async function ZS({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 ZS({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)HP(n,t,r)}import $P from"fetch-retry";var vX=process.env.MAILINATOR_API_KEY,TX=$P(global.fetch,{retryOn:function(n,e,t){return n>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(n){return 500}});import GP from"fetch-cookie";import{cloneDeep as WP}from"lodash-es";var jP=3e4;async function ll({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(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 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};return d.headers.get("content-type")?.includes("json")?u.json=await d.json():d.headers.get("content-type")?.includes("text")&&(u.text=await d.text()),u}async function ey(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,a=WP(i);await di({obj:a,orgId:o,bannedKeys:["code"],...e});let s=await VP(n);return a.envKey&&s.data&&r.setVariable(a.envKey,s.data),s}async function VP(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=GP(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 ty(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 qP,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await ey({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:ws(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 ny(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 mr[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 ur({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 KP=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=mr[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 ty({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})},ry={event:"executeApiTest",createHandler:KP};var YP=({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{}}},oy={event:"cancel",createHandler:YP};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})}}},iy={event:"fetchA11yTree",createHandler:JP};var XP=({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})}}},ay={event:"fetchDom",createHandler:XP};var ZP=({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 mr[t]}},sy={event:"disconnect",createHandler:ZP};function tn(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=QP(t);eL(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await tL(i,e,r,o)}catch(a){n.logger.error({result:n.result,err:a},"Error hoisting scalar result metadata")}})())}function QP(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 eL(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 tL(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Ca from"os";import nL from"v8";var ly,In,rL=Ca.platform(),oL=Ca.cpus().map(n=>({model:n.model,speed:n.speed}));function cy(n){let e=()=>{try{let t=!1,r=iL(),o=aL();r.freeMemory<1e6&&(t=!0);let i=nL.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:oL,platform:rL}}function iL(){let n=Ca.totalmem(),e=Ca.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function aL(){let n=Ca.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 ly={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,ly}import{hostname as pL}from"os";async function py(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=>sL(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:Ir(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 sL(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)},!dy(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(!dy(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?cd[r.condition]:dd[r.condition];i=new R("AssertionFailureError",`The element ${s}`)}break}}return{success:o,data:a,err:i}}function dy(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 lL}from"jimp";async function Ra(n,e){let t=await n.screenshot(e),r=await lL.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as uy}from"jimp";import Jd from"jpeg-js";import cL from"pixelmatch";async function my({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 U=>Ra(o,{locator:U.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await Ra(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}`,U=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${H}) 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 uy.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await uy.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=cL(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 dL=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 hy(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),dL);else return i}return i=await hy(e),i}async function hy({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(gy,{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(gy,{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 gy({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:${pL()};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 uL(n);else if(e.autoAuth){let f=bs.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 mL({step:e,result:u,browser:s.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},uL=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 hr(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 fy({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 mL({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let a=n.cacheConfig?.cacheExpiryMs;(!a||a===wg)&&(a=n.defaultCacheTtl??vg);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:qg(s)},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:r,ttlMs:a})}async function gr(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{..._s(n),startedAt:r,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function hr(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 Sy}from"crypto";import{cloneDeep as gL}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=Zi(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=Sy(),S=Sy();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=gs();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}=fL({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??SL(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 ${Br(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 fL({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;zg(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={...gL(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 SL(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}`}}var Zd=["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 yy(n){return new Array(n).fill(0).map(()=>Zd[Math.floor(Math.random()*Zd.length)]).join("-")}async function by({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 Pn({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 yL=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function wy({beforeUrl:n,beforePages:e,browser:t,command:r,logger:o}){if(yL.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 te(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(Gr(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 vy="MOMENTIC_RUN_ID",Ty="FINAL_SCREENSHOT_URL";import{cloneDeep as AL}from"lodash-es";async function xy(n){let{step:e,tracer:t}=n.conditionalParams,{logger:r,controller:o}=n.fixtures,i=new Date,a=_s(e),s=e.elseSteps,l=!0,c=[],d,p=gs();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 ul({...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 tn({asyncTasks:n.work.asyncTasks,nestedResults:[...c,...m.results],result:g,logger:r}),g}import{randomUUID as Ey}from"crypto";var Cy=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await bL(n);r.finishedAt=new Date,tn({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=Ey();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let a=Ey();return r.afterSnapshot=a,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,a,o)),r},bL=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 Qd}from"crypto";var Ry=15,wL=7,Ay=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await vL(n);r.finishedAt=new Date,tn({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=Qd();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let a=Qd();return r.afterSnapshot=a,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,a,o)),r},vL=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 Bt({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>Ry)return u.message=`Exceeded the maximum number of commands allowed per AI step (${Ry})`,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 x=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:p,langfuseSessionId:d,lastError:b}),{evaluation:C,reasoning:A,summary:N}=x;p.info(x,"Got AI evaluation");let P=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",P&&c.onDynamicAIActionEvaluatingEvent?.({stepId:P,status:"SUCCESS",message:`${N}
|
|
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 U,O;try{({command:U,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:U,reasoning:O},"Got proposed command")}finally{clearTimeout(H)}if(U.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 z={id:Qd(),type:"PRESET_ACTION",command:U},L={substepIndex:S+1,message:O||"Generated new command."};c.onDynamicCommandGenerated?.({...L,step:z,parentStepId:e.id}),p.info({commandId:U.id},`Executing sub-command ${S} within AI step: ${Br(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:Br(U),elementInteracted:J.results[0]?.elementInteracted,thoughts:O});let gt={substepIndex:S,output:{...J,message:J.message??"Successfully executed preset action."},step:z,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(gt),await t.finish({output:os.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 Py(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=xL(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await TL(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function Iy({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 TL(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 Ps(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 Iy({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 Iy({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 hr(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 xL(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 Ly(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 EL from"fast-json-patch";import{cloneDeep as CL}from"lodash-es";async function Oy(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=CL(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:w}=await Ps(p,u,e.results,{numScreenshots:4}),v=await d.runSectionAutohealing({results:w,errorMessage:e.terminalResult?.message,goal:c.description});S=EL.applyPatch(S,v.patches).newDocument;let b=Rt.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await RL({logger:p,controller:d,tracer:l,context:b,restartConfig:h,startingUrl:a});let x=await hr(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 RL({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 My(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"&&Fu(e.command.type))}}async function Ny(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 hr(n.work,d):await d(),u,m;if(p.status==="FAILED"&&e.autohealingConfig&&!n.work.state.autoHealingDisabled&&My(e.autohealingConfig.trigger,p.terminalResult)){let g=await t.startSubSteps(),f=await Oy({...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(!Ng(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=AL(b),U=a.toRedactedDisplayCopy(),O=s.browser.url(),z=s.executeAbortController.signal,L=Xi(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,B;switch(b.type){case"PRESET_ACTION":{K="Preset action",B=await gr(b,async()=>await ul({...n,presetParams:{tracer:P,step:b}}),z),"proposedStep"in B&&B.proposedStep&&(x=B.proposedStep,B.proposedStep=void 0);break}case"AI_ACTION":{K="AI action",B=await gr(b,()=>Cy({...n,aiStepParams:{step:b,tracer:P},executeStepList:Ln}),z);break}case"AI_ACTION_DYNAMIC":{K="AI action",B=await gr(b,()=>Ay({...n,aiStepParams:{step:b,tracer:P},executeStepList:Ln}),z);break}case"RESOLVED_MODULE":{K=`Module (${b.name})`,B=await gr(b,async()=>{let re=await fy({orgId:u,step:b,context:a,logger:i,flagStore:s.flagStore,codeEvalTools:l,signal:z});return Xd({...n,executeStepList:Ln,moduleParams:{step:b,resolvedInputs:re,tracer:P}})},z);break}case"CONDITIONAL":{K="Conditional step",B=await gr(b,()=>xy({...n,conditionalParams:{step:b,tracer:P},executeStepList:Ln}),z);break}case"IFRAME":{K="Frame step",B=await gr(b,()=>Ly({...n,frameParams:{step:b,tracer:P},executeStepList:Ln}),z);break}case"SECTION":{K="Section";let re=await gr(b,()=>Ny({...n,sectionParams:{step:b,tracer:P},executeStepList:Ln}),z);"proposedStep"in re&&re.proposedStep&&(x=re.proposedStep,re.proposedStep=void 0),B=re;break}default:return(ve=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(b)}B.beforeUrl=B.beforeUrl??O,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 IL({startedAt:A,stepTypeName:K,result:B,callbacks:n.callbacks,analytics:N,globalWorkRef:n.work,tracer:P});let Z;if(B.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let re=await Py({...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),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 IL({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:os.parse(t)})}import{randomUUID as ky}from"crypto";async function _y({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:ky(),type:"PRESET_ACTION",status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:r.message,startedAt:t,finishedAt:new Date,results:[],command:{id:ky(),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=cy(l);if(n.options.reinitializeBrowser){let h=await _y({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 PL(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...")}}},PL=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 Dy(l,"beforeSteps",n);if(L!=="PASSED")return g&&Fy({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:U}=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 Dy(c,"afterSteps",n);O=L}catch(L){p.error({err:L},"Failed to execute after steps list, continuing...")}}if(g&&Fy({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 z;if(U&&x.state.healingDetails&&o){let L=yy(3);await n.callbacks.test.onProposedTestSteps?.({name:L,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:U,details:x.state.healingDetails,purpose:"AUTO_HEALING"}),z={orgId:n.inputs.orgId,name:L}}return{proposedTest:z,status:"PASSED",results:v,beforeResults:A,afterResults:O}};async function Dy(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 Fy({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=Hg(d.logsPerPage),u=Yc(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 by({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await D(r.browser.html(),{milliseconds:2e3});a.setVariable(Ty,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=ds.parse(n);e&&(c.extraHeaders={...c.extraHeaders,...e});let d=new Rt({baseUrl:o,envName:r,variablesFromEnvironment:t,currentUrl:o});await di({obj:c,context:d,bannedKeys:[],allowList:Um,localTools:a,logger:i,orgId:s,flagStore:l});try{return ds.parse(c)}catch(p){throw new R("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${p.message}`)}}import{cloneDeep as BM}from"lodash-es";var Uy={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 rM}from"child_process";import{randomUUID as Gb}from"crypto";import{existsSync as Al,mkdirSync as oM,readFileSync as iM,writeFileSync as aM}from"fs";import{Jimp as Wb}from"jimp";import sM from"js-beautify";import{cloneDeep as lM}from"lodash-es";var By={"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(By);var zy=By;var Hy={"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(Hy);var $y=Hy;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)},pi,Aa,Zr,ep=class{constructor(...e){pi.set(this,new Map),Aa.set(this,new Map),Zr.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,Zr,"f").has(r)||nn(this,Zr,"f").set(r,new Set);let i=nn(this,Zr,"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,Aa,"f").set(r,s),a=!1,l)continue;let c=nn(this,pi,"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,pi,"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,pi,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&nn(this,Aa,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:nn(this,Zr,"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,Zr,"f").values())Object.freeze(e);return this}_getTestState(){return{types:nn(this,pi,"f"),extensions:nn(this,Aa,"f")}}};pi=new WeakMap,Aa=new WeakMap,Zr=new WeakMap;var tp=ep;var jy=new tp($y,zy)._freeze();import{homedir as Rp,hostname as cM,platform as dM}from"os";import{basename as pM,extname as uM,join as hi,resolve as mM}from"path";import{chromium as qb,devices as hM}from"playwright";import{addExtra as gM}from"playwright-extra";import fM from"puppeteer-extra-plugin-recaptcha";import{v4 as SM}from"uuid";import{rmSync as Lb}from"fs";import{basename as LO,join as OO}from"path";import{errors as MO}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 OL=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),ML=new Set(["a","e","i","o","u","y"]);function Gy(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())OL.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"&&!ML.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 Wy(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 ap}from"lodash-es";import{randomUUID as UL}from"crypto";var Vy=new Set(["about:blank","chrome-error://chromewebdata/"]);var Mt="data-momentic-id";var np=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],rp=1e4,Ia=500;function fr(n,e){let t=n.findIndex(r=>r===e);if(!(t===-1||!n[t+1]))return n[t+1]}import{createHash as NL}from"crypto";var kL="v1";function fl(n,e){if(n.tagName.toLowerCase()==="svg"&&!DL(n))try{let t=qy(n,e),r=_L(JSON.stringify(t));return{version:kL,json:t,hash:r}}catch{return}}function _L(n){return NL("md5").update(n).digest("hex")}function qy(n,e){let t=n.tagName.toLowerCase(),r=FL(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=qy(a,e);s&&o.children.push(s)}}return o}function DL(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function FL(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 Qr={r:147,g:196,b:125,a:.55},Jy={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Qr,paddingColor:Qr,borderColor:Qr,marginColor:Qr,eventTargetColor:Qr,shapeColor:Qr,shapeMarginColor:Qr,showInfo:!0,showAccessibilityInfo:!0},Sl=["display","opacity","visibility","height","position"];function Xy({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=BL({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:a,logger:t});s.roots.push(d)}),s}function BL({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,U=H!==void 0?h[H]:void 0,O=U!==void 0?i[U]:void 0,z=v.index.indexOf(C),L=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:x,frameIndex:r,nodeBounds:B},"DOM node has no tag name");continue}let Z={backendNodeId:A,psuedoType:L,nodeType:N,frameIndex:r,parentFrameId:x,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: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 ip(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=`${ip(t,e)}${a}`}return n.mPathSelector=r,r}function Ky({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:(Fr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(Fr({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=UL();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||!Ky({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&&Ky({originalNode:o,candidate:p,logKey:i,logger:t})?a.push(p):p&&l.push(p)}}return a}function Yy(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var zL=["html","#document","#document-fragment"];function Zy({node:n,domGraph:e}){let t=[],r=n,o=Yy(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=Yy(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++,zL.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 Qy(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 eb(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=fr(o,Mt);if(!i)throw new Error(`Could not find attribute ${Mt} for object ${e}`);return i}function tb(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=HL({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function HL(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 jL=["focusable","keyshortcuts","controls","live","relevant","orientation"],GL=["selected","readonly","modal","required","invalid"],WL=["id","name","role","content"],nb=["absolute","fixed","sticky"],VL=["path"],qL=["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"],ib=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],ab=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],KL=["menulistpopup","statictext","inlinetextbox"],YL=80,rb=100,bl=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],JL=["cite"],XL={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"]},ZL={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},ob={indentLevel:0},sp=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&&!Gy(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),nO(this.properties,e.domNode)}oO(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&&VL.includes(this.domNode.tagName))return!1;if(qL.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(t=>ab.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=>db(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=ob){let t=Object.assign({},ob,e),{indentLevel:r,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:l}=t,c=ap(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:ap(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=ap(this.properties),e}},lp=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 QL(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 eO(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?(Fr({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?(Fr({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 sb({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,z={})=>{},g=n.backendDOMNodeId,f=KL.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 D(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&&!eO(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 Fr({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 sp({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=>ib.includes(O.name)||ab.includes(O.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+QL(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),z=o[O?.frameId??""]?.root,L=a[O?.frameId??""];if(O&&z&&L){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,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)??[],z=0;for(let L of S?.childrenBackendIds??[]){if(O.includes(L)){z=(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 B=Math.floor(-1*Math.random()*1e7),J={nodeId:B.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:L,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 O of n.childIds??[]){if(!O)continue;let z=C.get(parseInt(O));if(!z)continue;let L=await sb({node:z,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,z=b.children[0]?.name;(O===z||!z)&&(b.children=[])}let H=[];for(let O=b.children.length-1;O>=0;O--){let z=b.children[O];if(z.role!=="StaticText"){H.push(z);continue}if(O===0||b.children[O-1].role!=="StaticText"){H.push(z);continue}b.children[O-1].name+=z.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 rO(b),S&&d&&ip(S,i),[b]}function lb({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=lb({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:l});return c}async function cb({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=>ib.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 sb({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 lb({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:w,selectorToNodeMap:v,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:d}),new lp(f[0],S,w,v)}function tO(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(db(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 nO(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,a])=>{if(qn.relevantElementAttributes.includes(i)&&!WL.includes(i)&&!n[i]&&!i.startsWith("aria")){let s=tO(i,a,e);s!==null&&(n[i]=s)}});let t,r=[];if(e.computedStyles.position&&nb.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of nb)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 rO(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 oO(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function db(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 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 te(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 iO,rmSync as pb,statSync as aO}from"fs";import*as pp from"node:fs";import sO from"nodejs-file-downloader";import{tmpdir as lO}from"os";import Sr,{basename as cO,dirname as dO}from"path";var up="file://",dp=Sr.join(lO(),"momentic","downloads"),cp=1e4,pO=50*1024*1024;async function ub(n){let{uri:e}=n;return e.startsWith(up)?mO(n):e.startsWith("http")?gO(n):hO(n)}function uO(n,e){let t=Sr.join(dp,n,e.slice(up.length)),r=Sr.join(dp,n),o=t.startsWith(r);if(!pp.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 mO({uri:n,orgId:e}){let t=uO(e,n);return{filePath:t,cleanup:()=>{pb(dO(t),{recursive:!0,force:!0})}}}async function hO({uri:n}){let e=Sr.resolve(n);if(!pp.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 gO({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=cO(r.href),i=hp(o),a=Sr.extname(i);if(xh.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=mp(t),l=new sO({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:cp}),{downloadStatus:c,filePath:d}=await D(l.download(),{milliseconds:cp,message:`Download timed out after ${cp}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=aO(d).size;if(u>pO)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(()=>pb(s,{recursive:!0,force:!0}),10*60*1e3)}}}function mb(n,e){return`${up}${n}/${e}`}function mp(n){let e=Math.random().toString(36).substring(4),t=Sr.join(dp,n,e);return iO(t,{recursive:!0}),t}function hp(n){let e=Sr.extname(n),t=Sr.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}}var vl=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)}};async function hb(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 gb(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 fb(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 Sb(n,e,t,r,o){try{await fO(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function fO(n,e,t,r){let o=r.text();o.length>Ia&&(o=o.slice(0,Ia)+"...(TRUNCATED)");let i=[];for(let a of r.args())try{let s=await a.jsonValue(),l=JSON.stringify(s);l.length>Ia?i.push(l.slice(0,Ia)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}gp(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function gp(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>rp&&(i[t]=i[t].slice(Math.floor(rp/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 oa({promiseGenerator:n,signal:r,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import{randomUUID as SO}from"crypto";var yO="[redacted due to size]",bO=1e4;async function Tb(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 xb(n,e,t,r){try{await wO(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 eo(n){return n<0?0:n}function yb(n){return{timings:{blocked:eo(n.domainLookupStart),dns:eo(n.domainLookupEnd-n.domainLookupStart),connect:eo(n.connectEnd-n.connectStart),send:eo(n.responseStart-n.requestStart),wait:0,receive:eo(n.responseEnd-n.responseStart),ssl:eo(n.connectEnd-n.secureConnectionStart)},total:eo(n.responseEnd)}}async function wO(n,e,t){let r=SO(),o=t.timing(),i=new URL(t.url()),a=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),s={...await vb(t),url:i.toString(),method:t.method(),queryString:a,postData:await TO(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:s,timings:yb(o).timings};bb(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await xO(c)}catch{}let g={...await vb(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}=yb(p);l.time=m,l.timings=u,bb(e,l,r)}function bb(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function wb(n){try{return new Date(n).toISOString()}catch{return}}function vO(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=wb(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=wb(Date.now()+ +a*1e3)),i==="Path"&&(e.path=On(a)),i==="Secure"&&(e.secure=!0)}return e}async function vb(n){let e=await n.allHeaders(),t=e.cookie?.split(";").map(vO)??[];return{headers:Object.entries(e).map(([r,o])=>({name:On(r),value:On(o)})),cookies:t}}async function TO(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 xO(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>bO?yO:n}function Eb(){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 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 fp(){return window.lastCursorPos}import{errors as EO}from"playwright-core";async function to({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(Qi(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 EO.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await CO(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 CO(n,e,t,r){return n.message.includes("attempt #")?RO(n,e,t,r):AO(n)}async function RO(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 AO(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 Cb(n){try{return await IO(n)}catch(e){n.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function IO({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 Ab=["date","datetime-local","month","time","week"],Rb={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 Ib(n){try{await D(PO(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function PO({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(!Rb[i])return;Rb[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 Tl({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await Sp(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 Sp(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 bp(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return to({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>yp({...n,targetingResult:t,useVisualClick:e})})}async function NO(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await kO(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 kO(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"),yp({...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 BO(a,s,t);if(l)return yp({...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 _O(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 jr({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 UO({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 DO(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 Cb({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(HO(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..."),NO(c,{...n,targetingResult:{...i,locator:i}})}}async function yp(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 MO.TimeoutError?new R("ActionFailureError",`Download did not complete in ${l}ms`):new R("ActionFailureError",`Download failed: ${c.message}`)}})());try{await Tl({locator:a.locator,callbacks:r,logger:t,timeoutMs:1e3})}catch(l){t.warn({err:l},"Error highlighting locator in click, continuing...")}if(i?await _O(n):await DO(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 zO(l,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function FO(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 UO({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 FO(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 BO(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 zO(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=hp(n.suggestedFilename()),i=e();await n.saveAs(OO(i,o)),Lb(r,{force:!0}),setTimeout(()=>{Lb(i,{recursive:!0,force:!0})},5*60*1e3);let a=mb(LO(i),o);return t.debug({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function HO(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as $O}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 GO(){let n=$O();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function Ob(n){return JSON.stringify(n.split("+").sort())}function Mb(n){let e=GO(),t=Ob(n);for(let r of Object.values(jO))if(Object.values(r).some(o=>Ob(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function wp({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 D(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[w,v,b]=await D(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 vp(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 ui="<empty>";function WO(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 kb(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||WO(n.url)}async function VO(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 mi({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(kb(p.frame))return null;try{return await _b({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 _b({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o,logger:i}){let a=e.frame.id,s=await VO(n,a),l=s.attributes??[],c=null,d=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=fr(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(kb(h.frame))return null;try{return await _b({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 qO(n){try{return await n.owner().count()===1}catch{return!1}}async function KO(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,ui]){let u=o.frameLocator(p===ui?"iframe":`iframe[${p}]`);if(await qO(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,ui]){let d=o.locator(c===ui?"iframe":`iframe[${c}]`);if(await KO(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 Nb(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 Db({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===ui?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===ui?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=Nb(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=Nb(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 xl(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function Tp(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function Fb(n){let e=Tp(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 Ub(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 Bb({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await YO({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 YO({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 jr({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 zb({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 Nn}from"crypto";import JO from"js-beautify";var XO=["Shift","CapsLock","Dead","Meta","AudioVolumeUp","AudioVolumeDown"];var El=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=Wy(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(XO.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 Cl=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=Tp(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 mi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await Db({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(xl(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:xl(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await Bb({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await mi({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(Mn(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 mi({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:()=>mi({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:Dr,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=Zy({node:o,domGraph:this.domGraph});return Qy(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 eb(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 mi({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:xl(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=fr(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 cb({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(fr(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let r=fr(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 Xy({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=Fb(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 Hb(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 Ep=hi(Rp(),"momentic","chromium"),yM=hi(Rp(),"video"),Il=process.env.TWO_CAPTCHA_KEY,Cp=gM(qb);Cp.use(fM({provider:{id:"2captcha",token:Il},visualFeedback:!0}));var kn=class n{static USER_AGENT=hM["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(Rg(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:Uy.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("**/*",Hb(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"&&dM()==="darwin"&&rM("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 Cl({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||Po,locale:l?.locale||Ao,timezoneId:l?.timezoneId||Io,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("~")?hi(Rp(),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 U=hi(H,"manifest.json");if(!Al(U))throw new R("UserConfigurationError",`Chrome extension path ${U} does not exist.`)}let A=hi(Ep,`momentic-session-${Date.now()}`);if(!Al(A))try{oM(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 ${Ep} folder: ${H}`)}let N=[...f],P=x.map(H=>mM(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 qb.launchPersistentContext(hi(Ep,`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 Cp.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 Cp.launch({...h,args:f});let A={...g,baseURL:e,recordVideo:d?{dir:yM}: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 vp(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=Gb(),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()||!Gr(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=Gb(),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=>{Sb(e,o,this.debugData,a,this.logger)}),e.on("request",a=>{xb(t,this.debugData,a,this.logger),this.recordRequest(a)});let i=async()=>{await Tb(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=tb({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:cM()};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"||!Gr(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(Sp(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 Wb.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&&aM(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 Wb.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}){Af(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(Vy.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 Ib({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??ku}),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 Tl({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 fb(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 gb(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 hb(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 vp(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||!np.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 _r("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 _r("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:Ub(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:Dr,signal:s});break}catch(m){if(m instanceof _r)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 _r("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(fp);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 to({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 to({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 to({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 to({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=Mb(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 $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(fp);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 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 wp({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 wp({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 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(!Gr(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=ys(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:Il,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:Il,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&&zb({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];Gr(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 jr({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 jr({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 sM.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=Eb(),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: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 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 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!!Il}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,gp(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Al(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()||pM(e),o=iM(e),i=uM(e),a=Zc[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!Al(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:jy.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 kM from"fetch-cookie";import{cloneDeep as _M}from"lodash-es";import{CookieJar as DM}from"tough-cookie";import{z as Nt}from"zod";var roe=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()}),ooe=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 yr(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 gi=3.1783027;function bM(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 Pa(n){return Math.ceil(Ap(n)/gi)}function Ap(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 LM=15;async function Np({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=OM(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<LM&&(!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 rw(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,ow({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()=>ow({command:n,state:await rw(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 rw(n,e,t){let[r,o]=await Promise.all([yr(n,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),n.screenshot({retries:1,respectActiveFrame:!0})]);return{...r,screenshotBuff:o}}async function ow({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 no({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 MM(w.relevantElements,a,s)),!w.result)throw new R("AssertionFailureError",w.thoughts);return{succeedImmediately:!1,thoughts:w.thoughts,urlAfterCommand:h,afterScreenshotOverride:m}}function OM(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 MM(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 NM=3e4;async function iw({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??NM/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 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 Pl(n){try{return new RegExp(n)}catch(e){throw new R("UserConfigurationError",`The provided regex expression was invalid: ${e}`)}}async function aw(n){let e=n.postData();if(e){if((await n.headerValue("content-type"))?.includes("json"))return{json:n.postDataJSON()};if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function sw(n){let e=await n.text();if(e){if((await n.headerValue("content-type"))?.includes("json"))return{json:await n.json()};if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function lw(n){return{request:{url:n.url(),method:n.method(),headers:await n.allHeaders(),...await aw(n)}}}async function cw(n,e){let t=await e.response();if(t)return n.response={status:t.status(),headers:await t.allHeaders(),...await sw(t)},n}async function dw(n){let e=n.request(),t=n.status(),r=n.headers(),o=await sw(n);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await aw(e)},response:{status:t,headers:r,...o},status:t,headers:r,...o}}var fi=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([yr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=await no({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([yr(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 no({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 yr(this.browser,e)}async locateElement(e){return Mp(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")&&Xc(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&Qi(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)&&!rc(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&&!nw(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&&Ou(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 Mp({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)&&!Xc(w)&&!Qi(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 Ra(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")&&Du(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 wy({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:()=>mp(e)}}async resolveCommandTemplateStrings(e,t){return di({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()?Np({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 Np({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 Ds(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:Ir(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=_M(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:Ir(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 Ds(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 Ds(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"REQUEST":{let m=new DM,h=kM(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:ws(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await iw({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return my({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 ub({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=bs.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 py({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=Pl(r.pattern),h=this.browser.registerRequestListener(m);return this.registeredListeners[r.key]=h.then(async g=>await dw(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=Pl(r.pattern);return this.recordedRequests[r.key]=[],this.browser.registerRequestRecorder(r.key,m,async h=>{try{let g=await lw(h);this.recordedRequests[r.key]?.push(g),await cw(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=Pl(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 El({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 FM=4;async function pw({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 ro({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 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)>=FM)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 UM({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(z){throw e.warn({err:z},"Error setting up socket session, possibly due to client closing the connection"),Q.releaseCapacityByIp(O),z}return{type:"e2e",sessionId:h,testId:g,orgId:f}}async function UM({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??Ao,timezoneId:o.advanced?.timezone??Io,geolocation:o.advanced?.geolocation??Po,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,B)=>{n.emit("tabs",{tabs:K,activeTab:B})},onScreencastFrame:(K,B)=>{let J=n;N&&(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 H.navigate({url:e,initialNavigation:!0});let U=new fi({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=jS(n,a,s),z=async()=>{O.timers.forEach(K=>clearInterval(K))},L=new Rt({baseUrl:e,currentUrl:U.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:U.browser.getViewport(),sessionId:a}),Q.registerSession({controller:U,context:L,sessionId:a,cleanup:z,clientIp:S})}async function ro({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 ur({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 kp=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 Ll({parentStep:this.step,socket:this.socket,parentTracer:this})}},Ll=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 kp({step:e.step,parentTracer:this,socket:this.socket})}},Ol=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 Ll({parentStep:null,parentTracer:null,socket:this.socket})}};var _p={currentlyExecutingRequests:{}},zM=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 ro({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i,settings:a}),c=`${r}|${l.baseUrl}`;try{let d=_p.currentlyExecutingRequests[c]??0;_p.currentlyExecutingRequests[c]=d+1,s=await HM({...n,...e,...l,done:t})}finally{n.logger.info({result:s,sessionId:n.metadata.sessionId},"Test execution complete"),_p.currentlyExecutingRequests[c]--}},HM=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 oa({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 U=BM(e),O={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},z={orgId:w,runId:v,testMetadata:r,steps:e,fromStep:a,toStep:i},L={controller:x,context:C,storage:s,debugDataStorage:new kr,codeEvalTools:m,billingReporter:new ko,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 Ol(n,s,w,f,U),J=await hl({fixtures:L,options:O,callbacks:K,inputs:z,testParams:{tracer:B}});return J?.status==="PASSED"&&await Is({logger:c,cacheStorage:P,orgId:w,testId:f,originalSteps:{steps:U},updatedSteps:{steps:e}}),await B.finish(),h?.(J),J.status};var uw={event:"execute",createHandler:zM};import{cloneDeep as $M}from"lodash-es";var jM=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,a=$M(e),s=Kg(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})}}},mw={event:"lintStep",createHandler:jM};var GM=({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=Lo.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:Ir(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...")}}},hw={event:"locate",createHandler:GM};var WM=({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")}}},gw={event:"mouseClickEvent",createHandler:WM};var VM=({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})}},fw={event:"recordTargetClick",createHandler:VM};var qM=["Dead","Meta","AudioVolumeUp","AudioVolumeDown"],KM=({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(qM.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}}},Sw={event:"keyboardPressEvent",createHandler:KM};var YM=({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")}}},yw={event:"mouseMoveEvent",createHandler:YM};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}}},bw={event:"recordingStart",createHandler:JM};var XM=({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}},ww={event:"recordingStop",createHandler:XM};var ZM=({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 ro({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()},vw={event:"refresh",createHandler:ZM};var QM=({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 ro({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})},Tw={event:"reset",createHandler:QM};var eN=({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})}},xw={event:"switchTab",createHandler:eN};async function Ew(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?ny(n):pw(n)}var Cw=[sy,uw,hw,Tw,vw,oy,xw,mw,fw,bw,ww,yw,gw,Sw,ry,GS,ay,iy];var Rw=n=>{let{logger:e}=n,t=new tN(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 Ew({...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}Cw.forEach(i=>nN(i,{socket:r,metadata:o,...n,logger:e}))}),t},nN=(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 dN}from"express";import Bp from"fs";import sN from"path";import Iw,{multistream as rN}from"pino";import oN from"pino-pretty";var Aw=["lastScreenshotBuffer"];var Dp=new Map,iN=!0,Fp=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=iN?Iw(i):Iw(i,rN([{stream:oN({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))Aw.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}},Ml=({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 Dp.has(n)||Dp.set(n,new Fp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),Dp.get(n)};import{hostname as aN}from"os";var je=Ml({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:aN(),disableConsoleLogs:!0}),Pw=n=>{je.addBinding("version",n)};var lN=new vl(30,60*1e3),$p="https://api.momentic.ai",jp,Up,Lw=n=>{$p=n},Nl=()=>$p,Ow=(n,e)=>{jp=n,Up?.abort(),Up=new AbortController;let t=Up.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=sN.resolve(n.rootDir,o.envFile);try{if(Bp.lstatSync(i).isSymbolicLink())return;Bp.existsSync(i)&&r.push(i)}catch(a){je.warn({err:a},`Failed to check if env file ${i} exists`)}});try{cN({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){je.error({err:o},"Failed to start config file watchers")}},me=()=>jp,Si,zp,Hp,Mw=async n=>{if(Si)return Si;let e=new st({baseUrl:$p,apiKey:n,logger:je});try{let t=await e.getAuthInfo();return Si=t.orgId,zp=t.userId,Hp=n,Si}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},br=()=>{if(!Si)throw new Error("Your organization ID is invalid.");return Si},kl=()=>{if(!zp)throw new Error("Your user ID is invalid.");return zp},Nw=()=>{if(!Hp)throw new Error("Your API key is invalid.");return Hp};function cN({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{Bp.watch(o,{signal:t,persistent:!1,recursive:!1},(i,a)=>{a&&(lN.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.`),jp=e(r.configFilePath))})})}function Re(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}var kw=dN();kw.get("/",Re((n,e)=>{let t=_f(me(),je);e.status(200).json(t)}));var _w=kw;import{Router as pN}from"express";var _l=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 Us(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 sa(r,i,Dr)}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 Dw=pN();Dw.get("/",Re((n,e)=>{e.status(200).json({userId:kl(),orgId:br()})}));var Fw=Dw;import{Router as uN}from"express";var Uw=uN();Uw.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 Bw=Uw;import{Router as mN}from"express";import zw from"fs";import hN from"path";var La=mN();La.get("/",Re(async(n,e)=>{let t=me(),r=Pe(t,y),i=(await Fs(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)}));La.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{No(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=hN.join(r.rootDir,t.folderPath??"");if(!zw.existsSync(i)||!zw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Lf({...t,folder:i,project:r});e.status(201).json(a)}));La.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 hd(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));La.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);Pf({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var Hw=La;import{Router as gN}from"express";var Dl=gN();Dl.get("/",Re((n,e)=>{let t=$d().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));Dl.get("/current",Re((n,e)=>{let t=me(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));Dl.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});Ow(r,o=>en({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var $w=Dl;import{Router as fN}from"express";var jw=fN();jw.get("/",Re((n,e)=>{let r={ai:me().config.ai};e.status(200).json(r)}));var Gw=jw;import{Router as bN}from"express";import Ww from"fs";import oo from"path";import{v4 as Vw}from"uuid";import wN from"yaml";import{randomUUID as SN}from"node:crypto";import{PostHog as yN}from"posthog-node";var yi=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},bi=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new yN("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:SN(),event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var wi=new bi({platform:"local_app"},{flushAt:1,flushInterval:0});var wr=bN();function qw(n){let e=Pe(n,y);return Object.values(e.tests)}wr.get("/",Re((n,e)=>{let t=qw(me());e.status(200).json(t)}));wr.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{No(t.name)}catch(d){e.status(400).json({error:d.message});return}let o={id:Vw(),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(qw(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=oo.join(i.rootDir,t.folderPath??""),l=await Mf({test:o,name:t.name,folder:s}),c={...o,relativeFilePath:oo.relative(i.rootDir,l)};wi.track({type:"test_editor:test_create"}),e.status(201).json(c)}));wr.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 aa(oo.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=>{Vr({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")}})()}));wr.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:gd(n.params.testPath,t,me()).newRelativeTestPath};e.status(200).json(o)}));wr.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=Us(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:br()}}),d=new st({apiKey:Nw(),baseUrl:Nl(),logger:je}),p=await ni(je,d,o);await li({client:d,gitMetadata:p}).saveStepCacheEntries(c,a.id,je),l.forEach(m=>{Vr({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"})}));wr.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}gd(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},me()),e.status(201).json({message:"ok"})}));wr.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{No(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=me(),i=oo.join(o.rootDir,t);if(!Ww.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=Pe(o,y),s;try{s=await aa(i,je,a)}catch(f){e.status(400).send({error:f.message});return}let l=Vw(),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:br()}}),p=Hn({fileType:Ce.TEST,...c,beforeSteps:d.beforeSteps??void 0,steps:d.steps,afterSteps:d.afterSteps??void 0}),u=oo.dirname(i),m=oo.join(u,`${r.name}.${Lt.TEST}`),h=wN.stringify(p);Ww.writeFileSync(m,h,"utf-8");let g={relativeFilePath:oo.relative(o.rootDir,m)};wi.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var Kw=wr;var Oa=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new ei(me(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function Zw(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:a,logger:s=je,alwaysSaveCache:l,noCache:c}=n;Pw(a),e&&Lw(e),await Mw(t);let d=br(),p=kl();wi.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=RN(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")?Qw(r):y.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Nl(),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 _l(w,br()),b=new Oa;Rw({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:wi})}var Xw="25mb";function RN(n,e,t){let r=Jw();r.use(vN()),r.use(Yw.json({limit:Xw})),r.use(Yw.urlencoded({extended:!1,limit:Xw}));let o=EN();if(o.use("/tests",Kw),o.use("/modules",Hw),o.use("/environments",_w),o.use("/projects",$w),o.use("/labels",Bw),o.use("/settings",Gw),o.use("/identify",Fw),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 ev(){return IN()==="darwin"&&AN("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Wp(n){ev()&&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 PN from"@actions/exec";import LN from"@actions/io";import ON from"quote";import MN from"string-argv";async function tv(n,e=!0){let t=MN(n),r=await LN.which(t[0],!0),o=t.slice(1),i=PN.exec(ON(r),o,{delay:100});if(e)return i}import{existsSync as NN,statSync as kN}from"fs";var vi=!!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 nv(n){try{return NN(n)&&kN(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import _N from"csv-parser";import{createReadStream as DN}from"fs";function Vp(n){return new Promise((e,t)=>{let r=[];DN(n).pipe(_N()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Fl from"semver";import{z as Ul}from"zod";var yn="2.3.0",FN="https://registry.npmjs.org/momentic",UN=Ul.object({versions:Ul.record(Ul.string(),Ul.unknown()).optional()});async function rv(n){try{await BN(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function BN(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 D(fetch(FN),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=UN.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))Fl.valid(r)&&(!t||Fl.gt(r,t))&&Fl.gt(r,yn)&&Fl.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 HN,mkdirSync as $N,statSync as jN}from"fs";import{dirname as GN}from"path";import iv from"readline/promises";import{hostname as zN}from"os";var ne=Ml({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:zN(),disableConsoleLogs:!0}).child({version:"2.3.0"});var qp=!1,av=(()=>{try{return jN("/.dockerenv"),!0}catch{return!1}})();async function ht(n,e){if(vi||qp||av)return!0;ne.flush(),await new Promise(a=>setTimeout(a,500));let t=iv.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 Kp(n){let e=GN(n);return nv(e)?HN(n)?ht(`File '${ov(n)}' already exists. Overwrite existing content?`,!0):!0:await ht(`Directory '${ov(e)}' doesn't exist. Create it now?`,!0)?($N(e,{recursive:!0}),!0):!1}function ov(n){return n.replace(/(\s+)/g,"\\$1")}async function sv(n,e){if(vi||av)return e;let t=iv.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function lv({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){VN(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)),Bg(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=Kr(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 na({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=WN(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 so}from"crypto";import{z as Pv}from"zod";var zt=" ".repeat(6);import Iv from"chalk";import{Argument as io,Option as Le}from"@commander-js/extra-typings";import{validateHeaderValue as qN}from"http";import{cpus as cv}from"os";import{parse as Yue}from"yaml";import{z as q}from"zod";var Bl=58888,Yp=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."),ao=new Le("-y, --yes","Skip all confirmation prompts.").env("CI"),Jp=new Le("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),Xp=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 ${Yp/1e3} seconds.`),zl=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."),pv=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(Ki)),uv=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."),Zp=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."),mv=new Le("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),hv=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."),gv=new Le("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),Qp=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."),fv=new Le("--port <port>",`Port to run the app on. Defaults to ${Bl}.`),eu=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."),Hl=new Le("--env <env>","Name of the environment to use when running tests."),$l=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."),Sv=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)"),tu=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."),yv=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)),bv=new Le("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),nu=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"),ru=new Le("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),wv=new io("<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 Wv({project:n,orgId:e,apiClient:t}){y.info("Pulling browser and AI configuration options from Cloud");let r=await ql.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=ak(),Zo(n.config,n.configFilePath),y.success("Migration complete!")}function Vv(n){return n?Me(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});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 Wl({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} ${Vv(S.suite?.name)}`)))}),f.every(p))}),m=n.getAppUrl(),g=Ti({results:u,startTime:l,onFailed:f=>{let S=Vv(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 Kv({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 Wl({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=Ti({results:p,startTime:d,onFailed:m=>{let h=m.testName||m.test?.name;Vl(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 Ei,{supportsColor as Nk}from"chalk";import kk from"fs";import{existsSync as bk,mkdirSync as wk,statSync as vk}from"fs";import{randomUUID as du}from"crypto";import Kl from"fs";import{hostname as sk}from"os";import ka from"path";async function Yl(n,e,t,r,o){if(r){let i=ka.extname(r),a=`${du()}-screenshot${i}`,s=ka.join(t,a),c=await(await fetch(r)).arrayBuffer();return Kl.writeFileSync(s,Buffer.from(c)),a}if(o){let i=await e.getScreenshot(n,o);if(i){let a=`${o}-screenshot.jpeg`,s=ka.join(t,a);return Kl.writeFileSync(s,i),a}}}async function lk(n,e,t,r){let o=r.runId??du(),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:sk()},{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 ck(n,e,t.folder,i.steps,r.results);let a=`${o}-result.json`;Kl.writeFileSync(ka.join(t.folder,a),JSON.stringify(i,void 0,2))}async function xi(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 Yl(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Yl(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=`${du()}-attachment.json`,l=ka.join(t,s);Kl.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:s,type:"text/plain"})}return o}async function ck(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await xi(n,e,t,i));break}case"CONDITIONAL":{let a=await xi(n,e,t,i);a.steps=[],i.assertion&&a.steps.push(await xi(n,e,t,i.assertion)),a.steps.push(...await Promise.all(i.results.map(s=>xi(n,e,t,s)))),r.push(a);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let a=await xi(n,e,t,i);if(a.steps=await Promise.all(i.results.map(s=>xi(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 Yv(n,e,t,r){for(let o of r.runs)await lk(n,e,{folder:t,suiteName:r.suiteName},o)}import Jv from"junit-report-builder";import Xv from"path";function dk(n,e){let t=e??Jv.testCase();if(t.name(n.test.name).className(n.test.name).file(Xv.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=ts[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||Ro[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 pk(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();dk(s,l)}return a}function Zv(n,e){let t=Jv.newBuilder();pk(t,e),t.writeTo(Xv.join(n,`${e.suiteName}.xml`))}import uk from"fs";import mk from"path";function Qv(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(Qv):[]}}async function hk(n,e,t,r){if(r.results?.length){let o=await Yl(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 gk(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||Ro[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(Qv)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await hk(n,e,t,r)}}async function fk(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await gk(n,e,t,r)]}}async function Sk(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await fk(n,e,t,r)],id:r.runId,file:r.filePath}}function pu(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function yk(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>Sk(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:pu(r.runs,o=>o.status==="PASSED"),unexpected:pu(r.runs,o=>o.status!=="PASSED"),flaky:pu(r.runs,o=>!!o.isFlake),skipped:0}}}async function eT(n,e,t,r){let o=await yk(n,e,t,r);uk.writeFileSync(mk.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function tT(n,e,t,r,o){switch(bk(o)?vk(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...`),wk(o,{recursive:!0})),t){case"junit":Zv(o,r);return;case"allure":case"allure-json":await Yv(n,e,o,r);return;case"playwright-json":await eT(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import _k from"wait-on";import uu from"fs";import{compact as Tk}from"lodash-es";import mu from"path";import{cwd as xk}from"process";import Ek from"semver";async function nT({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=>uu.existsSync(p)),d=xk();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=mu.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 aa(c,ne,e);if(Ek.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:mu.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(Tk)}import{cloneDeep as sT}from"lodash-es";async function rT({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 oT({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(!Hv(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??Ao,geolocation:o.advanced.geolocation??Po,timezoneId:o.advanced.timezone??Io,colorScheme:o.advanced.colorScheme,deviceScaleFactor:t},iconKnowledgeBase:w}),x=new fi({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 yi}),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,U=u?.[N];H&&U===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:U??P,localTools:a,logger:d,context:Rt.dummyContext(C.getEnvName()),flagStore:g});C.setMomenticSystemVariable(N,O)})),{controller:x,context:C}}import{randomUUID as Ck}from"crypto";async function iT({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")?vi?!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 aT({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||Ck(),runAttemptId:a,testMetadata:w,steps:w.steps,beforeSteps:w.beforeSteps,afterSteps:w.afterSteps},C={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await iT({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 lT(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await Rk(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 Rk(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=sT(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??Ik(e),f,S={};if(g){try{f=sa(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 Ak({...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 Ak(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},U,O=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 L=0;L<=O;L++){let K=await v.startAttempt(),B=b.child(K.loggerBindings||{}),J={...e,steps:sT(t)};L!==0&&w("RETRY",`attempt ${L+1}/${O+1}`);let Z=new Date,gt=new ur({httpClient:new Ot({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:B}),fakerSeed:x.isBooleanFlagEnabled("faker_constant_seed")?dh:void 0});try{let{controller:re,context:ve}=await oT({baseUrl:s,envName:d,apiClient:i,devicePixelRatio:S,logger:B,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});U=await aT({attemptMetadata:{attemptNumber:L+1,orgId:c,runId:v.runId},attemptFixtures:{logger:B,storageClient:l,billingReporter:new ko,analytics:new yi,debugDataStorage:new kr,codeEvalTools:gt,flagStore:x,apiClient:i,context:ve,controller:re,tracer:K},attemptInputs:{test:J,orgSettings:P}});let Oe=new Date;U?.status==="PASSED"&&await Is({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 _t=await rT({orgId:c,codeEvalTools:gt,logger:B,outputDefinitions:e.outputs??[],testContext:ve,flagStore:x}),an=Hm(z),Dn=L+1;if(U.status!=="FAILED")return{...U,parameters:H,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Z,finishedAt:Oe,attempts:Dn,baseUrl:s,outputs:_t,isFlake:an};let Zn=U.failedStepResult,sn=Zn?.message||"Unknown failure",j=Zn?.failureReason??wh(sn)??"UnknownError",Ci=B.child({errResult:Zn,failureReason:j,errorMessage:sn,numAttempts:O+1,name:J.name});if(L<O){Ci.warn(`Retrying failed execution attempt for run: ${sn}`);continue}return Ci.error(`Test failed after all exhausting attempts: ${sn}`),{...U,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){Ai(re);let ve=`Encountered fatal platform error while running test '${J.name}': ${re}`,Oe=new Date,_t=L+1;B.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:B,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 Ik(n){for(let e of n.envs??[])if(e.default)return e.name}import{randomUUID as dT}from"crypto";import Pk from"adm-zip";import Jn from"fs";import lo from"path";var _a=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(lo.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=lo.join(this.filePath,t);Jn.writeFileSync(o,r)}createRunArchive(e){return new hu(lo.join(this.filePath,"runs"),e)}},hu=class{constructor(e,t){this.filePath=e;this.tempPath=lo.join(e,`.${t}`),this.finalPath=lo.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 _a(lo.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=lo.join(this.tempPath,t);Jn.writeFileSync(o,r)}close(){let e=new Pk;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 cT(n,e,t,r,o){let i=Xi(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let a=Zi(o.command);a&&await e.reportCreditsUsed(n,o.command.type,a,{testId:t,testName:r})}}function Lk(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 Ok(n){switch(n){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var gu=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:Ok(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 Jl(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},Jl=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(cT(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 gu(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:Lk(e.status),finishedAt:e.finishedAt}))))}},fu=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:Ls(r.results,t),beforeResults:r.beforeResults?Ls(r.beforeResults,t):void 0,afterResults:r.afterResults?Ls(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 Jl(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},Su=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{[vy]: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 fu(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork);return this.children.push(r),r}},Xl=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=dT(),l={...a,trigger:Wt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:yn},c=new _a(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=dT(),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 Su(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork);return this.children.push(i),i}};import pT from"adm-zip";import uT from"fs";import Zl from"path";function Mk(n){let e=new pT;e.addLocalFile(Zl.join(n,"metadata.json"));for(let t of uT.readdirSync(Zl.join(n,"runs"))){if(!t.endsWith(".zip"))continue;let r=t.replace(/\.zip$/,""),o=new pT(Zl.join(n,"runs",t));for(let i of o.getEntries())i.isDirectory||e.addFile(Zl.join("runs",r,i.entryName),i.getData())}return e.toBuffer()}async function Ql(n){let{client:e,consoleLogger:t,resultsPath:r}=n;if(!uT.existsSync(r)){t.warn("Results path does not exist, skipping upload.");return}let o=new sl(e);try{let i=Mk(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 mT(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=zS,outputDir:A=HS,uploadResults:N=!1,waitOnTimeout:P=60,parallel:H=d.config.parallel??1,shardIndex:U=1,shardCount:O=1,regenerateGoldenFiles:z,gitMetadata:L,alwaysSaveCache:K,noCache:B}=n;o&&(e.info({orgId:h},`Executing start command: ${o}`),await tv(o,!1)),i&&(e.info({orgId:h},`Waiting for url: ${i} with timeout: ${P} seconds.`),await _k({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 nT({tests:t,momenticFiles:Z,yes:r,project:d,include:v,exclude:b,labels:x}),re=[];gt.forEach((rt,vr)=>{S?S.forEach((uo,ft)=>{re.push({testIndex:vr,inputs:uo,inputIndex:ft})}):re.push({testIndex:vr,inputs:void 0,inputIndex:void 0})}),O&&O>1&&(re=Dk(re,U,O));let ve=`Running ${re.length} tests with ${H} workers:`;e.info({allTestsToRunWithInputs:re,shardCount:O,shardIndex:U,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(),vr=Ti({results:Oe,startTime:_t.getTime(),onFailed:ft=>{Vl(ft,ft.filePath)},getDisplayLine:ft=>{let Tr=`${zt}- ${ft.filePath}${ft.proposedTest?" [AUTO-HEALED] ":""}`;return ft.runId&&(Tr+=` ( link when uploaded: ${rt}/runs/${ft.runId} )`),Tr},entity:"test"}),uo=Oe.filter(ft=>!!ft.proposedTest);return uo.length>0&&y.warn(`${uo.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 Ql({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}'.`),vr};kk.existsSync(A)&&y.warn(`Output directory ${A} already exists, removing before test execution...`);let Zn=await Xl.start(e,h,A,a,l,L),sn=e.child(Zn.loggerBindings||{}),j=[],Ci=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",Ci);let po={};for(let rt=0;rt<re.length;rt++){let vr=Object.values(po);vr.length===H&&await Promise.race(vr.map(Tr=>Tr.promise));let uo=re[rt],ft=`test-${rt}`;po[ft]={done:!1,promise:(async({testIndex:Tr,inputs:vu})=>{let mo=gt[Tr];an.add({testIndex:Tr,inputs:vu});let TT=mo.relativeFilePath.includes("..")?mo.fullFilePath:mo.relativeFilePath,Da=(lt,Ri)=>{lt=lt.toUpperCase();let Fn=lt,Qn;lt.includes("FAIL")?(Fn=Ei.bgRed.white("FAIL"),Qn=3):lt.includes("PASS")?(Fn=Ei.bgGreen.white("PASS"),Qn=3):lt.includes("START")?(Fn=Ei.bgBlue.white("START"),Qn=2):lt.includes("CANCEL")?(Fn=Ei.bgRgb(191,68,11).white("CANCEL"),Qn=1):lt.includes("RETRY")?(Fn=Ei.bgRgb(191,68,11).white("RETRY"),Qn=2):lt.includes("RUN")||lt.includes("PROG")?(Fn=Ei.bgMagenta.white("RUNNING"),Qn=0):(sn.warn(`Unknown status tried to be logged in run test locally: ${lt}`),Qn=0),Nk||(Fn=`${Fn}`),y.log(`${Fn}${" ".repeat(Qn)} ${TT} ${Ri?`${Ri} `:""}(${an.size}/${re.length})`)};Da("START");let xT=setInterval(()=>Da("RUN"),5*60*1e3),Tu=sn.child({testId:mo.id});try{let lt=await lT({testDefinition:mo,project:d,testInputs:vu,orgId:h,devicePixelRatio:g,apiClient:a,runGroupTracer:Zn,generator:J,retriesOverride:p,urlOverride:u,envName:m,customHeaders:f,regenerateGoldenFiles:z,logUpdate:Da,runSigIntHandlers:j,logger:Tu,flagStore:c,gitMetadata:L,alwaysSaveCache:K,noCache:B});Da(lt.status),Oe.push(lt)}catch(lt){let Ri=`Encountered unexpected fatal error when running test '${mo.name}': ${lt.message}`;y.error(Ri),Tu.error(Ri)}finally{clearInterval(xT),po[ft].done=!0,delete po[ft]}})(uo)}}await Promise.allSettled(Object.values(po).map(rt=>rt.promise));let wu="PASSED";return Oe.some(rt=>rt.status==="FAILED")&&(wu="FAILED"),await Zn.finish({logger:sn,status:wu}),process.off("SIGINT",Ci),w&&await tT(sn,s,w,{projectConfigPath:d.configFilePath,suiteName:d.config.name,startedAt:_t,finishedAt:new Date,runs:Oe},C),Dn()}function Dk(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 co from"path";var hT={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 gT(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function Fk(n,e,t){if(hT[t]){let i=hT[t];return i(n,e)}let r=gT(n,t),o=gT(e,t);if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}var fT=new Set([".DS_Store","__MACOSX"]);function ST(n,e){Xn.rmSync(n,{recursive:!0,force:!0});let t=Xn.readdirSync(e).filter(a=>!fT.has(a)).map(a=>co.join(e,a));Xn.mkdirSync(n,{recursive:!0});let r=co.join(t[0],"metadata.json"),o=ad.parse(JSON.parse(Xn.readFileSync(r,"utf-8")));for(let a of t){let s=co.join(a,"runs");if(!Xn.existsSync(s))continue;let l=Xn.readdirSync(s);for(let p of l){if(fT.has(p))continue;let u=co.join(s,p),m=co.join(n,"runs",p);Xn.cpSync(u,m,{recursive:!0})}let c=co.join(a,"metadata.json"),d=ad.parse(JSON.parse(Xn.readFileSync(c,"utf-8")));for(let p in d){let u=p;o[u]=Fk(o,d,u)}}let i=co.join(n,"metadata.json");Xn.writeFileSync(i,JSON.stringify(o,null,2))}var yT=new bi({platform:"cli"},{flushAt:1,flushInterval:0});nc||ne.warn("Sentry is not enabled in this environment due to unsupported node version");var jk=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),yu=n=>{jk&&y.dimmed(n)},kt=new Uk;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: ${lu.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 bu=kt.command("checks").alias("check").description("Perform various project checks");bu.command("config").addOption(_n).action(async n=>{en({configFilePath:n.config})});bu.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(_n).addOption(bv).action(async n=>{let e=await bn(n),t=en({configFilePath:n.config});await Lv({project:t,fix:e.fix})});bu.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 Ov({project:e})});var bT=kt.command("migrate").description("Migrate and upgrade tooling");bT.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 jv(e)});bT.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 Wv({project:t,orgId:o,apiClient:r}),process.exit(0)});kt.command("import").addOption(Kn).addOption(Yn).addOption(_n).addOption(ao).addArgument(vv).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 Dv({client:l,project:s,skipPrompts:a}):await Fv({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
|