momentic 2.4.4 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -1,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]="a2da5833-1f0d-59e2-a369-5d1b59df3df4")}catch(e){}}();
4
- var Ox=Object.create;var Mu=Object.defineProperty;var Mx=Object.getOwnPropertyDescriptor;var kx=Object.getOwnPropertyNames;var Nx=Object.getPrototypeOf,_x=Object.prototype.hasOwnProperty;var ku=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var Dx=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of kx(e))!_x.call(r,o)&&o!==t&&Mu(r,o,{get:()=>e[o],enumerable:!(n=Mx(e,o))||n.enumerable});return r};var Fx=(r,e,t)=>(t=r!=null?Ox(Nx(r)):{},Dx(e||!r||!r.__esModule?Mu(t,"default",{value:r,enumerable:!0}):t,r));var qf=ku((KK,Vf)=>{"use strict";Vf.exports=Gf;function Gf(r,e,t){r instanceof RegExp&&(r=$f(r,t)),e instanceof RegExp&&(e=$f(e,t));var n=Wf(r,e,t);return n&&{start:n[0],end:n[1],pre:t.slice(0,n[0]),body:t.slice(n[0]+r.length,n[1]),post:t.slice(n[1]+e.length)}}function $f(r,e){var t=e.match(r);return t?t[0]:null}Gf.range=Wf;function Wf(r,e,t){var n,o,i,a,s,l=t.indexOf(r),c=t.indexOf(e,l+1),d=l;if(l>=0&&c>0){if(r===e)return[l,c];for(n=[],i=t.length;d>=0&&!s;)d==l?(n.push(d),l=t.indexOf(r,d+1)):n.length==1?s=[n.pop(),c]:(o=n.pop(),o<i&&(i=o,a=c),c=t.indexOf(e,d+1)),d=l<c&&l>=0?l:c;n.length&&(s=[i,a])}return s}});var tS=ku((YK,eS)=>{"use strict";var Kf=qf();eS.exports=kA;var Yf="\0SLASH"+Math.random()+"\0",Jf="\0OPEN"+Math.random()+"\0",xd="\0CLOSE"+Math.random()+"\0",Xf="\0COMMA"+Math.random()+"\0",Zf="\0PERIOD"+Math.random()+"\0";function vd(r){return parseInt(r,10)==r?parseInt(r,10):r.charCodeAt(0)}function OA(r){return r.split("\\\\").join(Yf).split("\\{").join(Jf).split("\\}").join(xd).split("\\,").join(Xf).split("\\.").join(Zf)}function MA(r){return r.split(Yf).join("\\").split(Jf).join("{").split(xd).join("}").split(Xf).join(",").split(Zf).join(".")}function Qf(r){if(!r)return[""];var e=[],t=Kf("{","}",r);if(!t)return r.split(",");var n=t.pre,o=t.body,i=t.post,a=n.split(",");a[a.length-1]+="{"+o+"}";var s=Qf(i);return i.length&&(a[a.length-1]+=s.shift(),a.push.apply(a,s)),e.push.apply(e,a),e}function kA(r){return r?(r.substr(0,2)==="{}"&&(r="\\{\\}"+r.substr(2)),da(OA(r),!0).map(MA)):[]}function NA(r){return"{"+r+"}"}function _A(r){return/^-?0\d/.test(r)}function DA(r,e){return r<=e}function FA(r,e){return r>=e}function da(r,e){var t=[],n=Kf("{","}",r);if(!n)return[r];var o=n.pre,i=n.post.length?da(n.post,!1):[""];if(/\$$/.test(n.pre))for(var a=0;a<i.length;a++){var s=o+"{"+n.body+"}"+i[a];t.push(s)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(n.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(n.body),d=l||c,p=n.body.indexOf(",")>=0;if(!d&&!p)return n.post.match(/,.*\}/)?(r=n.pre+"{"+n.body+xd+n.post,da(r)):[r];var u;if(d)u=n.body.split(/\.\./);else if(u=Qf(n.body),u.length===1&&(u=da(u[0],!1).map(NA),u.length===1))return i.map(function($){return n.pre+u[0]+$});var m;if(d){var h=vd(u[0]),g=vd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(vd(u[2])):1,v=DA,x=g<h;x&&(S*=-1,v=FA);var b=u.some(_A);m=[];for(var T=h;v(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 N=new Array(A+1).join("0");T<0?C="-"+N+C.slice(1):C=N+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=(r,e)=>{},sc=!1;try{let r=await import("@sentry/node");Ii=r.captureException,r.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),sc=!0}catch{}import{Command as t_,Option as sn}from"@commander-js/extra-typings";import{execSync as n_}from"child_process";import rv from"body-parser";import Dk from"cors";import Fk from"dedent";import Uk from"events";import ov,{Router as Bk}from"express";import{diff as IA}from"deep-object-diff";import mn from"fs";import Jr from"path";import{diff as eA}from"deep-object-diff";import{z as Nu}from"zod";var m_=Nu.object({input:Nu.string()});import{z as Ve}from"zod";var f_=Ve.object({srcs:Ve.array(Ve.string()),urls:Ve.array(Ve.string()),desiredSrc:Ve.string().optional(),desiredUrl:Ve.string().optional()}),_u=Ve.object({srcRegex:Ve.string().optional(),urlRegex:Ve.string().optional()}),Du=Ve.object({x:Ve.number(),y:Ve.number(),correlation:Ve.number()}),S_=Ve.object({searchImageBase64String:Ve.string(),pageImageBase64String:Ve.string(),id:Ve.string().uuid(),timeoutMs:Ve.number().max(1e4).min(0).optional()});import{z as k}from"zod";import{v4 as Se}from"uuid";import*as w from"zod";function Ee(r){if(typeof r.ZodType.prototype.openapi<"u")return;r.ZodType.prototype.openapi=function(o){return new this.constructor({...this._def,openapi:o})};let e=r.ZodObject.prototype.extend;r.ZodObject.prototype.extend=function(...o){let i=e.apply(this,o);return i._def.extendMetadata={extends:this},delete i._def.openapi,i};let t=r.ZodObject.prototype.omit;r.ZodObject.prototype.omit=function(...o){let i=t.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i};let n=r.ZodObject.prototype.pick;r.ZodObject.prototype.pick=function(...o){let i=n.apply(this,o);return delete i._def.extendMetadata,delete i._def.openapi,i}}import{z as fe}from"zod";Ee(fe);var Fu=fe.object({plan:fe.string().optional(),evidence:fe.string().optional(),thoughts:fe.string(),result:fe.boolean(),relevantElements:fe.array(fe.number()).optional()}),fo=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(fo||{});var Ux=fe.object({type:fe.literal("ELEMENT_CONTENT"),negated:fe.boolean().optional(),operation:fe.nativeEnum(fo),value:fe.string()}).openapi({ref:"ElementContentAssertion"}),Bx=fe.object({type:fe.literal("ELEMENT_ATTRIBUTE"),negated:fe.boolean().optional(),operation:fe.nativeEnum(fo),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||{}),zx=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"}),Uu=fe.discriminatedUnion("type",[Ux,Bx,zx]).openapi({ref:"ManualElementAssertion"});var Hx=fe.object({type:fe.literal("CONTENT"),negated:fe.boolean().optional(),value:fe.string()}).openapi({ref:"PageContentAssertion"}),Bu=fe.discriminatedUnion("type",[Hx]).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||{}),jx=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:jx.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 zu(r){return!!(r.name||r.role||r.content||r.serializedForm||r.serializedHtml||r.screenshotUrl)}var $x=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"}),Gx=F.object({x:F.number(),y:F.number()}),Wx=F.object({type:F.literal("coordinates"),pixels:Gx}).openapi({ref:"CoordinatesTarget"});function rr(r){return r.type==="description"}function xn(r){return r.type==="coordinates"}var dt=F.discriminatedUnion("type",[$x,Wx]).openapi({ref:"ElementTarget"});function lc(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function pt(r){if(!r)return"";switch(r.type){case"description":return r.elementDescriptor;case"coordinates":return`x: ${r.pixels.x}, y: ${r.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")}),Hu=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=(H=>(H.AI_EXTRACT="AI_EXTRACT",H.AI_ASSERTION="AI_ASSERTION",H.AUTH_LOAD="AUTH_LOAD",H.AUTH_SAVE="AUTH_SAVE",H.BLUR="BLUR",H.CAPTCHA="CAPTCHA",H.CLICK="CLICK",H.COOKIE="COOKIE",H.COPY="COPY",H.DIALOG="DIALOG",H.DRAG="DRAG",H.ELEMENT_CHECK="ELEMENT_CHECK",H.FILE_UPLOAD="FILE_UPLOAD",H.FOCUS="FOCUS",H.GO_BACK="GO_BACK",H.GO_FORWARD="GO_FORWARD",H.HOVER="HOVER",H.JAVASCRIPT="JAVASCRIPT",H.LOCAL_STORAGE="LOCAL_STORAGE",H.MOUSE_DRAG="MOUSE_DRAG",H.NAVIGATE="NAVIGATE",H.NEW_TAB="NEW_TAB",H.PAGE_CHECK="PAGE_CHECK",H.PASTE="PASTE",H.PRESS="PRESS",H.KEY_DOWN="KEY_DOWN",H.KEY_UP="KEY_UP",H.REFRESH="REFRESH",H.REQUEST="REQUEST",H.GRAPHQL_REQUEST="GRAPHQL_REQUEST",H.SCROLL_DOWN="SCROLL_DOWN",H.SCROLL_UP="SCROLL_UP",H.SCROLL_LEFT="SCROLL_LEFT",H.SCROLL_RIGHT="SCROLL_RIGHT",H.SELECT_OPTION="SELECT_OPTION",H.SWITCH_TAB="TAB",H.TYPE="TYPE",H.VISUAL_DIFF="VISUAL_DIFF",H.WAIT="WAIT",H.WAIT_FOR_URL="WAIT_FOR_URL",H.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",H.AWAIT_LISTENER="AWAIT_LISTENER",H.RECORD_REQUESTS="RECORD_REQUESTS",H.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",H.SET_HEADER="SET_HEADER",H.SUCCESS="SUCCESS",H))(De||{});Ee(w);var K=w.object({thoughts:w.string().optional(),id:w.string().uuid().describe("unique identifier to this step, used for step cache")}),$t=w.object({useSelector:w.boolean().optional(),force:w.boolean().optional(),disableCache:w.boolean().optional().describe("disable element caching for this step"),iframeUrl:w.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Tn=w.object({target:Rr}).optional().openapi({ref:"SingleTargetCache"}),Ga=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),Vx=K.merge(Ga).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),Wa=$t.merge(w.object({cache:Tn})),So=K.merge(Wa.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),yo=K.merge(Wa.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),bo=K.merge(Wa.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),wo=K.merge(Wa.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),N_=w.discriminatedUnion("type",[So,yo,bo,wo]).openapi({ref:"AllScrollCommands"}),qx=K.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Kx=K.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),Yx=w.discriminatedUnion("type",[w.object({type:w.literal("SUBSTRING"),url:w.string()}),w.object({type:w.literal("GLOB"),glob:w.string()}),w.object({type:w.literal("REGEX"),regex:w.string()})]),Jx=w.object({caseInsensitive:w.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:w.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:w.number().int().optional().describe("Max seconds to wait for the URL to match")}),Xx=K.extend({type:w.literal("WAIT_FOR_URL"),matcher:Yx}).merge(Jx).openapi({ref:"WaitUrlCommand"}),Zx=K.merge(Ga).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Qx=K.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),eT=K.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),tT=K.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),nT=K.extend({type:w.literal("AUTH_LOAD"),storageState:w.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),dc=K.merge($t).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),rT=K.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),oT=K.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),iT=K.merge($a).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Oi=K.merge($t).merge(w.object({type:w.literal("CLICK"),target:dt,doubleClick:w.boolean().optional(),rightClick:w.boolean().optional(),waitForDownload:w.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:w.number().optional(),downloadTimeoutMs:w.number().optional(),cache:Tn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()})).openapi({ref:"ClickCommand"}),Mi=K.merge($t).merge(w.object({type:w.literal("DRAG"),fromTarget:dt,toTarget:dt,steps:w.number().optional(),hoverSeconds:w.number().optional().describe("Seconds to hover the object before dropping"),cache:w.object({fromTarget:Rr.optional(),toTarget:Rr.optional()}).optional()})).openapi({ref:"DragCommand"}),ki=K.merge($t).merge(w.object({type:w.literal("MOUSE_DRAG"),target:dt.optional(),deltaX:w.string().describe("pixels to move horizontally, can be template"),deltaY:w.string().describe("pixels to move vertically, can be template"),steps:w.number().optional(),cache:Tn})).openapi({ref:"MouseDragCommand"}),Ni=K.merge($t).merge(w.object({type:w.literal("HOVER"),target:dt,cache:Tn})).openapi({ref:"HoverCommand"}),_i=K.merge($t).merge(w.object({type:w.literal("FOCUS"),target:dt,cache:Tn})).openapi({ref:"FocusCommand"}),Di=K.merge($t).extend({type:w.literal("BLUR"),target:dt.optional(),cache:Tn}).openapi({ref:"BlurCommand"}),aT=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),sT=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),lT=K.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[aT,sT]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),cT=w.discriminatedUnion("type",[w.object({type:w.literal("VALUE"),value:w.string()}),w.object({type:w.literal("LABEL"),label:w.string()}),w.object({type:w.literal("INDEX"),index:w.coerce.string()})]),Fi=K.merge($t).extend({type:w.literal("SELECT_OPTION"),target:dt,cache:Tn,choice:cT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),pc=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),ju=K.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:pc.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),En=5,uc=600,Ui=K.merge($t).extend({type:w.literal("ELEMENT_CHECK"),target:dt,assertion:Uu,cache:Tn,timeout:w.number().int().min(0).max(uc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),dT=K.extend({type:w.literal("PAGE_CHECK"),assertion:Bu,iframeUrl:w.string().optional().describe("url or url regex for the iframe"),timeout:w.number().int().min(0).max(uc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),pT=K.merge(w.object({type:w.literal("AI_EXTRACT"),goal:w.string(),schema:w.string().optional(),envKey:w.string().optional(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional()})).openapi({ref:"AIExtractCommand"}),uT=w.object({clearContent:w.boolean().optional(),forceClearContent:w.boolean().optional(),delay:w.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:w.boolean().optional(),pressEnter:w.boolean().optional()}),$u=25,Bi=K.merge($t).merge(uT).extend({type:w.literal("TYPE"),target:dt.optional(),value:w.string(),cache:Tn}).openapi({ref:"TypeCommand"}),mT=K.merge(w.object({type:w.literal("PRESS"),value:w.string(),repeat:w.number().optional(),convertMeta:w.boolean().optional(),delayMs:w.number().optional()})).openapi({ref:"PressCommand"}),hT=K.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),gT=K.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),fT=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),ST=w.object({type:w.literal("REGEX"),pattern:w.string()}),yT=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),bT=w.discriminatedUnion("type",[fT,ST,yT]),wT=K.merge(Ga).merge(w.object({type:w.literal("TAB"),action:bT})).openapi({ref:"TabCommand"}),vT=K.merge(Ga).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),xT=K.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),TT=K.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),ET=K.extend({type:w.literal("REQUEST")}).merge(ja).openapi({ref:"RequestCommand"}),CT=K.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(Hu).openapi({ref:"GraphQLRequestCommand"}),RT=K.merge(w.object({type:w.literal("SUCCESS"),condition:ju.optional()})).openapi({ref:"SuccessCommand"}),AT=K.merge(w.object({type:w.literal("FAILURE")})).openapi({ref:"FailureCommand"}),IT=w.object({data:w.string().describe("location at which to find a jpg"),width:w.number(),height:w.number()}),zi=K.merge($t).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:dt.optional(),screenshot:IT.optional(),cache:Tn})).openapi({ref:"VisualDiffCommand"}),PT=K.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),pattern:w.string(),key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),LT=K.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),OT=K.merge(w.object({type:w.literal("RECORD_REQUESTS"),pattern:w.string(),key:w.string()})).openapi({ref:"RecordRequestsCommand"}),MT=K.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),kT=K.merge(w.object({type:w.literal("SET_HEADER"),name:w.string(),value:w.string(),urlPattern:w.string().optional().describe("URL pattern to match")})).openapi({ref:"SetHeaderCommand"}),Gu=w.discriminatedUnion("type",[Oi,Bi,mT,hT,gT,Fi,Vx,yo,So,ju,Ni,Kx,RT]),NT=w.discriminatedUnion("type",[pT,nT,tT,dc,xT,rT,qx,Mi,Ui,lT,Qx,eT,iT,TT,ki,vT,dT,oT,Zx,ET,CT,bo,wo,wT,zi,_i,Di,Xx,PT,LT,OT,MT,kT]),vo=w.discriminatedUnion("type",[...Gu.options,...NT.options]).openapi({ref:"Command"}),Va=w.discriminatedUnion("type",[...Gu.options,AT]);function zn(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:Se(),type:r};break;case"AUTH_LOAD":{e={id:Se(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:Se(),type:r,goal:""};break;case"DIALOG":e={id:Se(),type:r,action:"DISMISS"};break;case"DRAG":e={id:Se(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Se(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Se(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Se(),type:r,delay:1};break;case"BLUR":e={id:Se(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Se(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Se(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Se(),type:r,value:""};break;case"SELECT_OPTION":e={id:Se(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Se(),type:r,url:""};case"TAB":e={id:Se(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Se(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Se(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Se(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:Se(),type:r,code:""};break;case"AI_ASSERTION":e={id:Se(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:Se(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Se(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Se(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Se(),type:r,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:Se(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:Se(),type:r,pattern:"",key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Se(),type:r,key:""};break}case"SET_HEADER":{e={id:Se(),type:r,name:"",value:""};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Wu(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as _T}from"zod";var B_=_T.discriminatedUnion("type",[Di,dc,Oi,Mi,_i,Ni,ki,So,yo,bo,wo,Fi,Bi,zi,Ui]);function Vu(r){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(r)}import{z as DT}from"zod";var Et={type:!0,cache:!0},Ar=DT.discriminatedUnion("type",[Di.pick(Et),Oi.pick(Et),Mi.pick(Et),Ui.pick(Et),_i.pick(Et),Ni.pick(Et),ki.pick(Et),So.pick(Et),yo.pick(Et),bo.pick(Et),wo.pick(Et),Fi.pick(Et),Bi.pick(Et),zi.pick(Et)]),mc=Object.values(De).filter(r=>Ar.options.some(e=>e.shape.type.safeParse(r).success));vo.options.forEach(r=>{if("target"in r.shape&&!mc.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});import{z as gc}from"zod";import{z as hc}from"zod";import{z as xo}from"zod";var Ct=xo.object({index:xo.number().optional().describe("global index within a test (in-order traversal)"),id:xo.string(),skipped:xo.boolean().optional(),envKey:xo.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:xo.boolean().optional()});Ee(hc);var Rt=Ct.extend({type:hc.literal("PRESET_ACTION"),command:vo,skipped:hc.boolean().optional()}).openapi({ref:"PresetAction"});Ee(gc);var Ir=Ct.extend({type:gc.literal("AI_ACTION"),text:gc.string(),steps:Rt.array().optional()}).openapi({ref:"AIAction"});import{z as de}from"zod";var FT=de.object({cacheKey:de.string(),cacheExpiryMs:de.number()}),fc=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:FT.optional()}),Hn=fc.extend({type:de.literal("MODULE"),moduleId:de.string().uuid()}),UT=de.union([Hn.pick({type:!0,moduleId:!0}),de.record(de.unknown())]),BT=de.object({type:de.literal("URL_REGEX"),regex:de.string()}),zT=de.object({type:de.literal("PAGE_CHECK"),substring:de.string()}),Sc=de.object({cacheInvalidation:de.discriminatedUnion("type",[zT,BT]).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:Sc.nullish()});import{z as it}from"zod";import{z as yc}from"zod";Ee(yc);var To=Ct.extend({type:yc.literal("AI_ACTION_DYNAMIC"),text:yc.string()}).openapi({ref:"AIActionDynamic"});import{z as qu}from"zod";var bc=Ct.extend({type:qu.literal("CONDITIONAL"),skipped:qu.boolean().optional()});import{z as qa}from"zod";var HT=qa.object({type:qa.literal("url"),url:qa.string()}),Hi=Ct.extend({type:qa.literal("IFRAME"),identifier:HT});import{z as Gt}from"zod";var wc=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(wc||{});var jT=Gt.discriminatedUnion("type",[Gt.object({type:Gt.literal("NAVIGATE_URL"),url:Gt.string().url()}),Gt.object({type:Gt.literal("GO_TO_SECTION_START")})]),$T=Gt.object({trigger:Gt.nativeEnum(wc).optional(),attempts:Gt.number().int().optional(),restartBehavior:jT}),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:$T.optional()});var Ku=At.merge(fc).extend({type:it.literal("RESOLVED_MODULE"),steps:it.lazy(()=>Ie.array())}),vc=At.extend({steps:it.lazy(()=>Ie.array())}),xc=Hi.extend({steps:it.lazy(()=>be.array())}),GT=Hi.extend({steps:it.lazy(()=>Ie.array())}),Tc=ji.extend({steps:it.lazy(()=>be.array())}),WT=ji.extend({steps:it.lazy(()=>Ie.array())}),Pr=bc.extend({blocks:it.object({assertion:it.lazy(()=>Rt),steps:it.lazy(()=>be.array())}).array(),elseSteps:it.lazy(()=>be.array().optional())}),VT=bc.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,To,Hn,Pr,xc,Tc]),Ie=it.discriminatedUnion("type",[Rt,Ir,To,Ku,VT,GT,WT]);import{z as Wt}from"zod";var qT=Wt.object({steps:be.array(),beforeSteps:be.array().nullish(),afterSteps:be.array().nullish()}),Eo=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 Ec=or.object({key:or.string(),testId:or.string().optional(),moduleId:or.string().optional(),organizationId:or.string(),value:Ar}),KT=Ec.extend({uniqueKey:or.string()}),Yu=or.record(or.string(),KT);var Ju=k.object({phrase:k.string()}),Cc=k.object({thoughts:k.string().optional(),result:k.union([k.literal("NOT_FOUND"),k.string(),k.number(),k.array(k.unknown()),k.record(k.unknown(),k.unknown()),k.unknown()])}),UF=k.object({text:k.string()}),Xu=k.object({thoughts:k.string(),review:k.string().optional(),id:k.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 Zu=k.object({thoughts:k.string(),category:k.nativeEnum(Ka)}),YT=k.discriminatedUnion("op",[k.object({op:k.literal("replace"),path:k.string(),value:k.string()}),k.object({op:k.literal("add"),path:k.string(),value:k.string()}),k.object({op:k.literal("remove"),path:k.string()})]),BF=k.object({thoughts:k.string(),patches:YT.array()}),Qu=[k.literal("add"),k.literal("replace"),k.literal("remove")],JT=k.object({op:k.union(Qu),path:k.string(),value:Ie.optional()}),em=k.object({patches:JT.array(),thoughts:k.string()});var XT=k.object({thoughts:k.string(),op:k.union(Qu),value:k.union([k.null(),Ie])}),tm=k.object({reasoning:k.string(),scenario:k.string(),patch:XT.or(k.null())}),zF=k.object({thoughts:k.string(),evaluation:k.number().min(1).max(10)}),HF=k.object({observations:k.string(),reasoning:k.string(),command:Va});var Rc=k.object({summary:k.string(),reasoning:k.string(),evaluation:k.discriminatedUnion("type",[k.object({type:k.literal("DONE")}),k.object({type:k.literal("RIGHT_TRACK")}),k.object({type:k.literal("WRONG_TRACK"),feedback:k.string()}),k.object({type:k.literal("IMPOSSIBLE")})])});import{z as _}from"zod";import*as te from"zod";var qF=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")}),nm=te.union([te.literal("ELEMENT_CHECK"),te.literal("NEGATED_CHECK"),te.literal("SELECT_OPTION"),te.literal("TYPE")]);function Or(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.negated)return"NEGATED_CHECK";if(r.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||{}),Co=te.object({matched:te.boolean(),reason:te.string().optional().describe("Human understandable description"),logs:te.string().array().optional().describe("Logs for debugging")}),ZT=Co.extend({type:te.literal("USER_SELECTOR")}),QT=Co.extend({type:te.literal("CSS_SELECTOR"),selectors:te.string().array()}),eE=Co.extend({type:te.literal("HYBRID_SELECTOR")}),tE=Co.extend({type:te.literal("HTML_DISTANCE"),distance:te.number().optional(),closestElement:te.string().optional(),savedElement:te.string().optional()}),nE=Co.extend({type:te.literal("TEMPLATE_MATCHING"),elementImageUrl:te.string().url()}),rE=Co.extend({type:te.literal("AUTO_FRAME"),logs:te.string().array().optional()}),rm=te.discriminatedUnion("type",[ZT,QT,eE,tE,nE,rE]);import{z as Ki}from"zod";import{z as CC}from"zod";import*as X from"zod";import{cloneDeep as Wi}from"lodash-es";var oE=r=>{let e=om(r,0);if(e===void 0||!aE(r[e]))return;let t=om(r,e+1);if(t!==void 0)return sE(r,e,t)},im=oE,om=(r,e)=>{for(let t=e;t<r.length;t+=1){let n=r[t];if(!iE(n))return t}},iE=r=>r===" "||r===" "||r===`
5
- `||r==="\r",aE=r=>r==="{"||r==="[",sE=(r,e,t)=>{let n;for(let o=t-1;o>e;o-=1){let i=r[o];if(i==="\r")return;if(i===`
6
- `)return lE(n);if(n===void 0)n=i;else if(n[0]===i)n+=i;else return}},lE=r=>r===void 0?0:r[0]===" "?r.length:r;var am=(r,e)=>{let t=Ac(r,"toPrecision",e,e);return t===void 0?Ac(r,"toExponential",e,e):t},Ac=(r,e,t,n)=>{let i=r[e](n).replace(cE,"$1").replace(dE,"$1");return i.length<=t?i:n===1?void 0:Ac(r,e,t,n-1)},cE=/(e)\+/iu,dE=/\.?0*($|e)/iu;var lm=(r,e)=>{if(typeof r!="string")throw new TypeError(`Input must be a JSON string: ${r}`);pE(e)},pE=r=>{if(uE(r),r<0)throw new TypeError(`"maxSize" argument must be positive: ${r}`);if(r<sm)throw new TypeError(`"maxSize" argument must be at least ${sm}: ${r}`)},uE=r=>{if(r===void 0)throw new TypeError('"maxSize" argument must be defined');if(!Number.isInteger(r))throw new TypeError(`"maxSize" argument must be an integer: ${r}`)},sm=7;var Ya=(r,e,t)=>{let n=dm(e,t);return cm(r,e,n)},cm=(r,e,t)=>{if(t>=e)return t;let n=r[t];return n>=vE&&n<=xE?cm(r,e,t+1):t},Ja=(r,e,t)=>{if(t===void 0)return t;let n=dm(e,t);return mE(r,n)},mE=(r,e)=>hE(r,e)?e-3:gE(r,e)?e-2:fE(r,e)?e-1:e,hE=(r,e)=>e>=3&&r[e-3]>=SE&&r[e-3]<=yE,gE=(r,e)=>e>=2&&r[e-2]>=bE,fE=(r,e)=>e>=1&&r[e-1]>=wE,dm=(r,e)=>e<0||Object.is(e,-0)?Math.max(r+e,0):e,SE=240,yE=244,bE=224,wE=194,vE=128,xE=191;var pm=(r,e,t)=>{let n=globalThis.Buffer.from(r),o=Ya(n,n.length,e),i=Ja(n,n.length,t);return o===0&&i>=n.length?n.toString():n.toString("utf8",o,i)};var um=/[\uD800-\uDFFF]/gu,mm="\uFFFD";var Xa=r=>TE(r)?r.replace(um,mm):r,TE=r=>{for(let e=0;e<r.length;e+=1){let t=r.codePointAt(e);if(t>=55296&&t<=57343)return!0}return!1};var Lc=({input:r,targetByteCount:e,firstStartSurrogate:t,lastStartSurrogate:n,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=r.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>n)continue;let g=r.charCodeAt(d+a);Number.isNaN(g)||g<o||g>i||(u+=1,d+=a)}return(s&&u>e?p:d)+l};var Oc=(r,e,t)=>e<0||Object.is(e,-0)?PE(r,e,t):IE(r,e,t),IE=(r,e,t)=>Lc({input:r,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),PE=(r,e,t)=>Lc({input:r,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:r.length-1});var Za=(r,e,t)=>{let n=Oc(r,e,!1),o=LE(r,t),i=n===0&&o===void 0?r:r.slice(n,o);return Xa(i)},LE=(r,e)=>{if(e===void 0)return e;let t=Oc(r,e,!0);return t===r.length?void 0:t};var gm=(r,e,t)=>{let{textEncoder:n,textDecoder:o}=OE(),i=ME(r),{written:a}=n.encodeInto(r,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)},OE=()=>(Mc===void 0&&(Mc=new globalThis.TextEncoder,hm=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:Mc,textDecoder:hm}),Mc,hm,ME=r=>{let e=r.length*3;return e>kE?new Uint8Array(e):((Qa===void 0||Qa.length<e)&&(Qa=new Uint8Array(e)),Qa)},kE=1e5,Qa;var fm=(r,e)=>{if(e===void 0)return e;let t=kc(r,e);return t>=r.length*Sm?void 0:t},kc=(r,e)=>e<=r.length*-Sm?0:e,Sm=4;var ym=(r,e,t)=>{if(typeof r!="string")throw new TypeError(`First argument must be a string: ${r}`);NE(e),_E(t)},NE=r=>{if(r===void 0)throw new TypeError("Second argument is required.");bm("Second",r)},_E=r=>{r!==void 0&&bm("Third",r)},bm=(r,e)=>{if(!Number.isInteger(e))throw new TypeError(`${r} argument must be an integer: ${e}`)};var wm=r=>{let e=!0,t=0;for(let n=0;n<Nc;n+=1){let o=DE(r,n);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/Nc}},DE=(r,e)=>{let t=Nc-1,n=1-(t-e)/t,o=Math.round(n*(r.length-1));return r.charCodeAt(o)},Nc=50;var FE=(r,e,t)=>{if(ym(r,e,t),r==="")return r;let n=kc(r,e),o=fm(r,t);return o===void 0&&Object.is(n,0)?Xa(r):UE(r,n,o)},vm=FE,UE=(r,e,t)=>{if(r.length<=BE)return Za(r,e,t);let{asciiOnly:n,longCharsPercentage:o}=wm(r);return n?HE(r,e,t):o>=zE?Za(r,e,t):xm(r,e,t)},BE=200,zE=.4,HE=(r,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?pm(r,e,t):xm(r,e,t),xm=(r,e,t)=>"TextEncoder"in globalThis?gm(r,e,t):Za(r,e,t);var Em=(r,e)=>{let t=JSON.stringify(r),n=GE(t),o=vm(n,0,e-Tm.length-Gi.length*2),a=`${jE(o)}${Tm}`;return WE(a)},jE=r=>r.replace($E,""),$E=/(\\|\\u[0-9a-fA-F]{0,3})$/u,GE=r=>r.slice(Gi.length,-Gi.length),WE=r=>`${Gi}${r}${Gi}`,Gi='"',Tm="...";var Cm=r=>globalThis.Buffer.byteLength(r);var _c=r=>{let e=r.length,t=e;for(let n=0;n<e;n+=1){let o=r.charCodeAt(n);if(o<=VE)continue;if(o<=qE){t+=1;continue}if(t+=2,o<KE||o>YE)continue;let i=r.charCodeAt(n+1);i<JE||i>XE||(n+=1)}return t},VE=127,qE=2047,KE=55296,YE=56319,JE=56320,XE=57343;var Rm=()=>ZE.bind(void 0,new TextEncoder),ZE=(r,e)=>{let t=QE(e);return r.encodeInto(e,t).written},QE=r=>{let e=r.length*3;return e>eC?new Uint8Array(e):((es===void 0||es.length<e)&&(es=new Uint8Array(e)),es)},eC=1e5,es;var nC=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?Cm:"TextEncoder"in globalThis?rC.bind(void 0,Rm()):_c,rC=(r,e)=>e.length<100?_c(e):r(e),Am=nC();var Im=r=>{if(r===null)return oC;if(r===!0)return iC;if(r===!1)return aC;let e=typeof r;return e==="object"?sC:e==="number"?JSON.stringify(r).length:Dc(r)},oC=4,iC=4,aC=5,sC=2,Dc=r=>Am(JSON.stringify(r));var ts=({size:r,increment:e,maxSize:t,truncatedProps:n,path:o,value:i})=>{let a=r+e,s=a>t;return s?{size:r,stop:s,truncatedProps:[...n,{path:o,value:i}]}:{size:a,stop:s,truncatedProps:n}},Lm=r=>Im(r),Om=(r,e,t)=>{let n=km({empty:r,indent:e,depth:t,keySpaceSize:0}),o=Nm(r);return n+o},Mm=({key:r,empty:e,indent:t,depth:n})=>{let o=km({empty:e,indent:t,depth:n,keySpaceSize:1}),i=Dc(r),a=Nm(e);return o+i+lC+a},lC=1,km=({empty:r,indent:e,depth:t,keySpaceSize:n})=>{if(e===void 0)return 0;let o=Pm+e*(t+1),i=r?Pm+e*t:0;return n+o+i},Pm=1,Nm=r=>r?0:cC,cC=1;var ns=({parent:r,truncatedProps:e,path:t,increment:n,maxSize:o,key:i,empty:a,size:s,truncateValue:l,indent:c,depth:d})=>{let p=r[i],u=[...t,i],{size:m,stop:h,truncatedProps:g}=ts({size:s,increment:n,maxSize:o,truncatedProps:e,path:u,value:p});return h?{empty:a,size:m,truncatedProps:g}:dC({value:p,truncatedProps:e,path:u,maxSize:o,empty:a,size:s,newSize:m,truncateValue:l,indent:c,depth:d})},dC=({value:r,truncatedProps:e,path:t,maxSize:n,empty:o,size:i,newSize:a,truncateValue:s,indent:l,depth:c})=>{let{value:d,size:p,truncatedProps:u}=s({value:r,truncatedProps:e,path:t,size:a,maxSize:n,indent:l,depth:c+1});return d===void 0?{empty:o,size:i,truncatedProps:u}:{empty:!1,size:p,value:d,truncatedProps:u}};var _m=({array:r,truncatedProps:e,path:t,size:n,maxSize:o,truncateValue:i,indent:a,depth:s})=>{let l=[],c={empty:!0,size:n,truncatedProps:e};for(let d=0;d<r.length;d+=1){let p=Om(c.empty,a,s);c=ns({parent:r,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 Dm=({object:r,truncatedProps:e,path:t,size:n,maxSize:o,truncateValue:i,indent:a,depth:s})=>{let l={},c={empty:!0,size:n,truncatedProps:e};for(let d in r){let p=Mm({key:d,empty:c.empty,indent:a,depth:s});c=ns({parent:r,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:r,truncatedProps:e,path:t,size:n,maxSize:o,indent:i,depth:a})=>{let s=Lm(r),{size:l,stop:c,truncatedProps:d}=ts({size:n,increment:s,maxSize:o,truncatedProps:e,path:t,value:r});return c?{value:void 0,size:l,truncatedProps:d}:pC({value:r,truncatedProps:d,path:t,size:l,maxSize:o,indent:i,depth:a})},pC=({value:r,truncatedProps:e,path:t,size:n,maxSize:o,indent:i,depth:a})=>typeof r!="object"||r===null?{value:r,size:n,truncatedProps:e}:Array.isArray(r)?_m({array:r,truncatedProps:e,path:t,size:n,maxSize:o,truncateValue:rs,indent:i,depth:a}):Dm({object:r,truncatedProps:e,path:t,size:n,maxSize:o,truncateValue:rs,indent:i,depth:a});var uC=(r,e)=>{lm(r,e);let t=mC(r),n=hC(r),{value:o,truncatedProps:i}=rs({value:n,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:gC({newValue:o,value:n,maxSize:e,indent:t}),truncatedProps:i}},Ro=uC,mC=r=>{let e=im(r);return typeof e=="string"?e.length:e},hC=r=>{try{return JSON.parse(r)}catch(e){throw new TypeError(`Invalid JSON string: "${r}"
7
- ${e.message}`)}},gC=({newValue:r,value:e,maxSize:t,indent:n})=>r!==void 0?JSON.stringify(r,void 0,n):typeof e=="number"?am(e,t):Em(e,t);import*as kr from"zod";import{z as dn}from"zod";import{z as bt}from"zod";var Fc=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 Fm=1e4,Um=6e4,Mr=Fc.extend({pageLoadTimeoutMs:bt.number().optional().refine(r=>r===void 0||r<=Um&&r>=-1,{message:`Page load timeout must be between 0 and ${Um/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(r=>r===void 0||r<=Fm&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${Fm/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",Ao="ENV_NAME",oU={[Ge]:"https://www.google.com"},Bm=dn.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),zm=dn.object({name:dn.string(),variables:dn.record(dn.string().describe("variable name"),dn.string().describe("variable value"))}),Hm=dn.object({name:dn.string(),variables:dn.record(dn.string().describe("variable name"),dn.unknown().describe("variable value")),browser:Mr.optional()});Ee(kr);var Vi=kr.object({env:kr.record(kr.unknown())}).openapi({ref:"TestContextSnapshot"}),fC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",SC=[Ge,Ao],jm=[os,Ge,Ao],It=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t={}){return new r({baseUrl:"about:blank",currentUrl:"about:blank",envName:e,variablesFromEnvironment:t})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[Ge]??"about:blank",o=e.env[os]??"about:blank",i=e.env[Ao],a={};for(let[l,c]of Object.entries(e.env))jm.includes(l)||(t??{})[l]===void 0&&(a[l]=c);return new r({baseUrl:n,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){SC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Ao]}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(([n,o])=>jm.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,fC]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=Ro(JSON.stringify(o),1e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=Ro(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(Ao,e.envName)}getDynamicVariablesCopy(){return Wi(this.env)}getVariablesFromEnvironmentCopy(){return Wi(this.varsFromMomenticEnvironment)}};import{z as Nr}from"zod";Ee(Nr);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 $m=["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"},Io={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."},Uc=Nr.object({reason:Nr.nativeEnum(pe),summary:Nr.string()}).openapi({ref:"TestResultClassification"}),as=Nr.object({errorMessage:Nr.string(),errorStack:Nr.string().optional(),classification:Uc.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||{}),Bc=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(Bc||{}),zc=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()}),yC=zc.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(Bc),message:X.string().optional(),elementInteracted:X.string().optional()}),ir=zc.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:yC.array(),proposedStep:Rt.optional()}),bC=ir.merge(Ir).extend({results:X.lazy(()=>ss.array())}),wC=ir.merge(To).extend({results:X.lazy(()=>ss.array())}),vC=ir.merge(Hn).extend({moduleName:X.string().optional(),results:X.lazy(()=>Pt.array())}),xC=ir.merge(Pr).extend({assertion:ss.optional(),results:X.lazy(()=>Pt.array()).describe("results for the block actually executed")}),TC=ir.merge(Hi).extend({results:X.lazy(()=>Pt.array())}),EC=ir.merge(ji).extend({results:X.lazy(()=>Pt.array()),healingAttempts:X.lazy(()=>Pt.array().array()).optional()}),Pt=X.discriminatedUnion("type",[bC,wC,ss,vC,xC,TC,EC]),ls=ir.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),cs=zc.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var Hc=CC.object({results:Pt.array().describe("main results"),beforeResults:Pt.array().optional(),afterResults:Pt.array().optional()}),ds=Hc.partial();import{z as W}from"zod";import{z as Re}from"zod";var RC=Re.object({type:Re.literal("FAILURE_RECOVERY"),thoughts:Re.string()}),AC=Re.object({type:Re.literal("DESCRIPTION_UPDATE"),thoughts:Re.string()}),ps=Re.discriminatedUnion("type",[AC,RC]),us=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(us||{}),IC=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()}),LU=IC.pick({name:!0,orgId:!0}),jc=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()}),Gm=jc.extend({steps:Ie.array()});import{isValidCron as PC}from"cron-validator";import{z as oe}from"zod";import{z as $c}from"zod";var jn=(n=>(n.CHROMIUM="Chromium",n.GOOGLE_CHROME="Google Chrome",n.CHROME_FOR_TESTING="Chrome for Testing",n))(jn||{});var ms=$c.object({width:$c.number().min(200).max(1e4),height:$c.number().min(200).max(1e4)}),Wm={"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}},kU=Object.keys(Wm);var Vt=Wm["Desktop Large"],Po="en-us",Lo="America/Los_Angeles";var Oo={latitude:37.7749,longitude:-122.4194};var Vm=["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 qm=2e3,hs=Mr.extend({browserType:oe.nativeEnum(jn).optional(),slowMoMs:oe.number().optional().refine(r=>r===void 0||r<=qm&&r>=-1,{message:`Slow motion must be between 0 and ${qm} milliseconds`}),basicAuthorization:oe.object({username:oe.string().optional(),password:oe.string().optional()}).optional(),geolocation:oe.object({latitude:oe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:oe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:oe.boolean().optional(),locale:oe.string().optional(),timezone:oe.enum(Vm).optional(),colorScheme:oe.enum(["light","dark"]).optional()}),Km=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],LC=oe.object({disableAICaching:oe.boolean().optional(),failureRecovery:oe.boolean().optional().describe("undefined means inherit org settings")});var OC=oe.object({viewport:ms.optional()}),Mo=OC.merge(LC).merge(hs),ko=oe.object({cron:oe.string().refine(r=>PC(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:oe.boolean().default(!1),env:oe.string().optional(),timeZone:oe.string().default("America/Los_Angeles"),jobKey:oe.string().optional()}),No=oe.object({onSuccess:oe.boolean().default(!1),failureMessage:oe.string().optional(),onFailure:oe.boolean().default(!0),successMessage:oe.string().optional()}),MC=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=MC.array(),kC=oe.object({name:oe.string(),value:oe.string()}),Ym=kC.array(),fs=oe.object({name:oe.string(),default:oe.boolean().optional(),fixtures:Bm.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(jc).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"}),NC={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({...NC,test:!0}),Jm=qi.omit({failureReason:!0,failureDetails:!0,test:!0}),Gc=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:Mo.nullish()}).nullish()}).merge(Hc),Xm=r=>r.includes("PASSED")&&r.includes("FAILED");var _C=Ki.object({id:Ki.string().uuid(),startedAt:We.or(Ki.null()),finishedAt:We.or(Ki.null()),status:Ki.nativeEnum(ae)}).merge(ds),tB=_C.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 DC=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"}),Zm=DC.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 FC=Xe.object({type:Xe.literal("TARGETING"),name:Xe.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:rm.array(),pageState:Xe.string().optional(),targetSource:Xe.nativeEnum(nr).optional(),targetUpdateTime:Xe.string().optional()}),UC=Xe.object({type:Xe.literal("AI_LOCATION"),matched:Xe.boolean(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional(),thoughts:Xe.string().optional()}),BC=Xe.object({type:Xe.literal("ASSERTION"),relevantElementsSerialized:Xe.string().array().optional(),pageState:Xe.string().optional(),ragUsed:Xe.boolean().optional()}),Qm=Xe.discriminatedUnion("type",[FC,UC,BC]);function bs(){return{details:[]}}import{z as Fe}from"zod";var zC=Fe.object({id:Fe.string(),name:Fe.string()}),gB=zC.merge(Fe.object({createdAt:We,createdBy:Fe.string(),schedule:ko,notification:No,environment:Fe.object({name:Fe.string()}).nullish(),beforeTests:Fe.object({id:Fe.string()}).array().nullish(),afterTests:Fe.object({id:Fe.string()}).array().nullish()})),eh=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()}),fB=eh.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),th=eh.extend({runs:ys.array()});import{z as Kt}from"zod";import{cloneDeep as wB}from"lodash-es";import{z as he}from"zod";var CB=he.object({thoughts:he.string(),subGoals:he.object({instruction:he.string()}).array()}),RB=he.object({thoughts:he.string(),newPlanMarkdown:he.string()}),AB=he.object({thoughts:he.string(),correct:he.boolean(),failedActionIndex:he.number().optional()}),HC=he.object({type:he.literal("PLANNING"),beforePlan:he.string(),goalDecision:he.string(),thoughts:he.string()}),jC=he.object({type:he.literal("RUNNING"),stepDisplayName:he.string(),status:he.nativeEnum(Ce),results:Pt.array()}),$C=he.object({type:he.literal("REVISING"),beforePlan:he.string(),afterPlan:he.string(),errString:he.string(),diffs:he.string(),thoughts:he.string()}),GC=he.object({type:he.literal("SYSTEM"),message:he.string()}),WC=he.discriminatedUnion("type",[HC,jC,$C,GC]),nh=WC.array();var MB=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:nh.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()}),VC=_.object({screenshotBase64AfterCommand:_.string(),urlAfterCommand:_.string(),serializedCommand:_.string(),elementInteracted:_.string().optional(),thoughts:_.string().optional()}),rh=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),source:nm.optional().catch(void 0)}),oh=_.object({target:_.string().or(_.number()),browserState:_.string().optional(),screenshot:_.string().optional(),boundingBox:_.object({x:_.number(),y:_.number(),height:_.number(),width:_.number()}).optional()}),ih=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string().optional(),returnSchema:_.string().optional()}),ah=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),url:_.string(),contextChoice:pc.optional()}),sh=_.object({command:vo}),Wc=_.object({goal:_.string(),browserState:_.string(),startingScreenshot:_.string().optional(),screenshot:_.string(),url:_.string(),history:VC.array(),actionHint:_.string().optional(),lastError:_.string().optional()}),lh=_.object({results:cs.array(),errorMessage:_.string(),errorStack:_.string().optional()}),ch=_.object({results:cs.array(),goal:_.string(),errorMessage:_.string()}),dh=_.object({failedResults:cs.array(),nextStepsSerialized:_.string().array(),currentUrl:_.string(),currentPageState:_.string(),currentScreenshot:_.string()}),ZB=_.object({description:_.string(),type:_.union([_.literal("locator"),_.literal("assertion"),_.literal("ai-action")]),excerpt:_.string()});import{z as Ji}from"zod";var t1=Ji.object({goal:Ji.string()}),ph=Ji.object({keywords:Ji.array(Ji.string())});import{z as wt}from"zod";var Vc=wt.object({content:wt.string(),ids:wt.string().array(),tokenLength:wt.number()}),qC=wt.object({chunks:Vc.array()}),o1=wt.object({ids:wt.string().array(),score:wt.number(),tokenLength:wt.number()}),i1=qC.extend({description:wt.string().describe("Input to pass to RAG engine"),tokenLimit:wt.number()}),uh=wt.object({ids:wt.number().array()}),mh=wt.object({indices:wt.number().array()});import{z as qc}from"zod";var Kc=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))(Kc||{}),l1=qc.nativeEnum(Kc),KC=qc.enum(["v1","v2"]),c1=KC.or(qc.string().describe("for people with special configurations"));var hh=r=>!(!r.org_id||!r.user_id||!r.platform);import{z as _r}from"zod";var gh=_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")}),Yc=gh.merge(ja).extend({type:_r.literal("REQUEST")}),Jc=gh.merge($a).extend({type:_r.literal("JAVASCRIPT")}),Xc=_r.discriminatedUnion("type",[Jc,Yc]);import{z as Jt}from"zod";import{z as Dr}from"zod";var YC=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,ke=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ws=Dr.string().min(1).max(255).superRefine((r,e)=>{try{_o(r)}catch(t){return e.addIssue({code:Dr.ZodIssueCode.custom,message:t.message,fatal:!0}),Dr.NEVER}});function _o(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(YC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var vs=Dr.preprocess(r=>r===null?"":r,Dr.union([Dr.string().url(),Dr.literal("")])).optional();var fh=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()}),JC=Jt.object({createdAt:Jt.coerce.date(),updatedAt:Jt.coerce.date(),schedule:ko.nullish(),notification:No.nullish(),createdBy:Jt.string(),organizationId:Jt.string()}),XC=fh.merge(JC),L1=XC.extend({steps:Xc.array()}),O1=fh.extend({steps:Xc.array()});import{z as Lt}from"zod";var Sh=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date(),status:Lt.nativeEnum(Ce),message:Lt.string().optional(),data:Lt.unknown().optional()}),QC=Sh.merge(Jc).extend({type:Lt.literal("JAVASCRIPT")}),eR=Sh.merge(Yc).extend({type:Lt.literal("REQUEST")}),tR=Lt.discriminatedUnion("type",[QC,eR]),yh=Lt.object({startedAt:Lt.coerce.date(),finishedAt:Lt.coerce.date().nullish(),status:Lt.nativeEnum(ae),results:tR.array(),failureReason:Lt.string().nullish(),failureDetails:as.nullish()});import{z as Ot}from"zod";var nR=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:yh.array().nullish(),apiTestName:Ot.string().nullish(),apiTestPath:Ot.string().nullish(),apiTestId:Ot.string().nullish()}),z1=nR.pick({status:!0,startedAt:!0,finishedAt:!0});var Xi=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Xi||{}),bh=3;function rR(r){return r==="MODULE"||r==="IFRAME"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function Zi(r){if(!rR(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function Qi(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return bh;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 r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":case"MOUSE_DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Do=class{async reportBillableEvent(e,t,n){}async reportCreditsUsed(e,t,n,o){}};function Zc(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as oR,splitCookiesString as iR}from"set-cookie-parser";import{z as ge}from"zod";var Qc=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(r,e){let t=[],n=iR(r);for(let o of n){let i=oR(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let d=i.sameSite.trim().toLowerCase();if(d==="strict")a="Strict";else if(d==="lax")a="Lax";else if(d==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${d}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=Qc.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let l=[s.name,...Object.keys(s)].map(d=>d.toLowerCase()),c=o.match(/\b(\S+)=([^;]*)/g);if(c)for(let d of c){let[p,u]=d.split("=");if(!p||!u)throw new Error(`Invalid key-value pair in cookie: ${d}`);l.includes(p.toLowerCase())||t.push({...s,name:p,value:u})}}return t}var aR=ge.object({origin:ge.string(),localStorage:ge.array(ge.object({name:ge.string(),value:ge.string()}))}),sR=ge.object({entries:ge.record(ge.string(),ge.array(ge.tuple([ge.unknown(),ge.unknown()]))),version:ge.number().optional()}),Ts=ge.object({cookies:Qc.array().optional(),origins:aR.array().optional(),idb:ge.record(ge.string(),sR).optional().describe("key is db name")});function Es(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=Qc.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var lz=new Set(Object.values(De));var lR={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",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",SUCCESS:"Done"},cz={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"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],SUCCESS:[]},dz={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)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."};import{Faker as mz,en as hz}from"@faker-js/faker";import{z as V}from"zod";var wh=55555,yz=V.object({body:V.string(),to:V.string(),from:V.string()}),bz=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()}),wz=V.object({to:V.string(),from:V.string(),subject:V.string(),body:V.string()}),vz=V.object({inbox:V.string(),afterDate:V.string().pipe(V.coerce.date()).or(V.date()).optional(),timeout:V.number().optional(),trimWhitespace:V.boolean().optional()}),xz=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 vh=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()}),Tz=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 cR=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:cR.optional()}).openapi({ref:"ConsoleLog"}),xh=Cs.array(),dR=xh.array();import*as td from"zod";import{z as I}from"zod";var pR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),uR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),mR=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),Eh=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:mR,comment:I.string().optional()}),hR=I.array(Eh),gR=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()}),Ch=I.array(gR),fR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),Rh=I.array(fR),SR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),yR=I.array(SR),bR=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),wR=I.array(bR),vR=I.object({mimeType:I.string(),params:wR,text:I.string(),comment:I.string().optional()}),xR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:Ch,headers:Rh,queryString:yR,postData:vR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),TR=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()}),ER=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:Ch,headers:Rh,content:TR,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),Th=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),CR=I.object({beforeRequest:Th.optional(),afterRequest:Th.optional(),comment:I.string().optional()}),RR=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()}),Ah=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:xR,response:ER.optional(),cache:CR.optional(),timings:RR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),AR=I.array(Ah),IR=I.object({version:I.string().default("1.1"),creator:pR.optional(),browser:uR.optional(),pages:hR.optional(),entries:AR,comment:I.string().optional()}),PR=I.object({log:IR}),Ih=I.record(I.string(),Eh),Ph=I.record(I.string(),Ah);function ed(r,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(r).sort((t,n)=>new Date(t.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((t,n)=>new Date(t.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}Ee(td);var LR=td.object({logsPerPage:Cs.array().array(),harPages:Ih.optional(),harEntries:Ph.optional()}).openapi({ref:"DebugData"});var Fr=class{async getConsoleLogsForRunAttempt(e,t,n){}async getNetworkLogsForRunAttempt(e,t,n){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,n,o){}async storeNetworkLogsForRunAttempt(e,t,n,o){}async storeScreenshot(e,t,n){}async storeHtmlSnapshot(e,t,n){}};var Rs=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function Lh(r){for(let e of Object.values(pe))if(r.includes(e))return e}var R=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(pe))if(t.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?t:`${e}: ${t}`,n?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e,Object.defineProperty(this,"lastScreenshotBuffer",{value:n?.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,n={}){super(e,n),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]="5f086a40-5ca5-52f7-8f11-37b39098c9c8")}catch(e){}}();
4
+ var _x=Object.create;var zu=Object.defineProperty;var Dx=Object.getOwnPropertyDescriptor;var Fx=Object.getOwnPropertyNames;var Ux=Object.getPrototypeOf,Bx=Object.prototype.hasOwnProperty;var Hu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var zx=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Fx(e))!Bx.call(n,o)&&o!==t&&zu(n,o,{get:()=>e[o],enumerable:!(r=Dx(e,o))||r.enumerable});return n};var Hx=(n,e,t)=>(t=n!=null?_x(Ux(n)):{},zx(e||!n||!n.__esModule?zu(t,"default",{value:n,enumerable:!0}):t,n));var nS=Hu((QK,tS)=>{"use strict";tS.exports=Qf;function Qf(n,e,t){n instanceof RegExp&&(n=Zf(n,t)),e instanceof RegExp&&(e=Zf(e,t));var r=eS(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 Zf(n,e){var t=e.match(n);return t?t[0]:null}Qf.range=eS;function eS(n,e,t){var r,o,i,s,a,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&&!a;)d==l?(r.push(d),l=t.indexOf(n,d+1)):r.length==1?a=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,s=c),c=t.indexOf(e,d+1)),d=l<c&&l>=0?l:c;r.length&&(a=[i,s])}return a}});var dS=Hu((e3,cS)=>{"use strict";var rS=nS();cS.exports=FA;var oS="\0SLASH"+Math.random()+"\0",iS="\0OPEN"+Math.random()+"\0",Rd="\0CLOSE"+Math.random()+"\0",sS="\0COMMA"+Math.random()+"\0",aS="\0PERIOD"+Math.random()+"\0";function Cd(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function _A(n){return n.split("\\\\").join(oS).split("\\{").join(iS).split("\\}").join(Rd).split("\\,").join(sS).split("\\.").join(aS)}function DA(n){return n.split(oS).join("\\").split(iS).join("{").split(Rd).join("}").split(sS).join(",").split(aS).join(".")}function lS(n){if(!n)return[""];var e=[],t=rS("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,s=r.split(",");s[s.length-1]+="{"+o+"}";var a=lS(i);return i.length&&(s[s.length-1]+=a.shift(),s.push.apply(s,a)),e.push.apply(e,s),e}function FA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),ps(_A(n),!0).map(DA)):[]}function UA(n){return"{"+n+"}"}function BA(n){return/^-?0\d/.test(n)}function zA(n,e){return n<=e}function HA(n,e){return n>=e}function ps(n,e){var t=[],r=rS("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?ps(r.post,!1):[""];if(/\$$/.test(r.pre))for(var s=0;s<i.length;s++){var a=o+"{"+r.body+"}"+i[s];t.push(a)}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+Rd+r.post,ps(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=lS(r.body),u.length===1&&(u=ps(u[0],!1).map(UA),u.length===1))return i.map(function(H){return r.pre+u[0]+H});var m;if(d){var h=Cd(u[0]),g=Cd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(Cd(u[2])):1,v=zA,x=g<h;x&&(S*=-1,v=HA);var b=u.some(BA);m=[];for(var T=h;v(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 N=new Array(A+1).join("0");T<0?C="-"+N+C.slice(1):C=N+C}}m.push(C)}}else{m=[];for(var O=0;O<u.length;O++)m.push.apply(m,ps(u[O],!1))}for(var O=0;O<m.length;O++)for(var s=0;s<i.length;s++){var a=o+m[O]+i[s];(!e||d||a)&&t.push(a)}}return t}});var Pi=(n,e)=>{},dc=!1;try{let n=await import("@sentry/node");Pi=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),dc=!0}catch{}import{Command as i_,Option as Vt}from"@commander-js/extra-typings";import{execSync as s_}from"child_process";import uv from"body-parser";import zk from"cors";import Hk from"dedent";import jk from"events";import mv,{Router as $k}from"express";import{diff as MA}from"deep-object-diff";import mn from"fs";import Xr from"path";import{diff as oA}from"deep-object-diff";import{z as ju}from"zod";var y_=ju.object({input:ju.string()});import{z as qe}from"zod";var v_=qe.object({srcs:qe.array(qe.string()),urls:qe.array(qe.string()),desiredSrc:qe.string().optional(),desiredUrl:qe.string().optional()}),$u=qe.object({srcRegex:qe.string().optional(),urlRegex:qe.string().optional()}),Gu=qe.object({x:qe.number(),y:qe.number(),correlation:qe.number()}),x_=qe.object({searchImageBase64String:qe.string(),pageImageBase64String:qe.string(),id:qe.string().uuid(),timeoutMs:qe.number().max(1e4).min(0).optional()});import{z as k}from"zod";import{v4 as ye}from"uuid";import*as w 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 Wu=fe.object({plan:fe.string().optional(),evidence:fe.string().optional(),thoughts:fe.string(),result:fe.boolean(),relevantElements:fe.array(fe.number()).optional()}),yo=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(yo||{});var jx=fe.object({type:fe.literal("ELEMENT_CONTENT"),negated:fe.boolean().optional(),operation:fe.nativeEnum(yo),value:fe.string()}).openapi({ref:"ElementContentAssertion"}),$x=fe.object({type:fe.literal("ELEMENT_ATTRIBUTE"),negated:fe.boolean().optional(),operation:fe.nativeEnum(yo),attr:fe.string(),value:fe.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Li=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(Li||{}),Gx=fe.object({type:fe.literal("ELEMENT_EXISTENCE"),negated:fe.boolean().optional(),condition:fe.nativeEnum(Li).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Vu=fe.discriminatedUnion("type",[jx,$x,Gx]).openapi({ref:"ManualElementAssertion"});var Wx=fe.object({type:fe.literal("CONTENT"),negated:fe.boolean().optional(),value:fe.string()}).openapi({ref:"PageContentAssertion"}),qu=fe.discriminatedUnion("type",[Wx]).openapi({ref:"ManualPageAssertion"});import*as F from"zod";Ee(F);var rr=(a=>(a.AI="AI",a.AI_HEALED="AI_HEALED",a.CLICK_TO_FIND="CLICK_TO_FIND",a.XY_PERCENT="XY_PERCENT",a.RECORDING="RECORDING",a.USER_CSS_SELECTOR="USER_CSS_SELECTOR",a.HEURISTIC_HEALED="HEURISTIC_HEALED",a))(rr||{}),Vx=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),Ar=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:Vx.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(rr).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional()}).openapi({ref:"A11yTargetWithCache"});function Ku(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var qx=F.object({type:F.literal("description"),elementDescriptor:F.string(),a11yData:Ar.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),Kx=F.object({x:F.number(),y:F.number()}),Yx=F.object({type:F.literal("coordinates"),pixels:Kx}).openapi({ref:"CoordinatesTarget"});function or(n){return n.type==="description"}function xn(n){return n.type==="coordinates"}var dt=F.discriminatedUnion("type",[qx,Yx]).openapi({ref:"ElementTarget"});function pc(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 $s=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")}),Yu=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")}),Gs=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 Fe=(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.KEY_DOWN="KEY_DOWN",G.KEY_UP="KEY_UP",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))(Fe||{});Ee(w);var K=w.object({thoughts:w.string().optional(),id:w.string().uuid().describe("unique identifier to this step, used for step cache")}),qt=w.object({useSelector:w.boolean().optional(),force:w.boolean().optional(),disableCache:w.boolean().optional().describe("disable element caching for this step"),iframeUrl:w.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Tn=w.object({target:Ar}).optional().openapi({ref:"SingleTargetCache"}),Ws=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),Jx=K.merge(Ws).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),Vs=qt.merge(w.object({cache:Tn})),bo=K.merge(Vs.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),wo=K.merge(Vs.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),vo=K.merge(Vs.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),xo=K.merge(Vs.merge(w.object({target:dt.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),B_=w.discriminatedUnion("type",[bo,wo,vo,xo]).openapi({ref:"AllScrollCommands"}),Xx=K.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Zx=K.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),Qx=w.discriminatedUnion("type",[w.object({type:w.literal("SUBSTRING"),url:w.string()}),w.object({type:w.literal("GLOB"),glob:w.string()}),w.object({type:w.literal("REGEX"),regex:w.string()})]),eT=w.object({caseInsensitive:w.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:w.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:w.number().int().optional().describe("Max seconds to wait for the URL to match")}),tT=K.extend({type:w.literal("WAIT_FOR_URL"),matcher:Qx}).merge(eT).openapi({ref:"WaitUrlCommand"}),nT=K.merge(Ws).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),rT=K.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),oT=K.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),iT=K.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),sT=K.extend({type:w.literal("AUTH_LOAD"),storageState:w.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),mc=K.merge(qt).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),aT=K.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),lT=K.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),cT=K.merge(Gs).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Mi=K.merge(qt).merge(w.object({type:w.literal("CLICK"),target:dt,doubleClick:w.boolean().optional(),rightClick:w.boolean().optional(),waitForDownload:w.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:w.number().optional(),downloadTimeoutMs:w.number().optional(),cache:Tn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()})).openapi({ref:"ClickCommand"}),ki=K.merge(qt).merge(w.object({type:w.literal("DRAG"),fromTarget:dt,toTarget:dt,steps:w.number().optional(),hoverSeconds:w.number().optional().describe("Seconds to hover the object before dropping"),cache:w.object({fromTarget:Ar.optional(),toTarget:Ar.optional()}).optional()})).openapi({ref:"DragCommand"}),Ni=K.merge(qt).merge(w.object({type:w.literal("MOUSE_DRAG"),target:dt.optional(),deltaX:w.string().describe("pixels to move horizontally, can be template"),deltaY:w.string().describe("pixels to move vertically, can be template"),steps:w.number().optional(),cache:Tn})).openapi({ref:"MouseDragCommand"}),_i=K.merge(qt).merge(w.object({type:w.literal("HOVER"),target:dt,cache:Tn})).openapi({ref:"HoverCommand"}),Di=K.merge(qt).merge(w.object({type:w.literal("FOCUS"),target:dt,cache:Tn})).openapi({ref:"FocusCommand"}),Fi=K.merge(qt).extend({type:w.literal("BLUR"),target:dt.optional(),cache:Tn}).openapi({ref:"BlurCommand"}),dT=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),pT=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),uT=K.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[dT,pT]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),mT=w.discriminatedUnion("type",[w.object({type:w.literal("VALUE"),value:w.string()}),w.object({type:w.literal("LABEL"),label:w.string()}),w.object({type:w.literal("INDEX"),index:w.coerce.string()})]),Ui=K.merge(qt).extend({type:w.literal("SELECT_OPTION"),target:dt,cache:Tn,choice:mT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),hc=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),Ju=K.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:hc.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),En=5,gc=600,Bi=K.merge(qt).extend({type:w.literal("ELEMENT_CHECK"),target:dt,assertion:Vu,cache:Tn,timeout:w.number().int().min(0).max(gc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),hT=K.extend({type:w.literal("PAGE_CHECK"),assertion:qu,iframeUrl:w.string().optional().describe("url or url regex for the iframe"),timeout:w.number().int().min(0).max(gc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),gT=K.merge(w.object({type:w.literal("AI_EXTRACT"),goal:w.string(),schema:w.string().optional(),envKey:w.string().optional(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional()})).openapi({ref:"AIExtractCommand"}),fT=w.object({clearContent:w.boolean().optional(),forceClearContent:w.boolean().optional(),delay:w.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:w.boolean().optional(),pressEnter:w.boolean().optional()}),Xu=25,zi=K.merge(qt).merge(fT).extend({type:w.literal("TYPE"),target:dt.optional(),value:w.string(),cache:Tn}).openapi({ref:"TypeCommand"}),ST=K.merge(w.object({type:w.literal("PRESS"),value:w.string(),repeat:w.number().optional(),convertMeta:w.boolean().optional(),delayMs:w.number().optional()})).openapi({ref:"PressCommand"}),yT=K.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),bT=K.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),wT=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),vT=w.object({type:w.literal("REGEX"),pattern:w.string()}),xT=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),TT=w.discriminatedUnion("type",[wT,vT,xT]),ET=K.merge(Ws).merge(w.object({type:w.literal("TAB"),action:TT})).openapi({ref:"TabCommand"}),CT=K.merge(Ws).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),RT=K.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),AT=K.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),IT=K.extend({type:w.literal("REQUEST")}).merge($s).openapi({ref:"RequestCommand"}),PT=K.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(Yu).openapi({ref:"GraphQLRequestCommand"}),LT=K.merge(w.object({type:w.literal("SUCCESS"),condition:Ju.optional()})).openapi({ref:"SuccessCommand"}),OT=K.merge(w.object({type:w.literal("FAILURE")})).openapi({ref:"FailureCommand"}),MT=w.object({data:w.string().describe("location at which to find a jpg"),width:w.number(),height:w.number()}),Hi=K.merge(qt).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:dt.optional(),screenshot:MT.optional(),cache:Tn})).openapi({ref:"VisualDiffCommand"}),kT=K.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),pattern:w.string(),key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),NT=K.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),_T=K.merge(w.object({type:w.literal("RECORD_REQUESTS"),pattern:w.string(),key:w.string()})).openapi({ref:"RecordRequestsCommand"}),DT=K.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),FT=K.merge(w.object({type:w.literal("SET_HEADER"),name:w.string(),value:w.string(),urlPattern:w.string().optional().describe("URL pattern to match")})).openapi({ref:"SetHeaderCommand"}),Zu=w.discriminatedUnion("type",[Mi,zi,ST,yT,bT,Ui,Jx,wo,bo,Ju,_i,Zx,LT]),UT=w.discriminatedUnion("type",[gT,sT,iT,mc,RT,aT,Xx,ki,Bi,uT,rT,oT,cT,AT,Ni,CT,hT,lT,nT,IT,PT,vo,xo,ET,Hi,Di,Fi,tT,kT,NT,_T,DT,FT]),To=w.discriminatedUnion("type",[...Zu.options,...UT.options]).openapi({ref:"Command"}),qs=w.discriminatedUnion("type",[...Zu.options,OT]);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"KEY_DOWN":case"KEY_UP":e={id:ye(),type:n,value:""};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 Qu(n){switch(n.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":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 BT}from"zod";var G_=BT.discriminatedUnion("type",[Fi,mc,Mi,ki,Di,_i,Ni,bo,wo,vo,xo,Ui,zi,Hi,Bi]);function em(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as zT}from"zod";var Rt={type:!0,cache:!0},Ir=zT.discriminatedUnion("type",[Fi.pick(Rt),Mi.pick(Rt),ki.pick(Rt),Bi.pick(Rt),Di.pick(Rt),_i.pick(Rt),Ni.pick(Rt),bo.pick(Rt),wo.pick(Rt),vo.pick(Rt),xo.pick(Rt),Ui.pick(Rt),zi.pick(Rt),Hi.pick(Rt)]),fc=Object.values(Fe).filter(n=>Ir.options.some(e=>e.shape.type.safeParse(n).success));To.options.forEach(n=>{if("target"in n.shape&&!fc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as yc}from"zod";import{z as Sc}from"zod";import{z as Eo}from"zod";var At=Eo.object({index:Eo.number().optional().describe("global index within a test (in-order traversal)"),id:Eo.string(),skipped:Eo.boolean().optional(),envKey:Eo.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:Eo.boolean().optional()});Ee(Sc);var It=At.extend({type:Sc.literal("PRESET_ACTION"),command:To,skipped:Sc.boolean().optional()}).openapi({ref:"PresetAction"});Ee(yc);var Pr=At.extend({type:yc.literal("AI_ACTION"),text:yc.string(),steps:It.array().optional()}).openapi({ref:"AIAction"});import{z as ce}from"zod";var HT=ce.object({cacheKey:ce.string(),cacheExpiryMs:ce.number()}),bc=At.extend({id:ce.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:ce.record(ce.string()).optional(),cacheConfig:HT.optional()}),Hn=bc.extend({type:ce.literal("MODULE"),moduleId:ce.string().uuid()}),jT=ce.union([Hn.pick({type:!0,moduleId:!0}),ce.record(ce.unknown())]),$T=ce.object({type:ce.literal("URL_REGEX"),regex:ce.string()}),GT=ce.object({type:ce.literal("PAGE_CHECK"),substring:ce.string()}),wc=ce.object({cacheInvalidation:ce.discriminatedUnion("type",[GT,$T]).optional()}),Pt=ce.object({moduleId:ce.string().uuid(),name:ce.string(),description:ce.string().nullish(),enabled:ce.boolean().nullish(),parameters:ce.string().array().nullish(),defaultParameters:ce.record(ce.string(),ce.string()).nullish(),defaultCacheKey:ce.string().nullish(),defaultCacheTtl:ce.number().nullish(),defaultCacheAllInvocations:ce.boolean().nullish(),autoAuth:ce.boolean().nullish(),advanced:wc.nullish()});import{z as it}from"zod";import{z as vc}from"zod";Ee(vc);var Co=At.extend({type:vc.literal("AI_ACTION_DYNAMIC"),text:vc.string()}).openapi({ref:"AIActionDynamic"});import{z as tm}from"zod";var xc=At.extend({type:tm.literal("CONDITIONAL"),skipped:tm.boolean().optional()});import{z as Ks}from"zod";var WT=Ks.object({type:Ks.literal("url"),url:Ks.string()}),ji=At.extend({type:Ks.literal("IFRAME"),identifier:WT});import{z as Kt}from"zod";var Tc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(Tc||{});var VT=Kt.discriminatedUnion("type",[Kt.object({type:Kt.literal("NAVIGATE_URL"),url:Kt.string().url()}),Kt.object({type:Kt.literal("GO_TO_SECTION_START")})]),qT=Kt.object({trigger:Kt.nativeEnum(Tc).optional(),attempts:Kt.number().int().optional(),restartBehavior:VT}),$i=At.extend({type:Kt.literal("SECTION"),description:Kt.string().describe("user provided goal of what the section should accomplish"),plan:Kt.string().array().optional(),autohealingConfig:qT.optional()});var nm=Pt.merge(bc).extend({type:it.literal("RESOLVED_MODULE"),steps:it.lazy(()=>Pe.array())}),Ec=Pt.extend({steps:it.lazy(()=>Pe.array())}),Cc=ji.extend({steps:it.lazy(()=>ve.array())}),KT=ji.extend({steps:it.lazy(()=>Pe.array())}),Rc=$i.extend({steps:it.lazy(()=>ve.array())}),YT=$i.extend({steps:it.lazy(()=>Pe.array())}),Lr=xc.extend({blocks:it.object({assertion:it.lazy(()=>It),steps:it.lazy(()=>ve.array())}).array(),elseSteps:it.lazy(()=>ve.array().optional())}),JT=xc.extend({blocks:it.object({assertion:it.lazy(()=>It),steps:it.lazy(()=>Pe.array())}).array(),elseSteps:it.lazy(()=>Pe.array().optional())}),ve=it.discriminatedUnion("type",[It,Pr,Co,Hn,Lr,Cc,Rc]),Pe=it.discriminatedUnion("type",[It,Pr,Co,nm,JT,KT,YT]);import{z as Yt}from"zod";var XT=Yt.object({steps:ve.array(),beforeSteps:ve.array().nullish(),afterSteps:ve.array().nullish()}),Ro=Yt.object({steps:Pe.array(),beforeSteps:Pe.array().nullish(),afterSteps:Pe.array().nullish()}),Or=Yt.object({steps:Yt.record(Yt.string(),Yt.unknown()).array(),beforeSteps:Yt.record(Yt.string(),Yt.unknown()).array().nullish(),afterSteps:Yt.record(Yt.string(),Yt.unknown()).array().nullish()});var _e="1.0.20";import{z as ir}from"zod";var Ac=ir.object({key:ir.string(),testId:ir.string().optional(),moduleId:ir.string().optional(),organizationId:ir.string(),value:Ir}),ZT=Ac.extend({uniqueKey:ir.string()}),rm=ir.record(ir.string(),ZT);var om=k.object({phrase:k.string()}),Ic=k.object({thoughts:k.string().optional(),result:k.union([k.literal("NOT_FOUND"),k.string(),k.number(),k.array(k.unknown()),k.record(k.unknown(),k.unknown()),k.unknown()])}),$F=k.object({text:k.string()}),im=k.object({thoughts:k.string(),review:k.string().optional(),id:k.number().int()}),Ys=(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))(Ys||{});var sm=k.object({thoughts:k.string(),category:k.nativeEnum(Ys)}),QT=k.discriminatedUnion("op",[k.object({op:k.literal("replace"),path:k.string(),value:k.string()}),k.object({op:k.literal("add"),path:k.string(),value:k.string()}),k.object({op:k.literal("remove"),path:k.string()})]),GF=k.object({thoughts:k.string(),patches:QT.array()}),am=[k.literal("add"),k.literal("replace"),k.literal("remove")],eE=k.object({op:k.union(am),path:k.string(),value:Pe.optional()}),lm=k.object({patches:eE.array(),thoughts:k.string()});var tE=k.object({thoughts:k.string(),op:k.union(am),value:k.union([k.null(),Pe])}),cm=k.object({reasoning:k.string(),scenario:k.string(),patch:tE.or(k.null())}),WF=k.object({thoughts:k.string(),evaluation:k.number().min(1).max(10)}),VF=k.object({observations:k.string(),reasoning:k.string(),command:qs});var Pc=k.object({summary:k.string(),reasoning:k.string(),evaluation:k.discriminatedUnion("type",[k.object({type:k.literal("DONE")}),k.object({type:k.literal("RIGHT_TRACK")}),k.object({type:k.literal("WRONG_TRACK"),feedback:k.string()}),k.object({type:k.literal("IMPOSSIBLE")})])});import{z as _}from"zod";import*as te from"zod";var ZF=te.object({thoughts:te.string().optional().describe("only provided if a description was provided"),target:Ar.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")}),dm=te.union([te.literal("ELEMENT_CHECK"),te.literal("NEGATED_CHECK"),te.literal("SELECT_OPTION"),te.literal("TYPE")]);function Mr(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 Gi=(s=>(s.USER_SELECTOR="USER_SELECTOR",s.CSS_SELECTOR="CSS_SELECTOR",s.HYBRID_SELECTOR="HYBRID_SELECTOR",s.HTML_DISTANCE="HTML_DISTANCE",s.TEMPLATE_MATCHING="TEMPLATE_MATCHING",s.AUTO_FRAME="AUTO_FRAME",s))(Gi||{}),Ao=te.object({matched:te.boolean(),reason:te.string().optional().describe("Human understandable description"),logs:te.string().array().optional().describe("Logs for debugging")}),nE=Ao.extend({type:te.literal("USER_SELECTOR")}),rE=Ao.extend({type:te.literal("CSS_SELECTOR"),selectors:te.string().array()}),oE=Ao.extend({type:te.literal("HYBRID_SELECTOR")}),iE=Ao.extend({type:te.literal("HTML_DISTANCE"),distance:te.number().optional(),closestElement:te.string().optional(),savedElement:te.string().optional()}),sE=Ao.extend({type:te.literal("TEMPLATE_MATCHING"),elementImageUrl:te.string().url()}),aE=Ao.extend({type:te.literal("AUTO_FRAME"),logs:te.string().array().optional()}),pm=te.discriminatedUnion("type",[nE,rE,oE,iE,sE,aE]);import{z as Yi}from"zod";import{z as PC}from"zod";import*as X from"zod";import{cloneDeep as Vi}from"lodash-es";var lE=n=>{let e=um(n,0);if(e===void 0||!dE(n[e]))return;let t=um(n,e+1);if(t!==void 0)return pE(n,e,t)},mm=lE,um=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!cE(r))return t}},cE=n=>n===" "||n===" "||n===`
5
+ `||n==="\r",dE=n=>n==="{"||n==="[",pE=(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 uE(r);if(r===void 0)r=i;else if(r[0]===i)r+=i;else return}},uE=n=>n===void 0?0:n[0]===" "?n.length:n;var hm=(n,e)=>{let t=Lc(n,"toPrecision",e,e);return t===void 0?Lc(n,"toExponential",e,e):t},Lc=(n,e,t,r)=>{let i=n[e](r).replace(mE,"$1").replace(hE,"$1");return i.length<=t?i:r===1?void 0:Lc(n,e,t,r-1)},mE=/(e)\+/iu,hE=/\.?0*($|e)/iu;var fm=(n,e)=>{if(typeof n!="string")throw new TypeError(`Input must be a JSON string: ${n}`);gE(e)},gE=n=>{if(fE(n),n<0)throw new TypeError(`"maxSize" argument must be positive: ${n}`);if(n<gm)throw new TypeError(`"maxSize" argument must be at least ${gm}: ${n}`)},fE=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}`)},gm=7;var Js=(n,e,t)=>{let r=ym(e,t);return Sm(n,e,r)},Sm=(n,e,t)=>{if(t>=e)return t;let r=n[t];return r>=CE&&r<=RE?Sm(n,e,t+1):t},Xs=(n,e,t)=>{if(t===void 0)return t;let r=ym(e,t);return SE(n,r)},SE=(n,e)=>yE(n,e)?e-3:bE(n,e)?e-2:wE(n,e)?e-1:e,yE=(n,e)=>e>=3&&n[e-3]>=vE&&n[e-3]<=xE,bE=(n,e)=>e>=2&&n[e-2]>=TE,wE=(n,e)=>e>=1&&n[e-1]>=EE,ym=(n,e)=>e<0||Object.is(e,-0)?Math.max(n+e,0):e,vE=240,xE=244,TE=224,EE=194,CE=128,RE=191;var bm=(n,e,t)=>{let r=globalThis.Buffer.from(n),o=Js(r,r.length,e),i=Xs(r,r.length,t);return o===0&&i>=r.length?r.toString():r.toString("utf8",o,i)};var wm=/[\uD800-\uDFFF]/gu,vm="\uFFFD";var Zs=n=>AE(n)?n.replace(wm,vm):n,AE=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 kc=({input:n,targetByteCount:e,firstStartSurrogate:t,lastStartSurrogate:r,firstEndSurrogate:o,lastEndSurrogate:i,increment:s,canBacktrack:a,shift:l,charIndexInit:c})=>{let d=c,p=d,u=0;for(;u<e;d+=s){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+s);Number.isNaN(g)||g<o||g>i||(u+=1,d+=s)}return(a&&u>e?p:d)+l};var Nc=(n,e,t)=>e<0||Object.is(e,-0)?kE(n,e,t):ME(n,e,t),ME=(n,e,t)=>kc({input:n,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),kE=(n,e,t)=>kc({input:n,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:n.length-1});var Qs=(n,e,t)=>{let r=Nc(n,e,!1),o=NE(n,t),i=r===0&&o===void 0?n:n.slice(r,o);return Zs(i)},NE=(n,e)=>{if(e===void 0)return e;let t=Nc(n,e,!0);return t===n.length?void 0:t};var Tm=(n,e,t)=>{let{textEncoder:r,textDecoder:o}=_E(),i=DE(n),{written:s}=r.encodeInto(n,i),a=Js(i,s,e),l=Xs(i,s,t),c=l===void 0?s:Math.min(l,s),d=i.subarray(a,c);return o.decode(d)},_E=()=>(_c===void 0&&(_c=new globalThis.TextEncoder,xm=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:_c,textDecoder:xm}),_c,xm,DE=n=>{let e=n.length*3;return e>FE?new Uint8Array(e):((ea===void 0||ea.length<e)&&(ea=new Uint8Array(e)),ea)},FE=1e5,ea;var Em=(n,e)=>{if(e===void 0)return e;let t=Dc(n,e);return t>=n.length*Cm?void 0:t},Dc=(n,e)=>e<=n.length*-Cm?0:e,Cm=4;var Rm=(n,e,t)=>{if(typeof n!="string")throw new TypeError(`First argument must be a string: ${n}`);UE(e),BE(t)},UE=n=>{if(n===void 0)throw new TypeError("Second argument is required.");Am("Second",n)},BE=n=>{n!==void 0&&Am("Third",n)},Am=(n,e)=>{if(!Number.isInteger(e))throw new TypeError(`${n} argument must be an integer: ${e}`)};var Im=n=>{let e=!0,t=0;for(let r=0;r<Fc;r+=1){let o=zE(n,r);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/Fc}},zE=(n,e)=>{let t=Fc-1,r=1-(t-e)/t,o=Math.round(r*(n.length-1));return n.charCodeAt(o)},Fc=50;var HE=(n,e,t)=>{if(Rm(n,e,t),n==="")return n;let r=Dc(n,e),o=Em(n,t);return o===void 0&&Object.is(r,0)?Zs(n):jE(n,r,o)},Pm=HE,jE=(n,e,t)=>{if(n.length<=$E)return Qs(n,e,t);let{asciiOnly:r,longCharsPercentage:o}=Im(n);return r?WE(n,e,t):o>=GE?Qs(n,e,t):Lm(n,e,t)},$E=200,GE=.4,WE=(n,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?bm(n,e,t):Lm(n,e,t),Lm=(n,e,t)=>"TextEncoder"in globalThis?Tm(n,e,t):Qs(n,e,t);var Mm=(n,e)=>{let t=JSON.stringify(n),r=KE(t),o=Pm(r,0,e-Om.length-Wi.length*2),s=`${VE(o)}${Om}`;return YE(s)},VE=n=>n.replace(qE,""),qE=/(\\|\\u[0-9a-fA-F]{0,3})$/u,KE=n=>n.slice(Wi.length,-Wi.length),YE=n=>`${Wi}${n}${Wi}`,Wi='"',Om="...";var km=n=>globalThis.Buffer.byteLength(n);var Uc=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<=XE){t+=1;continue}if(t+=2,o<ZE||o>QE)continue;let i=n.charCodeAt(r+1);i<eC||i>tC||(r+=1)}return t},JE=127,XE=2047,ZE=55296,QE=56319,eC=56320,tC=57343;var Nm=()=>nC.bind(void 0,new TextEncoder),nC=(n,e)=>{let t=rC(e);return n.encodeInto(e,t).written},rC=n=>{let e=n.length*3;return e>oC?new Uint8Array(e):((ta===void 0||ta.length<e)&&(ta=new Uint8Array(e)),ta)},oC=1e5,ta;var sC=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?km:"TextEncoder"in globalThis?aC.bind(void 0,Nm()):Uc,aC=(n,e)=>e.length<100?Uc(e):n(e),_m=sC();var Dm=n=>{if(n===null)return lC;if(n===!0)return cC;if(n===!1)return dC;let e=typeof n;return e==="object"?pC:e==="number"?JSON.stringify(n).length:Bc(n)},lC=4,cC=4,dC=5,pC=2,Bc=n=>_m(JSON.stringify(n));var na=({size:n,increment:e,maxSize:t,truncatedProps:r,path:o,value:i})=>{let s=n+e,a=s>t;return a?{size:n,stop:a,truncatedProps:[...r,{path:o,value:i}]}:{size:s,stop:a,truncatedProps:r}},Um=n=>Dm(n),Bm=(n,e,t)=>{let r=Hm({empty:n,indent:e,depth:t,keySpaceSize:0}),o=jm(n);return r+o},zm=({key:n,empty:e,indent:t,depth:r})=>{let o=Hm({empty:e,indent:t,depth:r,keySpaceSize:1}),i=Bc(n),s=jm(e);return o+i+uC+s},uC=1,Hm=({empty:n,indent:e,depth:t,keySpaceSize:r})=>{if(e===void 0)return 0;let o=Fm+e*(t+1),i=n?Fm+e*t:0;return r+o+i},Fm=1,jm=n=>n?0:mC,mC=1;var ra=({parent:n,truncatedProps:e,path:t,increment:r,maxSize:o,key:i,empty:s,size:a,truncateValue:l,indent:c,depth:d})=>{let p=n[i],u=[...t,i],{size:m,stop:h,truncatedProps:g}=na({size:a,increment:r,maxSize:o,truncatedProps:e,path:u,value:p});return h?{empty:s,size:m,truncatedProps:g}:hC({value:p,truncatedProps:e,path:u,maxSize:o,empty:s,size:a,newSize:m,truncateValue:l,indent:c,depth:d})},hC=({value:n,truncatedProps:e,path:t,maxSize:r,empty:o,size:i,newSize:s,truncateValue:a,indent:l,depth:c})=>{let{value:d,size:p,truncatedProps:u}=a({value:n,truncatedProps:e,path:t,size:s,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 $m=({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:s,depth:a})=>{let l=[],c={empty:!0,size:r,truncatedProps:e};for(let d=0;d<n.length;d+=1){let p=Bm(c.empty,s,a);c=ra({parent:n,truncatedProps:c.truncatedProps,path:t,increment:p,maxSize:o,key:d,empty:c.empty,size:c.size,truncateValue:i,indent:s,depth:a}),c.value!==void 0&&l.push(c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var Gm=({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:s,depth:a})=>{let l={},c={empty:!0,size:r,truncatedProps:e};for(let d in n){let p=zm({key:d,empty:c.empty,indent:s,depth:a});c=ra({parent:n,truncatedProps:c.truncatedProps,path:t,increment:p,maxSize:o,key:d,empty:c.empty,size:c.size,truncateValue:i,indent:s,depth:a}),c.value!==void 0&&(l[d]=c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var oa=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>{let a=Um(n),{size:l,stop:c,truncatedProps:d}=na({size:r,increment:a,maxSize:o,truncatedProps:e,path:t,value:n});return c?{value:void 0,size:l,truncatedProps:d}:gC({value:n,truncatedProps:d,path:t,size:l,maxSize:o,indent:i,depth:s})},gC=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>typeof n!="object"||n===null?{value:n,size:r,truncatedProps:e}:Array.isArray(n)?$m({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:oa,indent:i,depth:s}):Gm({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:oa,indent:i,depth:s});var fC=(n,e)=>{fm(n,e);let t=SC(n),r=yC(n),{value:o,truncatedProps:i}=oa({value:r,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:bC({newValue:o,value:r,maxSize:e,indent:t}),truncatedProps:i}},Io=fC,SC=n=>{let e=mm(n);return typeof e=="string"?e.length:e},yC=n=>{try{return JSON.parse(n)}catch(e){throw new TypeError(`Invalid JSON string: "${n}"
7
+ ${e.message}`)}},bC=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?hm(e,t):Mm(e,t);import*as Nr from"zod";import{z as dn}from"zod";import{z as yt}from"zod";var zc=yt.object({autoFollowNewTabs:yt.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:yt.boolean().optional(),ignoreHrefForCaching:yt.boolean().optional(),hybridSelectorMode:yt.enum(["test","prefer"]).optional()});var Wm=1e4,Vm=6e4,kr=zc.extend({pageLoadTimeoutMs:yt.number().optional().refine(n=>n===void 0||n<=Vm&&n>=-1,{message:`Page load timeout must be between 0 and ${Vm/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:yt.number().optional().refine(n=>n===void 0||n<=Wm&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${Wm/1e3} seconds`}),localChromeExtensionPaths:yt.string().array().optional(),extraHeaders:yt.record(yt.string(),yt.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:yt.string().optional(),disableGpu:yt.boolean().optional(),bustCacheOnBoundingBoxChange:yt.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:yt.boolean().optional().describe("Allow fetching the partial accessibility tree if the full tree takes too long.")});var We="BASE_URL",ia="CURRENT_URL",Po="ENV_NAME",cU={[We]:"https://www.google.com"},qm=dn.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),Km=dn.object({name:dn.string(),variables:dn.record(dn.string().describe("variable name"),dn.string().describe("variable value"))}),Ym=dn.object({name:dn.string(),variables:dn.record(dn.string().describe("variable name"),dn.unknown().describe("variable value")),browser:kr.optional()});Ee(Nr);var qi=Nr.object({env:Nr.record(Nr.unknown())}).openapi({ref:"TestContextSnapshot"}),wC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",vC=[We,Po],Jm=[ia,We,Po],Lt=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[We]??"about:blank",o=e.env[ia]??"about:blank",i=e.env[Po],s={};for(let[l,c]of Object.entries(e.env))Jm.includes(l)||(t??{})[l]===void 0&&(s[l]=c);return new n({baseUrl:r,currentUrl:o,dynamicVariables:s,envName:i,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Vi(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){vC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Po]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Vi(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>Jm.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,wC]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Io(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Io(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[ia]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Vi(e.variablesFromEnvironment),this.setMomenticSystemVariable(We,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Po,e.envName)}getDynamicVariablesCopy(){return Vi(this.env)}getVariablesFromEnvironmentCopy(){return Vi(this.varsFromMomenticEnvironment)}};import{z as _r}from"zod";Ee(_r);var de=(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))(de||{});var Xm=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],sa={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"},Lo={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."},Hc=_r.object({reason:_r.nativeEnum(de),summary:_r.string()}).openapi({ref:"TestResultClassification"}),aa=_r.object({errorMessage:_r.string(),errorStack:_r.string().optional(),classification:Hc.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||{}),jc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(jc||{}),$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()}),xC=$c.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(jc),message:X.string().optional(),elementInteracted:X.string().optional()}),sr=$c.extend({status:X.nativeEnum(Ce),message:X.string().optional(),data:X.unknown().optional(),beforeTestContext:qi.optional(),afterTestContext:qi.optional(),failureReason:X.nativeEnum(de).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"}),la=sr.merge(It).extend({results:xC.array(),proposedStep:It.optional()}),TC=sr.merge(Pr).extend({results:X.lazy(()=>la.array())}),EC=sr.merge(Co).extend({results:X.lazy(()=>la.array())}),CC=sr.merge(Hn).extend({moduleName:X.string().optional(),results:X.lazy(()=>Ot.array())}),RC=sr.merge(Lr).extend({assertion:la.optional(),results:X.lazy(()=>Ot.array()).describe("results for the block actually executed")}),AC=sr.merge(ji).extend({results:X.lazy(()=>Ot.array())}),IC=sr.merge($i).extend({results:X.lazy(()=>Ot.array()),healingAttempts:X.lazy(()=>Ot.array().array()).optional()}),Ot=X.discriminatedUnion("type",[TC,EC,la,CC,RC,AC,IC]),ca=sr.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),da=$c.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var Gc=PC.object({results:Ot.array().describe("main results"),beforeResults:Ot.array().optional(),afterResults:Ot.array().optional()}),pa=Gc.partial();import{z as W}from"zod";import{z as Re}from"zod";var LC=Re.object({type:Re.literal("FAILURE_RECOVERY"),thoughts:Re.string()}),OC=Re.object({type:Re.literal("DESCRIPTION_UPDATE"),thoughts:Re.string()}),ua=Re.discriminatedUnion("type",[OC,LC]),ma=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(ma||{}),MC=Re.object({testId:Re.string(),name:Re.string(),orgId:Re.string(),runId:Re.string(),purpose:Re.nativeEnum(ma).catch("AUTO_HEALING"),steps:Pe.array(),details:ua.or(ua.array()).optional()}),_U=MC.pick({name:!0,orgId:!0}),Wc=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(ma).catch("AUTO_HEALING"),runId:Re.string().nullish(),details:ua.or(ua.array()).nullish(),applied:Re.boolean().nullish(),appliedAt:Re.coerce.date().nullish()}),Zm=Wc.extend({steps:Pe.array()});import{isValidCron as kC}from"cron-validator";import{z as re}from"zod";import{z as Vc}from"zod";var jn=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r))(jn||{});var ha=Vc.object({width:Vc.number().min(200).max(1e4),height:Vc.number().min(200).max(1e4)}),Qm={"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}},UU=Object.keys(Qm);var Jt=Qm["Desktop Large"],Oo="en-us",Mo="America/Los_Angeles";var ko={latitude:37.7749,longitude:-122.4194};var eh=["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 th=2e3,ga=kr.extend({browserType:re.nativeEnum(jn).optional(),slowMoMs:re.number().optional().refine(n=>n===void 0||n<=th&&n>=-1,{message:`Slow motion must be between 0 and ${th} milliseconds`}),basicAuthorization:re.object({username:re.string().optional(),password:re.string().optional()}).optional(),geolocation:re.object({latitude:re.coerce.number().refine(n=>n>=-90&&n<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:re.coerce.number().refine(n=>n>=-180&&n<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:re.boolean().optional(),locale:re.string().optional(),timezone:re.enum(eh).optional(),colorScheme:re.enum(["light","dark"]).optional()}),nh=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],NC=re.object({disableAICaching:re.boolean().optional(),failureRecovery:re.boolean().optional().describe("undefined means inherit org settings")});var _C=re.object({viewport:ha.optional()}),No=_C.merge(NC).merge(ga),_o=re.object({cron:re.string().refine(n=>kC(n),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:re.boolean().default(!1),env:re.string().optional(),timeZone:re.string().default("America/Los_Angeles"),jobKey:re.string().optional()}),Do=re.object({onSuccess:re.boolean().default(!1),failureMessage:re.string().optional(),onFailure:re.boolean().default(!0),successMessage:re.string().optional()}),DC=re.object({name:re.string(),required:re.boolean().optional(),defaultValue:re.string().describe("this is not optional because we need a value when the editor is first loaded")}),fa=DC.array(),FC=re.object({name:re.string(),value:re.string()}),rh=FC.array(),Sa=re.object({name:re.string(),default:re.boolean().optional(),fixtures:qm.array().optional()});Ee(W);var Xt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},ie=(a=>(a.PENDING="PENDING",a.RUNNING="RUNNING",a.PASSED="PASSED",a.FAILED="FAILED",a.CANCELLED="CANCELLED",a.RETRYING="RETRYING",a.WAITING_FOR_USER="WAITING_FOR_USER",a))(ie||{}),ya=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(ya||{});var Ve=W.string().pipe(W.coerce.date()).or(W.date()),Ki=W.object({id:W.string(),runKey:W.string(),organizationId:W.string(),createdAt:Ve,createdBy:W.string(),flake:W.boolean().nullish(),scheduledAt:Ve.or(W.null()),startedAt:Ve.or(W.null()),updatedAt:Ve.nullish(),finishedAt:Ve.or(W.null()),resolvedBaseUrl:W.string().nullish(),environmentName:W.string().nullish(),labels:W.array(W.string()).optional(),cliVersion:W.string().nullish(),section:W.nativeEnum(ya).nullish(),status:W.nativeEnum(ie),trigger:W.nativeEnum(Xt),attempts:W.number(),runAttempts:W.array(W.object({id:W.string(),status:W.nativeEnum(ie),startedAt:Ve.or(W.null()),finishedAt:Ve.or(W.null())})).optional(),videos:W.array(W.string()).optional(),failureReason:W.nativeEnum(de).nullish(),failureDetails:aa.nullish(),testFragments:W.array(Wc).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"}),UC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},ba=Ki.pick({...UC,test:!0}),oh=Ki.omit({failureReason:!0,failureDetails:!0,test:!0}),qc=Ki.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(Gc),ih=n=>n.includes("PASSED")&&n.includes("FAILED");var BC=Yi.object({id:Yi.string().uuid(),startedAt:Ve.or(Yi.null()),finishedAt:Ve.or(Yi.null()),status:Yi.nativeEnum(ie)}).merge(pa),sB=BC.array();var Ji=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Ji||{});import{z as Ke}from"zod";var zC=Ke.object({id:Ke.string(),status:Ke.nativeEnum(ie),trigger:Ke.nativeEnum(Xt),createdAt:Ve,startedAt:Ve.nullish(),finishedAt:Ve.nullish(),gitCommitSha:Ke.string().nullish(),gitCommitShaShort:Ke.string().nullish(),gitCommitTimestamp:Ve.nullish(),gitBranchName:Ke.string().nullish(),gitOriginUrl:Ke.string().nullish(),gitCommitMessage:Ke.string().nullish(),gitCommitAuthorName:Ke.string().nullish(),githubRepository:Ke.string().nullish(),gitlabProjectPath:Ke.string().nullish(),pipelineId:Ke.string().nullish(),cliVersion:Ke.string().nullish(),suite:Ke.object({id:Ke.string(),name:Ke.string()}).nullish(),runs:Ke.object({status:Ke.nativeEnum(ie)}).array()}).openapi({ref:"RunGroup"}),sh=zC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:ba.array()});import{z as Ze}from"zod";var HC=Ze.object({type:Ze.literal("TARGETING"),name:Ze.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:pm.array(),pageState:Ze.string().optional(),targetSource:Ze.nativeEnum(rr).optional(),targetUpdateTime:Ze.string().optional()}),jC=Ze.object({type:Ze.literal("AI_LOCATION"),matched:Ze.boolean(),pageState:Ze.string().optional(),ragUsed:Ze.boolean().optional(),thoughts:Ze.string().optional()}),$C=Ze.object({type:Ze.literal("ASSERTION"),relevantElementsSerialized:Ze.string().array().optional(),pageState:Ze.string().optional(),ragUsed:Ze.boolean().optional()}),ah=Ze.discriminatedUnion("type",[HC,jC,$C]);function wa(){return{details:[]}}import{z as Ue}from"zod";var GC=Ue.object({id:Ue.string(),name:Ue.string()}),wB=GC.merge(Ue.object({createdAt:Ve,createdBy:Ue.string(),schedule:_o,notification:Do,environment:Ue.object({name:Ue.string()}).nullish(),beforeTests:Ue.object({id:Ue.string()}).array().nullish(),afterTests:Ue.object({id:Ue.string()}).array().nullish()})),lh=Ue.object({id:Ue.string().uuid(),orgId:Ue.string(),createdAt:Ve,startedAt:Ve.or(Ue.null()),finishedAt:Ve.or(Ue.null()),status:Ue.nativeEnum(ie),trigger:Ue.nativeEnum(Xt),suite:Ue.object({id:Ue.string(),name:Ue.string()}).nullish(),runs:Ki.array()}),vB=lh.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),ch=lh.extend({runs:ba.array()});import{z as Zt}from"zod";import{cloneDeep as CB}from"lodash-es";import{z as me}from"zod";var LB=me.object({thoughts:me.string(),subGoals:me.object({instruction:me.string()}).array()}),OB=me.object({thoughts:me.string(),newPlanMarkdown:me.string()}),MB=me.object({thoughts:me.string(),correct:me.boolean(),failedActionIndex:me.number().optional()}),WC=me.object({type:me.literal("PLANNING"),beforePlan:me.string(),goalDecision:me.string(),thoughts:me.string()}),VC=me.object({type:me.literal("RUNNING"),stepDisplayName:me.string(),status:me.nativeEnum(Ce),results:Ot.array()}),qC=me.object({type:me.literal("REVISING"),beforePlan:me.string(),afterPlan:me.string(),errString:me.string(),diffs:me.string(),thoughts:me.string()}),KC=me.object({type:me.literal("SYSTEM"),message:me.string()}),YC=me.discriminatedUnion("type",[WC,VC,qC,KC]),dh=YC.array();var FB=Zt.object({id:Zt.string(),scheduledAt:Zt.coerce.date().nullable(),startedAt:Zt.coerce.date().nullable(),finishedAt:Zt.coerce.date().nullable(),status:Zt.nativeEnum(ie),history:dh.nullable(),testPlan:Zt.object({id:Zt.string(),name:Zt.string()}).nullable(),test:Zt.object({id:Zt.string(),name:Zt.string()}).nullable()});var Qt=_.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()}),ph=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),source:dm.optional().catch(void 0)}),uh=_.object({target:_.string().or(_.number()),browserState:_.string().optional(),screenshot:_.string().optional(),boundingBox:_.object({x:_.number(),y:_.number(),height:_.number(),width:_.number()}).optional()}),mh=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string().optional(),returnSchema:_.string().optional()}),hh=_.object({goal:_.string(),browserState:_.string(),screenshot:_.string(),url:_.string(),contextChoice:hc.optional()}),gh=_.object({command:To}),Kc=_.object({goal:_.string(),browserState:_.string(),startingScreenshot:_.string().optional(),screenshot:_.string(),url:_.string(),history:JC.array(),actionHint:_.string().optional(),lastError:_.string().optional()}),fh=_.object({results:da.array(),errorMessage:_.string(),errorStack:_.string().optional()}),Sh=_.object({results:da.array(),goal:_.string(),errorMessage:_.string()}),yh=_.object({failedResults:da.array(),nextStepsSerialized:_.string().array(),currentUrl:_.string(),currentPageState:_.string(),currentScreenshot:_.string()}),r1=_.object({description:_.string(),type:_.union([_.literal("locator"),_.literal("assertion"),_.literal("ai-action")]),excerpt:_.string()});import{z as Xi}from"zod";var s1=Xi.object({goal:Xi.string()}),bh=Xi.object({keywords:Xi.array(Xi.string())});import{z as bt}from"zod";var Yc=bt.object({content:bt.string(),ids:bt.string().array(),tokenLength:bt.number()}),XC=bt.object({chunks:Yc.array()}),c1=bt.object({ids:bt.string().array(),score:bt.number(),tokenLength:bt.number()}),d1=XC.extend({description:bt.string().describe("Input to pass to RAG engine"),tokenLimit:bt.number()}),wh=bt.object({ids:bt.number().array()}),vh=bt.object({indices:bt.number().array()});import{z as Jc}from"zod";var Xc=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))(Xc||{}),m1=Jc.nativeEnum(Xc),ZC=Jc.enum(["v1","v2"]),h1=ZC.or(Jc.string().describe("for people with special configurations"));var xh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as Dr}from"zod";var Th=Dr.object({id:Dr.string().uuid(),skipped:Dr.boolean().optional(),envKey:Dr.string().optional().describe("key in the environment to save the result of this step to")}),Zc=Th.merge($s).extend({type:Dr.literal("REQUEST")}),Qc=Th.merge(Gs).extend({type:Dr.literal("JAVASCRIPT")}),ed=Dr.discriminatedUnion("type",[Qc,Zc]);import{z as en}from"zod";import{z as Fr}from"zod";var QC=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,ke=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 va=Fr.string().min(1).max(255).superRefine((n,e)=>{try{Fo(n)}catch(t){return e.addIssue({code:Fr.ZodIssueCode.custom,message:t.message,fatal:!0}),Fr.NEVER}});function Fo(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(QC))throw new Error("Name cannot be a UUID. Please choose a different name.")}var xa=Fr.preprocess(n=>n===null?"":n,Fr.union([Fr.string().url(),Fr.literal("")])).optional();var Eh=en.object({id:en.string(),name:va,description:en.string().optional().nullish(),baseUrl:xa.nullish(),schemaVersion:en.string(),advanced:en.unknown().optional(),retries:en.number(),envs:en.array(Sa).nullish(),parameters:fa.nullish()}),eR=en.object({createdAt:en.coerce.date(),updatedAt:en.coerce.date(),schedule:_o.nullish(),notification:Do.nullish(),createdBy:en.string(),organizationId:en.string()}),tR=Eh.merge(eR),_1=tR.extend({steps:ed.array()}),D1=Eh.extend({steps:ed.array()});import{z as Mt}from"zod";var Ch=Mt.object({startedAt:Mt.coerce.date(),finishedAt:Mt.coerce.date(),status:Mt.nativeEnum(Ce),message:Mt.string().optional(),data:Mt.unknown().optional()}),rR=Ch.merge(Qc).extend({type:Mt.literal("JAVASCRIPT")}),oR=Ch.merge(Zc).extend({type:Mt.literal("REQUEST")}),iR=Mt.discriminatedUnion("type",[rR,oR]),Rh=Mt.object({startedAt:Mt.coerce.date(),finishedAt:Mt.coerce.date().nullish(),status:Mt.nativeEnum(ie),results:iR.array(),failureReason:Mt.string().nullish(),failureDetails:aa.nullish()});import{z as kt}from"zod";var sR=kt.object({id:kt.string(),organizationId:kt.string(),createdAt:kt.coerce.date(),updatedAt:kt.coerce.date(),createdBy:kt.string(),scheduledAt:kt.coerce.date().nullish(),startedAt:kt.coerce.date().nullish(),finishedAt:kt.coerce.date().nullish(),status:kt.nativeEnum(ie),trigger:kt.nativeEnum(Xt),results:Rh.array().nullish(),apiTestName:kt.string().nullish(),apiTestPath:kt.string().nullish(),apiTestId:kt.string().nullish()}),W1=sR.pick({status:!0,startedAt:!0,finishedAt:!0});var Zi=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(Zi||{}),Ah=3;function aR(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function Qi(n){if(!aR(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 es(n){switch(n.type){case"AI_EXTRACT":case"AI_ASSERTION":return Ah;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"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}var Uo=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function td(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as lR,splitCookiesString as cR}from"set-cookie-parser";import{z as ge}from"zod";var nd=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 Ta(n,e){let t=[],r=cR(n);for(let o of r){let i=lR(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let s;if(i.sameSite){let d=i.sameSite.trim().toLowerCase();if(d==="strict")s="Strict";else if(d==="lax")s="Lax";else if(d==="none")s="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 a=nd.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:s});t.push(a);let l=[a.name,...Object.keys(a)].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({...a,name:p,value:u})}}return t}var dR=ge.object({origin:ge.string(),localStorage:ge.array(ge.object({name:ge.string(),value:ge.string()}))}),pR=ge.object({entries:ge.record(ge.string(),ge.array(ge.tuple([ge.unknown(),ge.unknown()]))),version:ge.number().optional()}),Ea=ge.object({cookies:nd.array().optional(),origins:dR.array().optional(),idb:ge.record(ge.string(),pR).optional().describe("key is db name")});function Ca(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=nd.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 mz=new Set(Object.values(Fe));var uR={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",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",SUCCESS:"Done"},hz={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"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],SUCCESS:[]},gz={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)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."};import{Faker as yz,en as bz}from"@faker-js/faker";import{z as V}from"zod";var Ih=55555,Tz=V.object({body:V.string(),to:V.string(),from:V.string()}),Ez=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()}),Cz=V.object({to:V.string(),from:V.string(),subject:V.string(),body:V.string()}),Rz=V.object({inbox:V.string(),afterDate:V.string().pipe(V.coerce.date()).or(V.date()).optional(),timeout:V.number().optional(),trimWhitespace:V.boolean().optional()}),Az=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 Ph=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()}),Iz=V.object({id:V.string().optional(),orgId:V.string(),momenticLambdaAuthHash:V.string(),code:V.string(),fragment:V.boolean(),state:qi,timeoutMs:V.number().optional()}),ar=15e3;import*as ut from"zod";Ee(ut);var mR=ut.object({url:ut.string(),lineNumber:ut.number(),columnNumber:ut.number()}).openapi({ref:"CodeLocation"}),Ra=ut.object({timestamp:ut.number(),text:ut.string(),type:ut.string(),tabIndex:ut.number(),args:ut.unknown().array().optional(),url:ut.string().optional(),location:mR.optional()}).openapi({ref:"ConsoleLog"}),Lh=Ra.array(),hR=Lh.array();import*as od from"zod";import{z as I}from"zod";var gR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),fR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),SR=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),Mh=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:SR,comment:I.string().optional()}),yR=I.array(Mh),bR=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()}),kh=I.array(bR),wR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),Nh=I.array(wR),vR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),xR=I.array(vR),TR=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),ER=I.array(TR),CR=I.object({mimeType:I.string(),params:ER,text:I.string(),comment:I.string().optional()}),RR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:kh,headers:Nh,queryString:xR,postData:CR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),AR=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()}),IR=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:kh,headers:Nh,content:AR,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),Oh=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),PR=I.object({beforeRequest:Oh.optional(),afterRequest:Oh.optional(),comment:I.string().optional()}),LR=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()}),_h=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:RR,response:IR.optional(),cache:PR.optional(),timings:LR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),OR=I.array(_h),MR=I.object({version:I.string().default("1.1"),creator:gR.optional(),browser:fR.optional(),pages:yR.optional(),entries:OR,comment:I.string().optional()}),kR=I.object({log:MR}),Dh=I.record(I.string(),Mh),Fh=I.record(I.string(),_h);function rd(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(od);var NR=od.object({logsPerPage:Ra.array().array(),harPages:Dh.optional(),harEntries:Fh.optional()}).openapi({ref:"DebugData"});var Ur=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 Aa=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function Uh(n){for(let e of Object.values(de))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(de))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 Oh(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function nd(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}function ea(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}var Ur=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as OR}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 Mh=Rn.union([Rn.string(),Rn.number(),Rn.boolean(),Rn.null(),Rn.record(Rn.string(),Rn.lazy(()=>Mh)),Rn.array(Rn.lazy(()=>Mh))]),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=OR(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="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")}},pH=new ta({},{});var rd={".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"},kh=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],mH=Object.keys(rd);import*as Nh from"zod";var gH=Nh.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as sr}from"zod";var yH=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:Mo,retries:Ke.number(),envs:Ke.array(fs).nullish(),parameters:gs.nullish(),disabled:Ke.boolean().optional(),labels:Ke.array(Ke.string()).optional().catch([])}),CH=vt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),MR=Ke.object({labels:Ke.array(Ke.string()).optional(),outputs:Ym.nullish()}),Xt=vt.merge(MR),kR=Ke.object({createdAt:Ke.coerce.date(),updatedAt:Ke.coerce.date(),updatedBy:Ke.string().nullable(),schedule:ko,notification:No,createdBy:Ke.string(),organizationId:Ke.string(),folderId:Ke.string().nullable().optional()}),NR=vt.merge(kR),RH=NR.merge(Eo),As=vt.merge(Eo),AH=vt.merge(Lr);var _h=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()}),_R=P.array(_h.extend({id:P.string(),name:P.string(),description:P.string().optional(),labels:P.string().array().optional()})),DR=P.array(_h.extend({id:P.string(),name:P.string(),description:P.string().optional(),content:vc})),_H=P.object({tests:_R,modules:DR,labels:P.string().array()}),DH=As.merge(Xt),Dh=P.object({schemaVersion:P.string(),stepLists:Eo}),Fh=Xt.partial().merge(vt.pick({id:!0})),Uh=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()}),FH=As.merge(P.object({relativeFilePath:P.string().describe("relative to project root")})),Bh=P.object({name:P.string()}),UH=P.object({relativeFilePath:P.string()}),zh=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")}),Hh=P.object({description:P.string(),enabled:P.boolean()}).partial();var BH=P.array(Hm),jh=P.object({defaultEnv:P.string().optional().describe("name of the default env, or undefined to unset")}),$h=P.object({configFilePath:P.string().describe("full path on disk")}),zH=P.string().array(),HH=P.object({message:P.string(),newRelativeTestPath:P.string().optional()}),od=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()}),Gh=P.object({pathSegments:P.array(P.string())}),jH=P.object({absolutePath:P.string(),pathSegments:P.array(P.string()),contents:P.array(od)}),Wh=P.object({pathSegments:P.array(P.string())}),Vh=P.object({pathSegments:P.array(P.string()),newPathSegments:P.array(P.string())}),qh=P.object({pathSegments:P.array(P.string()),recursive:P.boolean().optional()}),$H=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"],Kh=Is.map(r=>`**/${r}/**`);import An from"chalk";var FR=["app","version","env","namespace","host"];function Ue(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!FR.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var id=class r{minLogLevel;logBindings;constructor(e,t){this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,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 Bh(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator"):!1}function id(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 ts(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 Br=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as _R}from"lodash-es";import{z as Rn}from"zod";var zt=(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))(zt||{});var zh=Rn.union([Rn.string(),Rn.number(),Rn.boolean(),Rn.null(),Rn.record(Rn.string(),Rn.lazy(()=>zh)),Rn.array(Rn.lazy(()=>zh))]),ns=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=_R(this.flags);return Object.entries(e).forEach(([t,r])=>{typeof r=="boolean"&&Object.values(zt).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")}},fH=new ns({},{});var sd={".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"},Hh=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],yH=Object.keys(sd);import*as jh from"zod";var wH=jh.custom().refine(n=>n&&n.length>0).refine(n=>n&&n[0]instanceof File,{message:"Please upload a valid file."});import{z as lr}from"zod";var TH=lr.object({id:lr.string(),name:lr.string(),createdAt:lr.coerce.date(),createdBy:lr.string(),updatedAt:lr.coerce.date(),updatedBy:lr.string().nullable(),organizationId:lr.string()});import{z as P}from"zod";import{z as Ye}from"zod";var wt=Ye.object({id:Ye.string(),name:va,baseUrl:xa,description:Ye.string().optional().nullish(),schemaVersion:Ye.string(),advanced:No,retries:Ye.number(),envs:Ye.array(Sa).nullish(),parameters:fa.nullish(),disabled:Ye.boolean().optional(),labels:Ye.array(Ye.string()).optional().catch([])}),LH=wt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),DR=Ye.object({labels:Ye.array(Ye.string()).optional(),outputs:rh.nullish()}),tn=wt.merge(DR),FR=Ye.object({createdAt:Ye.coerce.date(),updatedAt:Ye.coerce.date(),updatedBy:Ye.string().nullable(),schedule:_o,notification:Do,createdBy:Ye.string(),organizationId:Ye.string(),folderId:Ye.string().nullable().optional()}),UR=wt.merge(FR),OH=UR.merge(Ro),Ia=wt.merge(Ro),MH=wt.merge(Or);var $h=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()}),BR=P.array($h.extend({id:P.string(),name:P.string(),description:P.string().optional(),labels:P.string().array().optional()})),zR=P.array($h.extend({id:P.string(),name:P.string(),description:P.string().optional(),content:Ec})),zH=P.object({tests:BR,modules:zR,labels:P.string().array()}),HH=Ia.merge(tn),Gh=P.object({schemaVersion:P.string(),stepLists:Ro}),Wh=tn.partial().merge(wt.pick({id:!0})),Vh=P.object({name:P.string(),description:P.string().optional(),baseUrl:P.string().url().optional(),environment:P.string().optional(),browserType:P.nativeEnum(jn).optional(),viewport:ha.optional(),pathSegments:P.string().array().optional()}),jH=Ia.merge(P.object({relativeFilePath:P.string().describe("relative to project root")})),qh=P.object({name:P.string()}),$H=P.object({relativeFilePath:P.string()}),Kh=P.object({name:P.string(),description:P.string(),enabled:P.boolean(),steps:P.lazy(()=>Pe.array()),testFilePath:P.string().describe("relative to the project root"),folderPath:P.string().optional().describe("user selected folder path")}),Yh=P.object({description:P.string(),enabled:P.boolean()}).partial();var GH=P.array(Ym),Jh=P.object({defaultEnv:P.string().optional().describe("name of the default env, or undefined to unset")}),Xh=P.object({configFilePath:P.string().describe("full path on disk")}),WH=P.string().array(),VH=P.object({message:P.string(),newRelativeTestPath:P.string().optional()}),ad=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()}),Zh=P.object({pathSegments:P.array(P.string())}),qH=P.object({absolutePath:P.string(),pathSegments:P.array(P.string()),contents:P.array(ad)}),Qh=P.object({pathSegments:P.array(P.string())}),eg=P.object({pathSegments:P.array(P.string()),newPathSegments:P.array(P.string())}),tg=P.object({pathSegments:P.array(P.string()),recursive:P.boolean().optional()}),KH=P.object({success:P.boolean(),message:P.string(),pathSegments:P.array(P.string()).optional()});var Pa=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],ng=Pa.map(n=>`**/${n}/**`);import An from"chalk";var HR=["app","version","env","namespace","host"];function Be(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!HR.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var ld=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 s=Object.entries(o);for(let[a,l]of s){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
- `)),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(`
12
+ `)),console.log(t(` ${a}:`,c))}}else if(o)for(let s of o){let a=s;typeof s=="object"&&(a=JSON.stringify(s,void 0,2),a=a.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,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 r(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},y=new id(1,{}),Br={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Br,flush:()=>{},bindings:()=>({})},Ps={},zr=({logger:r,logKey:e,maxCount:t,intervalMs:n},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++,r.debug(o,i,...a)),s.timer=setTimeout(()=>{let l=Ps[e];l?.totalCount!==l?.count&&r.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete Ps[e]},n)};import{z as Ze}from"zod";var Yh=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:Sc.nullish()}),nj=Yh.extend({steps:Ze.lazy(()=>be.array())}),Jh=5*60*1e3,ad=At.merge(Yh.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as ij}from"date-fns-tz";import{z as Be}from"zod";var sd=Be.object({failureRecovery:Be.boolean().optional(),aiAction:Be.boolean().optional(),stepLintSuggestions:Be.boolean().optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()}),Xh=Be.object({fakerConstantSeed:Be.boolean().optional()}),cj=Be.object({ai:sd.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:Fc.optional()}),dj=Be.object({globalOverrides:Be.record(Be.string()).optional(),agentConfig:Be.record(Be.string(),Be.string()).optional()});import*as E from"zod";var Zh="x-momentic-cli-version",Qh="x-momentic-main-branch-name",eg="x-momentic-branch-name",tg="x-momentic-commit-timestamp",ng="x-momentic-last-commit-on-main",rg="x-momentic-last-commit-on-main-timestamp",Ej=E.object({error:E.boolean(),reason:E.string(),message:E.string()}),Cj=Yt.merge(Wc),og=Va,Rj=Yt.merge(Wc);var Aj=Yt.merge(ah).extend({useConsensus:E.boolean().optional(),attemptNumber:E.number().optional()}),ld=Fu,Ij=Yt.merge(sh),ig=Zu,Pj=Yt.merge(rh),ag=Xu,Lj=Yt.merge(oh),sg=Ju,Oj=Yt.merge(ih);var Mj=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()}),lg=E.object({queuedTests:E.unknown().array(),runIds:E.string().uuid().array(),runGroupId:E.string().optional()});var kj=E.string().array(),Nj=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")})]),cg=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"))}),UR=E.object({test:E.string().describe("test YAML"),modules:E.record(E.string().describe("moduleId"),E.string().describe("module YAML"))}),_j=UR.array(),Dj=E.object({testId:E.string(),schemaVersion:E.string()}).merge(Lr),Fj=E.object({entries:E.array(Ec),testId:E.string()}),Uj=E.object({testId:E.string(),uniqueKeys:E.string().array()}),Bj=E.object({steps:E.array(E.record(E.unknown())),testId:E.string(),schemaVersion:E.string(),organizationId:E.string()}),dg=Yu,pg=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()}),zj=E.object({id:E.string()}),ug=E.object({status:E.nativeEnum(ae),updatedAt:E.coerce.date().optional(),finishedAt:E.coerce.date().optional()}),mg=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()}),Hj=E.object({id:E.string()}),BR=Gc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),hg=BR.array(),gg=Gc.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(),jj=E.object({id:E.string()}),fg=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()}),$j=E.object({screenshot:E.string()}),Sg=E.object({key:E.string()}),yg=E.object({orgId:E.string(),userId:E.string()}),bg=E.array(zm),Gj=E.record(E.string(),E.union([E.string(),E.boolean()])),Wj=E.object({paths:E.string().array(),env:E.string().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional()}),wg=E.object({suiteRunIds:E.string().array(),runGroupIds:E.string().array()}),Vj=E.object({suiteRunIds:E.string().array()}),qj=th.array(),Kj=E.object({runGroupIds:E.string().array()}),na=E.object({uploadUrl:E.string()}),Yj=Yt.merge(lh),Jj=Yt.merge(dh),Xj=Yt.merge(ch),zR=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()}),HR=E.object({transactionId:E.string(),timestamp:E.string(),event:E.nativeEnum(Xi),properties:zR}),Zj=HR.array(),vg=Gm.omit({steps:!0}).extend({steps:E.array(E.record(E.string(),E.unknown())).describe("unparsed ResolvedStep[]")}),Qj=E.object({limit:E.number().max(10).optional(),afterTime:E.number().optional()}),xg=Jm.array(),e$=E.object({applied:E.boolean().optional(),appliedAt:E.coerce.date().optional()}),t$=Yt.extend({chunks:Vc.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()}),Tg=na.extend({id:E.string()}),n$=E.object({runGroupId:E.string().uuid().optional()}),Eg=E.object({runGroupId:E.string().uuid()});import{z as Pe}from"zod";var Cg=Pe.object({orgId:Pe.string(),cacheKeys:Pe.string().array()}),i$=Pe.object({keyParams:Cg,clientMetadata:Pe.string(),lockAcquisitionTimeoutMs:Pe.number().optional()}),Rg=Pe.object({acquired:Pe.boolean(),acquiredByMetadata:Pe.string(),keyPrefix:Pe.string()}),a$=Pe.object({keyPrefix:Pe.string(),result:Pe.string(),ttlMs:Pe.number()}),s$=Pe.union([Pe.object({keyPrefix:Pe.string()}),Cg]),jR=Pe.object({remainingTtlMs:Pe.number(),value:Pe.string().nullish()}),l$=Pe.object({results:Pe.record(Pe.string(),jR),activeLocks:Pe.string().array()}),Ag=0,Ig=5*60*1e3;import{z as pn}from"zod";var Pg="test",Lg="module",Mt=(t=>(t.TEST=`${Pg}.yaml`,t.MODULE=`${Lg}.yaml`,t))(Mt||{}),Ae=(t=>(t.TEST=`momentic/${Pg}`,t.MODULE=`momentic/${Lg}`,t))(Ae||{}),g$=vt.merge(Lr),cd=At.extend({steps:pn.array(pn.record(pn.string(),pn.unknown())),schemaVersion:pn.string()}),f$=cd.extend({fileType:pn.literal(Ae.MODULE)}),S$=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 $R=at.object({version:at.string(),json:at.record(at.unknown()),hash:at.string()}),Og=at.record(at.unknown()),v$=at.object({newSvgs:at.array($R),metadata:Og.optional()}),GR=at.object({version:at.string(),json:at.record(at.unknown()).nullish(),hash:at.string(),description:at.string().nullish(),metadata:Og.nullish()}),Mg=at.record(at.string().describe("icon hash"),GR);import{validator as R$}from"@exodus/schemasafe";var kg=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as U$}from"zod";import{z as Ye}from"zod";var H$=Ye.object({repositoriesIndexed:Ye.boolean(),indexingInProgress:Ye.boolean(),indexesOutdated:Ye.boolean()}),Ng=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(Ng||{}),_g=(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))(_g||{}),j$=Ye.object({name:Ye.string(),status:Ye.nativeEnum(Ng),conclusion:Ye.nativeEnum(_g).nullable()}),dd=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 pd=Ne.object({assertion:Ne.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),WR=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:pd.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.")}),Dg=WR.extend({subSteps:Ne.lazy(()=>Dg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),Fg=Ne.object({name:Ne.string().describe("Short name describing the test plan"),description:Ne.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),Ug=Fg.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(r=>r??void 0)}),V$=Ug.extend({testGenRuns:Ne.tuple([]).or(Ne.tuple([Ne.object({id:Ne.string(),startedAt:Ne.coerce.date(),status:Ne.nativeEnum(ae)})]))}),Bg=Ne.object({preConditions:pd.array().nullish().transform(r=>r??[]),postConditions:pd.array().nullish().transform(r=>r??[]),steps:Dg.array().nullish().transform(r=>r??[])}),q$=Ug.extend({plan:Bg.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),VR=Fg.extend({plan:Bg.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),K$=VR.array().nullish().transform(r=>r??[]);var Q$=90*24*60*60*1e3,eG=14*24*60*60*1e3,tG=7*24*60*60*1e3;import{z as Le}from"zod";var qR=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()}),lG=qR.extend({finishedAt:Le.coerce.date().optional().transform(r=>r??new Date)}),KR=Le.object({startedAt:Le.coerce.date()}).merge(fg).merge(ds),cG=KR.extend({finishedAt:Le.coerce.date().optional().transform(r=>r??new Date)}),YR=gg.merge(mg).extend({status:Le.nativeEnum(ae),startedAt:Le.coerce.date(),attempts:Le.number()}),dG=YR.extend({finishedAt:Le.coerce.date().optional().transform(r=>r??new Date)}),JR=pg.merge(ug).extend({id:Le.string().uuid().optional(),startedAt:Le.coerce.date(),cliVersion:Le.string()}),ra=JR.extend({updatedAt:Le.coerce.date().optional().transform(r=>r??new Date),finishedAt:Le.coerce.date().optional().transform(r=>r??new Date)});import XR from"semver";import{z as ZR}from"zod";var hG=ZR.string().refine(r=>XR.valid(r),{message:"must be a valid semver string"});var Ls=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};function ud(r){let e={parentChain:[]};return Os(r,e),e}function Os(r,e){let{onPresetAction:t,onSimpleStepContainer:n,onConditional:o,earlyStop:i}=r;for(let a of r.steps)switch(a.type){case"PRESET_ACTION":if(t(a,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(a,e)&&i)return!0;e.parentChain.push(a);for(let l of a.blocks)if(t(l.assertion,e)&&i||Os({...r,steps:l.steps},e)&&i)return!0;if(Os({...r,steps:a.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"IFRAME":case"SECTION":case"AI_ACTION":if(n?.(a,e)&&i)return!0;if(a.steps){if(e.parentChain.push(a),Os({...r,steps:a.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(n?.(a,e)&&i)return!0;break}default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(a)}}function zg(r,e,t,n){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==i[s])return!1;i.shift()}return!!QR([r],t,i).result}function QR(r,e,t=[]){let n,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?(n=a,o=s.parentChain,!0):!1};return ud({steps:r,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:n,parentChain:o}}function Hg(r,e){e(r);for(let t in r){let n=r[t];n&&(Array.isArray(n)?Ms(n,e):typeof n=="object"&&Hg(n,e))}}function Ms(r,e){for(let t of r)t&&(Array.isArray(t)?Ms(t,e):typeof t=="object"&&Hg(t,e))}import{cloneDeep as jg}from"lodash-es";import{v4 as md}from"uuid";async function Zt(r){let e=new Map,t=new Set,n=jg(r.stepLists.steps),o=await Hr({...r,steps:n,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=jg(r.stepLists[a]);if(!s)continue;let l=await Hr({...r,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:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:l}=e,c={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let d of r)switch(delete d.index,delete d.aiSuggested,d.id=l?md():d.id,d.type){case"PRESET_ACTION":{let u=d.command;u.id=l?md():u.id,Gg(u),"cache"in u&&u.cache&&(n&&(c.cachesToSave=c.cachesToSave.concat($g({id:u.id,orgId:n.orgId,testId:n.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?md():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:n?{...n}: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 Fo({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,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=tA(u.id,m),g=h.find(f=>!!n[f]);g?d(u,n[g]):s.push(h[0])};for(let u of r)switch(u.type){case"RESOLVED_MODULE":{c+=u.steps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Fo({...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}=Fo({...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(!mc.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}=Fo({...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}=Fo({...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:n.length},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:l}}function Wg(r,e){return e?`${e}:${r}`:r}function tA(r,e){let t=[],n=e?.split(":")??[];for(let o=n.length;o>=0;o--){let i=[...n.slice(o),r];t.push(i.join(":"))}return t.reverse(),t}function $g(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
15
- ${JSON.stringify(t)}`);let n=[];if(!r.skipIntermediateEntries)for(let o=e.length;o>0;o--){let i=t[o-1],a=e.slice(o,e.length).join(":");n.push({key:Wg(r.id,a),moduleId:i,organizationId:r.orgId,value:r.value})}return n.push({key:Wg(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function Gg(r){switch(r.type){case"DRAG":{if(r.fromTarget.type==="coordinates"||r.toTarget.type==="coordinates"||!r.fromTarget?.a11yData||!r.toTarget?.a11yData)return;r.cache={fromTarget:r.fromTarget.a11yData,toTarget:r.toTarget.a11yData},delete r.fromTarget.a11yData,delete r.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(r.target?.type==="coordinates"||!r.target?.a11yData)return;r.cache={target:r.target.a11yData},delete r.target.a11yData;return}default:return}}function Vg(r){let e=new Set;return Ms(r,t=>{if("type"in t&&t.type==="RESOLVED_MODULE"&&"moduleId"in t){let n=t.moduleId;typeof n=="string"&&!e.has(n)&&e.add(n)}}),e}function qg(r,e,t){e.length&&(r.type==="DRAG"?e.length!==2||!e.every(n=>n.cache)?t.warn({newTargets:e,cmd:r},"New targets for step are incorrect"):r.fromTarget.type==="description"&&r.toTarget.type==="description"&&(r.cache={fromTarget:e[0].cache,toTarget:e[1].cache}):e.length!==1||!e[0]?.cache?t.warn({newTargets:e,cmd:r},"New targets for step are incorrect"):"target"in r&&r.target&&r.target.type==="description"&&(r.cache={target:e[0].cache}))}async function ks({logger:r,cacheStorage:e,orgId:t,testId:n,originalSteps:o,updatedSteps:i}){let a=eA(o,i);if(Object.keys(a).length>0){r.info({changes:a},"Updating steps caches post-run success");try{let{cachesToSave:s}=await Zt({stepLists:i,cacheCreationParams:{testId:n,orgId:t}});await e.saveStepCacheEntries(s,n,r)}catch(s){r.error({err:s},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}function ze(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var lr={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},cr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},hd={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},gd={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function nA(r){switch(r.type){case"ELEMENT_CONTENT":return`${r.negated?cr[r.operation]:lr[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?cr[r.operation]:lr[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?gd[r.condition]:hd[r.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var SV={CONTENT:"The page"};function rA(r){switch(r.type){case"VALUE":return`the option with value ${r.value}`;case"LABEL":return`the option with label ${r.label}`;case"INDEX":return`the option at index ${r.index}`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function fd(r){switch(r.type){case"SUBSTRING":return`match substring '${r.url}'`;case"REGEX":return`match regex '${r.regex}'`;case"GLOB":return`match glob '${r.glob}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function oA(r){switch(r.type){case"CONTENT":return`${r.negated?cr.CONTAINS:lr.CONTAINS} '${r.value}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.type)}}function jr(r){switch(r.type){case"SUCCESS":return r.condition?.assertion?`Check success condition: ${r.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${r.goal}`;case"NAVIGATE":return`Go to URL: ${ze(r.url,30)}`;case"DIALOG":return`Automatically ${r.action.toLowerCase()} the next dialog`;case"CAPTCHA":return"Solve captchas on the page";case"GO_BACK":return"Go back to the previous page";case"GO_FORWARD":return"Go forward to the next page";case"SCROLL_DOWN":return`Scroll down ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${pt(r.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${r.deltaY?`${r.deltaY}px`:"1 page height"}${r.target?` in the container of: ${pt(r.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${pt(r.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${r.deltaX?`${r.deltaX}px`:"1 page width"}${r.target?` in the container of: ${pt(r.target)}`:""}`;case"WAIT":return`Wait for ${r.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(r.target?.type==="coordinates")return`Click at coordinates: ${pt(r.target)}`;let t="";return r.target?.elementDescriptor.length?t=` on element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(t=` on element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Click${t}`}case"FOCUS":return`Focus ${pt(r.target)}`;case"BLUR":return`Focus ${pt(r.target)}`;case"DRAG":return`Drag ${pt(r.fromTarget)} onto ${pt(r.toTarget)}`;case"MOUSE_DRAG":return r.target?.type==="description"&&r.target.elementDescriptor?`Click and drag ${pt(r.target)} by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`:`Click and drag mouse by ${r.deltaX}px horizontally, ${r.deltaY}px vertically`;case"TYPE":{let t="";return r.target?.type==="coordinates"?t=` in element at coordinates: ${pt(r.target)}`:r.target?.elementDescriptor.length?t=` in element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(t=` in element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Type '${r.value}'${t||""}`}case"HOVER":{let t="";return r.target.type==="coordinates"?t=` over coordinates: ${pt(r.target)}`:r.target.elementDescriptor.length>0?t=` over element: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(t=` over element: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Hover${t}`}case"PRESS":return`Press ${r.value}`;case"KEY_DOWN":return`Hold down ${r.value} on the keyboard`;case"KEY_UP":return`Release ${r.value} on the keyboard`;case"SELECT_OPTION":{let t="",n=rA(r.choice);return r.target.type==="coordinates"?t=` from element at coordinates: ${pt(r.target)}`:r.target.elementDescriptor.length>0?t=` from: '${r.target.elementDescriptor}'`:r.cache?.target.nodeOnlySerializedHtml&&(t=` from: '${r.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${n}'${t}`}case"TAB":switch(r.action.type){case"SUBSTRING":return`Switch to tab with substring: ${r.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${r.action.pattern}`;case"INDEX":return`Switch to tab at index: ${r.action.index}`;default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${r.url}`;case"REQUEST":return`Send ${r.method} request to ${r.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${r.url}`;case"COOKIE":return`Set cookie: ${r.value}`;case"LOCAL_STORAGE":return`Set local storage: ${r.key}: ${r.value}`;case"JAVASCRIPT":return`Run JavaScript: ${ze(r.code,30)}`;case"AI_ASSERTION":return`Assertion: '${r.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${r.target?`for element: ${pt(r.target)}`:"for entire page"}`;case"FILE_UPLOAD":return r.fileSource.type==="URL"?`Upload file: ${r.fileSource.url}`:`Upload file: ${r.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${pt(r.target)} ${nA(r.assertion)}`;case"PAGE_CHECK":return`Check the page ${oA(r.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${fd(r.matcher)}`;case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return r.pattern?`Register a listener for network requests that match ${r.pattern}`:"Register a listener for network requests";case"AWAIT_LISTENER":return r.key?`Wait for the listener ${r.key} to resolve`:"Wait for a listener to resolve";case"RECORD_REQUESTS":return r.pattern?`Start recording requests that match ${r.pattern}`:"Start recording network requests";case"GET_RECORDED_REQUESTS":return r.key?`Get the requests that were recorded for ${r.key}`:"Get the requests that were recorded";case"SET_HEADER":return r.name?r.urlPattern?`Set a ${r.name} header for requests that match ${r.urlPattern}`:`Set a ${r.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"})(r)}}function Kg(r){let e=[];for(let t of r){t.sort((a,s)=>a.timestamp-s.timestamp);let n=[],o,i=1;for(let a of t)o&&o.text===a.text&&o.type===a.type&&JSON.stringify(o.args??null)===JSON.stringify(a.args??null)?i++:(o&&(i>1?o.args&&o.args.length?o.args.push(`(repeated ${i} times)`):o.text+=` (repeated ${i} times)`:n.push(o)),o=a,i=1);o&&n.push(o),e.push(n)}return e}import{cloneDeep as iA}from"lodash-es";import{cloneDeep as vV,unset as xV}from"lodash-es";function un(r){switch(r.type){case"AI_ACTION":return`AI action: ${ze(r.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${ze(r.text,100)}`;case"PRESET_ACTION":return jr(r.command);case"MODULE":return`Module: ${r.id}`;case"RESOLVED_MODULE":return`Module: ${r.name}`;case"CONDITIONAL":return"Conditional step";case"IFRAME":return"Frame step";case"SECTION":return`Section${r.description?`with goal: ${ze(r.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(r)}}var Yg=1e3,Jg=3e6,aA="[FAILED]";async function Xg(r,e,t,n){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(n){let o=await e.getScreenshot(r,n);if(o)return`data:image/jpeg;base64,${Buffer.from(o).toString("base64")}`}}async function Ns(r,e,t,{numScreenshots:n=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=`${aA} ${m.description}`,o&&(c=d);try{let h=Qm.array().parse(p.details);for(let g of h)"pageState"in g&&a&&(m.pageState=g.pageState)}catch{}}n>0&&d>=t.length-n&&(m.afterScreenshot=await Xg(r,e,p.afterScreenshot,p.afterSnapshot),i&&(m.beforeScreenshot=await Xg(r,e,p.beforeScreenshot,p.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function $r(r){let e=un(r);switch(r.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
16
- `;for(let t=0;t<r.results.length;t++)e+=Je(`Sub-step ${t} in AI action:
17
- `,2),e+=`${Je($r(r.results[t]),2)}
18
- `,e+=Je(`${"=".repeat(10)}
14
+ `)),console.log(" ",t(a))}}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}},cd=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}flush(){}bindings(){return{}}},rg=new cd,y=new ld(1,{}),zr={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>zr,flush:()=>{},bindings:()=>({})},La={},Hr=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...s)=>{let a=La[e];a?clearTimeout(a.timer):(a={count:0,totalCount:0},La[e]=a),a.totalCount++,a.count<t&&(a.count++,n.debug(o,i,...s)),a.timer=setTimeout(()=>{let l=La[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete La[e]},r)};import{z as Qe}from"zod";var og=Qe.object({id:Qe.string(),createdAt:Qe.coerce.date(),createdBy:Qe.string(),organizationId:Qe.string(),name:Qe.string(),description:Qe.string().nullish(),enabled:Qe.boolean(),schemaVersion:Qe.string().describe("Schema version for steps"),parameters:Qe.string().array().nullish().describe("Parameter list"),defaultParameters:Qe.record(Qe.string(),Qe.string()).nullish(),defaultCacheKey:Qe.string().nullish(),defaultCacheTtl:Qe.number().nullish(),defaultCacheAllInvocations:Qe.boolean().nullish(),autoAuth:Qe.boolean().nullish(),advanced:wc.nullish()}),aj=og.extend({steps:Qe.lazy(()=>ve.array())}),ig=5*60*1e3,dd=Pt.merge(og.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as dj}from"date-fns-tz";import{z as ze}from"zod";var pd=ze.object({failureRecovery:ze.boolean().optional(),aiAction:ze.boolean().optional(),stepLintSuggestions:ze.boolean().optional(),agentConfig:ze.record(ze.string(),ze.string()).optional()}),sg=ze.object({fakerConstantSeed:ze.boolean().optional()}),hj=ze.object({ai:pd.optional(),githubAppInstallationId:ze.number().nullish(),githubReleaseAppInstallationId:ze.number().nullish(),gitlabAppAccessToken:ze.string().nullish().optional(),gitlabAppBaseUrl:ze.string().nullish().optional(),qaseAccessToken:ze.string().nullish().optional(),browser:zc.optional()}),gj=ze.object({globalOverrides:ze.record(ze.string()).optional(),agentConfig:ze.record(ze.string(),ze.string()).optional()});import*as E from"zod";var ag="x-momentic-cli-version",lg="x-momentic-main-branch-name",cg="x-momentic-branch-name",dg="x-momentic-commit-timestamp",pg="x-momentic-last-commit-on-main",ug="x-momentic-last-commit-on-main-timestamp",Pj=E.object({error:E.boolean(),reason:E.string(),message:E.string()}),Lj=Qt.merge(Kc),mg=qs,Oj=Qt.merge(Kc);var Mj=Qt.merge(hh).extend({useConsensus:E.boolean().optional(),attemptNumber:E.number().optional()}),ud=Wu,kj=Qt.merge(gh),hg=sm,Nj=Qt.merge(ph),gg=im,_j=Qt.merge(uh),fg=om,Dj=Qt.merge(mh);var Fj=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()}),Sg=E.object({queuedTests:E.unknown().array(),runIds:E.string().uuid().array(),runGroupId:E.string().optional()});var Uj=E.string().array(),Bj=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")})]),yg=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"))}),jR=E.object({test:E.string().describe("test YAML"),modules:E.record(E.string().describe("moduleId"),E.string().describe("module YAML"))}),zj=jR.array(),Hj=E.object({testId:E.string(),schemaVersion:E.string()}).merge(Or),jj=E.object({entries:E.array(Ac),testId:E.string()}),$j=E.object({testId:E.string(),uniqueKeys:E.string().array()}),Gj=E.object({steps:E.array(E.record(E.unknown())),testId:E.string(),schemaVersion:E.string()}),bg=rm,wg=E.object({trigger:E.nativeEnum(Xt),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()}),Wj=E.object({id:E.string()}),vg=E.object({status:E.nativeEnum(ie),updatedAt:E.coerce.date().optional(),finishedAt:E.coerce.date().optional()}),xg=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(Xt),schemaVersion:E.string().optional(),section:E.nativeEnum(ya).optional()}),Vj=E.object({id:E.string()}),$R=qc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),Tg=$R.array(),Eg=qc.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(),qj=E.object({id:E.string()}),Cg=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()}),Kj=E.object({screenshot:E.string()}),Rg=E.object({key:E.string()}),Ag=E.object({orgId:E.string(),userId:E.string()}),Ig=E.array(Km),Yj=E.record(E.string(),E.union([E.string(),E.boolean()])),Jj=E.object({paths:E.string().array(),env:E.string().optional(),urlOverride:E.string().optional(),customHeaders:E.record(E.string(),E.string()).optional()}),Pg=E.object({suiteRunIds:E.string().array(),runGroupIds:E.string().array()}),Xj=E.object({suiteRunIds:E.string().array()}),Zj=ch.array(),Qj=E.object({runGroupIds:E.string().array()}),rs=E.object({uploadUrl:E.string()}),e$=Qt.merge(fh),t$=Qt.merge(yh),n$=Qt.merge(Sh),GR=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()}),WR=E.object({transactionId:E.string(),timestamp:E.string(),event:E.nativeEnum(Zi),properties:GR}),r$=WR.array(),Lg=Zm.omit({steps:!0}).extend({steps:E.array(E.record(E.string(),E.unknown())).describe("unparsed ResolvedStep[]")}),o$=E.object({limit:E.number().max(10).optional(),afterTime:E.number().optional()}),Og=oh.array(),i$=E.object({applied:E.boolean().optional(),appliedAt:E.coerce.date().optional()}),s$=Qt.extend({chunks:Yc.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()}),Mg=rs.extend({id:E.string()}),a$=E.object({runGroupId:E.string().uuid().optional()}),kg=E.object({runGroupId:E.string().uuid()});import{z as Le}from"zod";var Ng=Le.object({orgId:Le.string(),cacheKeys:Le.string().array()}),d$=Le.object({keyParams:Ng,clientMetadata:Le.string(),lockAcquisitionTimeoutMs:Le.number().optional()}),_g=Le.object({acquired:Le.boolean(),acquiredByMetadata:Le.string(),keyPrefix:Le.string()}),p$=Le.object({keyPrefix:Le.string(),result:Le.string(),ttlMs:Le.number()}),u$=Le.union([Le.object({keyPrefix:Le.string()}),Ng]),VR=Le.object({remainingTtlMs:Le.number(),value:Le.string().nullish()}),m$=Le.object({results:Le.record(Le.string(),VR),activeLocks:Le.string().array()}),Dg=0,Fg=5*60*1e3;import{z as pn}from"zod";var Ug="test",Bg="module",Nt=(t=>(t.TEST=`${Ug}.yaml`,t.MODULE=`${Bg}.yaml`,t))(Nt||{}),Ae=(t=>(t.TEST=`momentic/${Ug}`,t.MODULE=`momentic/${Bg}`,t))(Ae||{}),w$=wt.merge(Or),md=Pt.extend({steps:pn.array(pn.record(pn.string(),pn.unknown())),schemaVersion:pn.string()}),v$=md.extend({fileType:pn.literal(Ae.MODULE)}),x$=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 st}from"zod";var qR=st.object({version:st.string(),json:st.record(st.unknown()),hash:st.string()}),zg=st.record(st.unknown()),R$=st.object({newSvgs:st.array(qR),metadata:zg.optional()}),KR=st.object({version:st.string(),json:st.record(st.unknown()).nullish(),hash:st.string(),description:st.string().nullish(),metadata:zg.nullish()}),Hg=st.record(st.string().describe("icon hash"),KR);import{validator as O$}from"@exodus/schemasafe";var jg=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as $$}from"zod";import{z as Je}from"zod";var V$=Je.object({repositoriesIndexed:Je.boolean(),indexingInProgress:Je.boolean(),indexesOutdated:Je.boolean()}),$g=(s=>(s.Queued="queued",s.InProgress="in_progress",s.Completed="completed",s.Waiting="waiting",s.Requested="requested",s.Pending="pending",s))($g||{}),Gg=(a=>(a.Success="success",a.Failure="failure",a.Neutral="neutral",a.Cancelled="cancelled",a.Skipped="skipped",a.TimedOut="timed_out",a.ActionRequired="action_required",a))(Gg||{}),q$=Je.object({name:Je.string(),status:Je.nativeEnum($g),conclusion:Je.nativeEnum(Gg).nullable()}),hd=Je.object({sha:Je.string(),message:Je.string(),author:Je.object({name:Je.string().optional(),email:Je.string().optional(),date:Je.coerce.date().optional()}),committer:Je.object({name:Je.string().optional(),email:Je.string().optional(),date:Je.coerce.date().optional()})});import{z as Ne}from"zod";var gd=Ne.object({assertion:Ne.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),YR=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:gd.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.")}),Wg=YR.extend({subSteps:Ne.lazy(()=>Wg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),Vg=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")}),qg=Vg.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)}),X$=qg.extend({testGenRuns:Ne.tuple([]).or(Ne.tuple([Ne.object({id:Ne.string(),startedAt:Ne.coerce.date(),status:Ne.nativeEnum(ie)})]))}),Kg=Ne.object({preConditions:gd.array().nullish().transform(n=>n??[]),postConditions:gd.array().nullish().transform(n=>n??[]),steps:Wg.array().nullish().transform(n=>n??[])}),Z$=qg.extend({plan:Kg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),JR=Vg.extend({plan:Kg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),Q$=JR.array().nullish().transform(n=>n??[]);var oG=90*24*60*60*1e3,iG=14*24*60*60*1e3,sG=7*24*60*60*1e3;import{z as Oe}from"zod";var XR=Oe.object({step:Pe,status:Oe.nativeEnum(Ce),startedAt:Oe.coerce.date(),finishedAt:Oe.coerce.date().optional(),healMetadata:Oe.object({healType:Oe.nativeEnum(Gi).or(Oe.literal("AI")),healedAt:Oe.coerce.date()}).optional(),beforeSnapshotId:Oe.string().uuid().optional(),afterSnapshotId:Oe.string().uuid().optional(),message:Oe.string().optional()}),mG=XR.extend({finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)}),ZR=Oe.object({startedAt:Oe.coerce.date()}).merge(Cg).merge(pa),hG=ZR.extend({finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)}),QR=Eg.merge(xg).extend({status:Oe.nativeEnum(ie),startedAt:Oe.coerce.date(),attempts:Oe.number()}),gG=QR.extend({finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)}),eA=wg.merge(vg).extend({id:Oe.string().uuid().optional(),startedAt:Oe.coerce.date(),cliVersion:Oe.string()}),os=eA.extend({updatedAt:Oe.coerce.date().optional().transform(n=>n??new Date),finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)});import tA from"semver";import{z as nA}from"zod";var bG=nA.string().refine(n=>tA.valid(n),{message:"must be a valid semver string"});var Oa=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};function fd(n){let e={parentChain:[]};return Ma(n,e),e}function Ma(n,e){let{onPresetAction:t,onSimpleStepContainer:r,onConditional:o,earlyStop:i}=n;for(let s of n.steps)switch(s.type){case"PRESET_ACTION":if(t(s,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(s,e)&&i)return!0;e.parentChain.push(s);for(let l of s.blocks)if(t(l.assertion,e)&&i||Ma({...n,steps:l.steps},e)&&i)return!0;if(Ma({...n,steps:s.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"IFRAME":case"SECTION":case"AI_ACTION":if(r?.(s,e)&&i)return!0;if(s.steps){if(e.parentChain.push(s),Ma({...n,steps:s.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(r?.(s,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"})(s)}}function Yg(n,e,t,r){let o=Array.from(e),i=Array.from(r);for(let a=0;a<o.length;a++){if(o[a]!==i[a])return!1;i.shift()}return!!rA([n],t,i).result}function rA(n,e,t=[]){let r,o=[],i=(s,a)=>{let l=JSON.stringify(a.parentChain.map(d=>d.id)),c=t.length===0?!0:JSON.stringify(t)===l;return s.id===e&&c?(r=s,o=a.parentChain,!0):!1};return fd({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function Jg(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?ka(r,e):typeof r=="object"&&Jg(r,e))}}function ka(n,e){for(let t of n)t&&(Array.isArray(t)?ka(t,e):typeof t=="object"&&Jg(t,e))}import{cloneDeep as Xg}from"lodash-es";import{v4 as Sd}from"uuid";async function _t(n){let e=new Map,t=new Set,r=Xg(n.stepLists.steps),o=await jr({...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 s of["beforeSteps","afterSteps"]){let a=Xg(n.stepLists[s]);if(!a)continue;let l=await jr({...n,steps:a,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});i.cachesToSave.push(...l.cachesToSave),i.moduleUpdates.push(...l.moduleUpdates),i.stepsToSave[s]=l.stepsToSave}return i}async function jr({steps:n,...e}){let{seenModules:t,cacheCreationParams:r,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:s,shouldCreateNewModuleId:a,createNewCacheIds:l}=e,c={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let d of n)switch(delete d.index,delete d.aiSuggested,d.id=l?Sd():d.id,d.type){case"PRESET_ACTION":{let u=d.command;u.id=l?Sd():u.id,Qg(u),"cache"in u&&u.cache&&(r&&(c.cachesToSave=c.cachesToSave.concat(Zg({id:u.id,orgId:r.orgId,testId:r.testId,value:Ir.parse(u),moduleIdParents:o,moduleStepParents:i,skipIntermediateEntries:e.skipCacheIntermediateEntries}))),delete u.cache),u.thoughts&&delete u.thoughts,c.stepsToSave.push({...d,command:u});break}case"RESOLVED_MODULE":{let u=l?Sd():d.id,m=d.moduleId;s.has(m)?m=s.get(m):a!==void 0&&(m=await a(d),s.set(d.moduleId,m));let{cachesToSave:h,stepsToSave:g,moduleUpdates:f}=await jr({...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({...Pt.parse(d),steps:ve.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 jr({...e,steps:d.steps});try{d.steps=It.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 jr({...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 jr({...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 jr({...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 Bo({steps:n,topLevel:e=!0,...t}){let{stepCacheEntries:r,logger:o,keyPrefix:i}=t,s=[],a=[],l=[],c=0,d=(u,m)=>{try{let h=Ir.parse(m.value);if(h.type!==u.type){o.warn({parsedCacheEntry:h,command:u},"Not using step cache due to type mismatch"),a.push(m.key);return}u.cache=h.cache,s.push(m.key),l.push(m.uniqueKey)}catch(h){a.push(m.key),o.error({err:h,cacheEntry:m},"Not using step cache due to parsing error")}},p=(u,m)=>{let h=iA(u.id,m),g=h.find(f=>!!r[f]);g?d(u,r[g]):a.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}=Bo({...t,steps:u.steps,keyPrefix:i?`${i}:${u.id}`:u.id,topLevel:!1});s.push(...h),a.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}=Bo({...t,steps:u.steps,topLevel:!1});s.push(...h),a.push(...g),l.push(...f);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!fc.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}=Bo({...t,steps:h.steps,topLevel:!1});s.push(...g),a.push(...f),l.push(...S)}if(u.elseSteps){c+=u.elseSteps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=Bo({...t,steps:u.elseSteps,topLevel:!1});s.push(...h),a.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&&a.length>0&&o.warn({totalSteps:c,cacheKeysMissed:a,cacheKeysHit:s,uniqueKeysHit:l,cacheEntries:r.length},"Step cache did not fully resolve"),{cacheKeysHit:s,cacheKeysMissed:a,uniqueKeysHit:l}}function ef(n,e){return e?`${e}:${n}`:n}function iA(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 Zg(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],s=e.slice(o,e.length).join(":");r.push({key:ef(n.id,s),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:ef(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function Qg(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 tf(n){let e=new Set;return ka(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 nf(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 Na({logger:n,cacheStorage:e,orgId:t,testId:r,originalSteps:o,updatedSteps:i}){let s=oA(o,i);if(Object.keys(s).length>0){n.info({changes:s},"Updating steps caches post-run success");try{let{cachesToSave:a}=await _t({stepLists:i,cacheCreationParams:{testId:r,orgId:t}});await e.saveStepCacheEntries({logger:n,testId:r,entries:a})}catch(a){n.error({err:a},"Failed to save step caches after successful execution. This is not critical, but can impact future performance.")}}}function He(n,e,t=!1){return n.length<e?n:n.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var cr={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},dr={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},yd={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},bd={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function sA(n){switch(n.type){case"ELEMENT_CONTENT":return`${n.negated?dr[n.operation]:cr[n.operation]} '${n.value}'`;case"ELEMENT_ATTRIBUTE":{let t=n.negated?dr[n.operation]:cr[n.operation];return n.operation==="EXISTS"?`attribute '${n.attr}' ${t}`:`attribute '${n.attr}' ${t} '${n.value}'`}case"ELEMENT_EXISTENCE":return n.negated?bd[n.condition]:yd[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 xV={CONTENT:"The page"};function aA(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 wd(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 lA(n){switch(n.type){case"CONTENT":return`${n.negated?dr.CONTAINS:cr.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 $r(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: ${He(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"KEY_DOWN":return`Hold down ${n.value} on the keyboard`;case"KEY_UP":return`Release ${n.value} on the keyboard`;case"SELECT_OPTION":{let t="",r=aA(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: ${He(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)} ${sA(n.assertion)}`;case"PAGE_CHECK":return`Check the page ${lA(n.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${wd(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 rf(n){let e=[];for(let t of n){t.sort((s,a)=>s.timestamp-a.timestamp);let r=[],o,i=1;for(let s of t)o&&o.text===s.text&&o.type===s.type&&JSON.stringify(o.args??null)===JSON.stringify(s.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=s,i=1);o&&r.push(o),e.push(r)}return e}import{cloneDeep as cA}from"lodash-es";import{cloneDeep as RV,unset as AV}from"lodash-es";function un(n){switch(n.type){case"AI_ACTION":return`AI action: ${He(n.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${He(n.text,100)}`;case"PRESET_ACTION":return $r(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: ${He(n.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(n)}}var of=1e3,sf=3e6,dA="[FAILED]";async function af(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 _a(n,e,t,{numScreenshots:r=1,addIndices:o=!0,includeBeforeScreenshots:i=!1,includeDomState:s=!1,recursive:a=!0}){let l=[],c;for(let d=0;d<t.length;d++){let p=t[d],u=a?Gr(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=`${dA} ${m.description}`,o&&(c=d);try{let h=ah.array().parse(p.details);for(let g of h)"pageState"in g&&s&&(m.pageState=g.pageState)}catch{}}r>0&&d>=t.length-r&&(m.afterScreenshot=await af(n,e,p.afterScreenshot,p.afterSnapshot),i&&(m.beforeScreenshot=await af(n,e,p.beforeScreenshot,p.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function Gr(n){let e=un(n);switch(n.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
16
+ `;for(let t=0;t<n.results.length;t++)e+=Xe(`Sub-step ${t} in AI action:
17
+ `,2),e+=`${Xe(Gr(n.results[t]),2)}
18
+ `,e+=Xe(`${"=".repeat(10)}
19
19
  `,2);return e;case"PRESET_ACTION":return e;case"MODULE":{e+=`
20
- `;for(let t=0;t<r.results.length;t++)e+=Je(`Sub-step ${t} in module:
21
- `,2),e+=`${Je($r(r.results[t]),2)}
22
- `,e+=Je(`${"=".repeat(10)}
20
+ `;for(let t=0;t<n.results.length;t++)e+=Xe(`Sub-step ${t} in module:
21
+ `,2),e+=`${Xe(Gr(n.results[t]),2)}
22
+ `,e+=Xe(`${"=".repeat(10)}
23
23
  `,2);return e}case"CONDITIONAL":{e+=`
24
- `,r.assertion&&(e+=Je(`Conditional check:
25
- `,2),e+=`${Je($r(r.assertion),2)}
26
- `,e+=Je(`${"=".repeat(10)}
27
- `,2)),e+=Je(`${r.assertion?"Branch steps":"Else branch steps"}
28
- `,2);for(let t=0;t<r.results.length;t++)e+=Je(`Sub-step ${t} in conditional branch:
29
- `,2),e+=`${Je($r(r.results[t]),2)}
30
- `,e+=Je(`${"=".repeat(10)}
24
+ `,n.assertion&&(e+=Xe(`Conditional check:
25
+ `,2),e+=`${Xe(Gr(n.assertion),2)}
26
+ `,e+=Xe(`${"=".repeat(10)}
27
+ `,2)),e+=Xe(`${n.assertion?"Branch steps":"Else branch steps"}
28
+ `,2);for(let t=0;t<n.results.length;t++)e+=Xe(`Sub-step ${t} in conditional branch:
29
+ `,2),e+=`${Xe(Gr(n.results[t]),2)}
30
+ `,e+=Xe(`${"=".repeat(10)}
31
31
  `,2);return e}case"IFRAME":{e+=`
32
- `;for(let t=0;t<r.results.length;t++)e+=Je(`Sub-step ${t} in frame step:
33
- `,2),e+=`${Je($r(r.results[t]),2)}
34
- `,e+=Je(`${"=".repeat(10)}
32
+ `;for(let t=0;t<n.results.length;t++)e+=Xe(`Sub-step ${t} in frame step:
33
+ `,2),e+=`${Xe(Gr(n.results[t]),2)}
34
+ `,e+=Xe(`${"=".repeat(10)}
35
35
  `,2);return e}case"SECTION":{e+=`
36
- `;for(let t=0;t<r.results.length;t++)e+=Je(`Sub-step ${t} in section:
37
- `,2),e+=`${Je($r(r.results[t]),2)}
38
- `,e+=Je(`${"=".repeat(10)}
39
- `,2);return e}default:return(n=>{throw new Error("You missed a case in the switch above")})(r)}}function Je(r,e){return r.split(`
36
+ `;for(let t=0;t<n.results.length;t++)e+=Xe(`Sub-step ${t} in section:
37
+ `,2),e+=`${Xe(Gr(n.results[t]),2)}
38
+ `,e+=Xe(`${"=".repeat(10)}
39
+ `,2);return e}default:return(r=>{throw new Error("You missed a case in the switch above")})(n)}}function Xe(n,e){return n.split(`
40
40
  `).map(t=>" ".repeat(e)+t).join(`
41
- `)}function ef(r,e){try{if(!r)return r;if(typeof r=="string")return ze(r,3e4);if(typeof r=="object"){let{jsonString:t}=Ro(JSON.stringify(r,(n,o)=>e?.includes(n)||typeof o=="string"&&o.length>3e4?"REDACTED":o),2e4);return JSON.parse(t)}return r}catch{return r}}function Sd(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=Ro(JSON.stringify(n.data),1e3);n.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${o}`}switch(n.details&&(n.details=void 0),n.type){case"PRESET_ACTION":Zg(n);break;case"CONDITIONAL":n.assertion&&Zg(n.assertion),Sd(n.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"IFRAME":case"MODULE":case"SECTION":{Sd(n.results,e);break}default:return(i=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}}function Zg(r){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}function Qg(r,e){let t=JSON.stringify(r),n=t.replaceAll("\\u0000","");if(t.length!==n.length){let o=t.indexOf("\\u0000");e.warn({input:t.slice(Math.max(0,o-500),Math.min(t.length,o+500))},"Database content violation: stripped unicode character from input")}return n}function _s(r,e){let t=iA(r);if(Sd(t,e),t.length>Yg)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,Yg);let n=Qg(t,e);if(n.length>Jg)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>Jg;)t.pop(),n=Qg(t,e);try{return Pt.array().parse(JSON.parse(n))}catch(o){throw e.error({serialized:n,err:o},"Could not parse serialized results into JSON structure after processing"),o}}import{cloneDeep as HV}from"lodash-es";var sA=/^(?!.*\S+\s+\S+).*$/,lA=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,cA=/style="([^"]*)/g,dA=/data-[\w-]+/g,pA=r=>{switch(r.type){case"AI_ASSERTION":return{type:r.type,assertion:r.assertion};case"DRAG":if(r.fromTarget.type==="description")return{type:r.type,description:r.fromTarget.elementDescriptor};break;case"CLICK":case"BLUR":case"TYPE":case"SELECT_OPTION":case"ELEMENT_CHECK":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"VISUAL_DIFF":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":if(r.target?.type==="description")return{type:r.type,description:r.target.elementDescriptor};break}return{type:"NONE",description:"NONE"}};function tf(r){let e=pA(r),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:sA.test(t)&&lA.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:cA.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"}:dA.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 nf(r,e){if(!(!r.envs||!r.envs.length)){for(let t of r.envs){let n=t;e in t&&(n[e]&&(t.default=!0),delete n.defaultOnCloud,delete n.defaultOnLocal)}r.envs.some(t=>t.default)||(r.envs[0].default=!0)}}import{cloneDeep as Pf}from"lodash-es";import fA from"diff-lines";import Fs,{gte as SA}from"semver";var rf={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>(r=r.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),r=r.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),r)};var of={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,n=t[t.length-1];return n&&n.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var uA=["target","fromTarget","toTarget"];function af(r){for(let e of uA){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var sf={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":return af(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])af(n);return e}default:return e}})};import{v4 as mA}from"uuid";var lf={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=mA()),e;default:return e}})};import{v4 as cf}from"uuid";var df={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??cf(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??cf()}})),delete e.commands),e;default:return e}})};var pf={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as hA}from"uuid";var uf={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>("id"in e&&typeof e.id=="string"||(e.id=hA()),e))};import{v4 as mf}from"uuid";var hf={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=mf())}return e.id=mf(),e})};var gf={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as gA}from"uuid";var ff={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=gA()),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 Sf={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var yf={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&bf(t),e})};function bf(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){bf(r[e]);return}if(typeof r[e]!="string")return;let t=r[e];e==="code"?r[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(r[e]=t.replace(/inputs\./g,"env."))})}var wf={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var vf={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var xf={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var Tf={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t)return e;if(t.type==="SELECT_OPTION"){if(t.option===void 0)return e;t.choice={type:"VALUE",value:t.option},t.option=void 0}else if(t.type==="TAB"){if(t.url===void 0)return e;t.action={type:"SUBSTRING",substring:t.url},t.url=void 0}else if(t.type==="WAIT_FOR_URL"){if(t.url===void 0)return e;t.matcher={type:"GLOB",glob:t.url},t.url=void 0}else t.type==="AI_WAIT"&&(t.type="AI_ASSERTION",t.timeout||(t.timeout=10));return e})};var Ef={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async r=>r.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Ds=new Set(["CLICK","TYPE","SELECT_OPTION"]),Cf={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type,o=t?.elementDescriptor;return(o!==void 0||Ds.has(n))&&(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 Rf={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var Af={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type;return n?.startsWith("PRESET_")&&(t.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(c=>{let d=c.type;d?.startsWith("PRESET_")&&(c.type=d.slice(7))})}),e}),stopOnFailure:!0};var Gr=[Ef,Rf,Af,Cf,rf,of,sf,lf,df,pf,uf,hf,gf,ff,Sf,yf,wf,vf,xf,Tf];if(_e!==Gr[Gr.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Gr.forEach((r,e)=>{if(!Fs.valid(r.toVersion)||!Fs.valid(r.fromVersion))throw new Error(`Migration '${r.name}' has invalid version`);if(!Fs.gt(r.toVersion,r.fromVersion))throw new Error(`Migration '${r.name}' has toVersion <= fromVersion`);if(e===0)return;if(Gr[e-1].toVersion!==r.fromVersion)throw new Error(`Migration '${r.name}' at index ${e} is not contiguous with previous migration`)});function yA(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var oa=async({metadata:r,steps:e,logger:t,toVersion:n})=>{let o=e,{schemaVersion:i,id:a}=r,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(n&&SA(l,n)){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 If(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=fA(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 If(r,e){let t=await e.execute(r);for(let n of t)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||yA(i)&&(n[o]=await If(i,e))}return t}async function Lf({rawSteps:r,metadata:e,logger:t,callbacks:n}){nf(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:a}=await Us({rawSteps:r.steps,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o}),s={...e,steps:i,schemaVersion:a};for(let l of["beforeSteps","afterSteps"]){let c=r[l];if(!c)continue;let{resolvedSteps:d}=await Us({rawSteps:c,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o});s[l]=d}return{resolvedTest:s,moduleIds:Array.from(Object.keys(o))}}async function Wr(r,e,t){let{newVersion:n,steps:o}=await oa({metadata:r,steps:e,logger:t});try{return{steps:be.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new Rs(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function Us({rawSteps:r,migrationMetadata:e,logger:t,callbacks:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await Wr(e,r,t),s=[];for(let l of a)s.push(await ia({step:l,callbacks:n,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function ia({step:r,callbacks:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"AI_ACTION":return r;case"AI_ACTION_DYNAMIC":return r;case"PRESET_ACTION":return r;case"MODULE":{let l=r.moduleId,c=n[l];if(c)return{...Pf(c),...r,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:n})))}catch(f){throw t.error({err:f,...r},`Failed to recursively resolve module '${d.name}': ${f}`),f}let g={...d,steps:h};return n[l]=Pf(g),{...g,...r,type:"RESOLVED_MODULE"}}case"CONDITIONAL":let o=[];for(let l of r.blocks){let c=[];for(let d of l.steps)c.push(await ia({step:d,callbacks:e,logger:t,resolvedModuleCache:n}));o.push({...l,steps:c})}let i;if(r.elseSteps){i=[];for(let l of r.elseSteps)i.push(await ia({step:l,callbacks:e,logger:t,resolvedModuleCache:n}))}return{...r,blocks:o,elseSteps:i};case"SECTION":case"IFRAME":let a=[];for(let l of r.steps)a.push(await ia({step:l,callbacks:e,logger:t,resolvedModuleCache:n}));return{...r,steps:a};default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function bA(r){return typeof r=="object"&&r!==null}function $n(r){if(Array.isArray(r))return r.map($n);if(bA(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=$n(n))}),e}return r}import{cloneDeep as wA}from"lodash-es";import{stringify as Of}from"yaml";async function Mf({test:r,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let n={id:r.id,name:r.name,description:r.description,baseUrl:r.baseUrl,schemaVersion:r.schemaVersion,advanced:r.advanced,retries:r.retries,envs:r.envs,disabled:r.disabled,labels:r.labels},o={},i=await vA({originalStepLists:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),a={fileType:Ae.TEST,...n,beforeSteps:i.beforeSteps&&i.beforeSteps.length>0?i.beforeSteps:void 0,steps:i.steps,afterSteps:i.afterSteps&&i.afterSteps.length>0?i.afterSteps:void 0};return{test:Of(a),modules:o}}async function vA({originalStepLists:r,modules:e,processedModuleNames:t,createNewCacheIds:n}){let o=wA(r);Object.values(o).forEach(s=>{xA(s??[])});let{stepsToSave:i,moduleUpdates:a}=await Zt({stepLists:o,createNewCacheIds:n});for(let s of a)t.has(s.name)||(e[s.name]=TA(s),t.add(s.name));return i}function xA(r){ud({steps:r,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function TA(r){let e=At.parse(r),t={fileType:Ae.MODULE,...e,schemaVersion:_e,steps:r.steps};return Of(t)}async function ne(r,e){return new Promise((t,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i);let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}async function aa({promiseGenerator:r,signal:e,codePath:t,logger:n}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}n?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,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 r())}catch(d){l(d)}finally{clearInterval(a),e?.removeEventListener("abort",c)}})()})}async function Vr({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,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:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(l)}}function Bs(r){let e=[];for(let t of r)switch(t.type){case"PRESET_ACTION":case"AI_ACTION":case"AI_ACTION_DYNAMIC":e.push(t);break;case"RESOLVED_MODULE":{let n={...t,type:"MODULE"};e.push(Hn.parse(n));break}case"IFRAME":case"SECTION":{let n={...t,steps:Bs(t.steps)};e.push(be.parse(n));break}case"CONDITIONAL":{let n={...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(n));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function zs(r){return Bs([r])[0]}import EA from"picomatch";var kf=(r,e,t)=>{t?.caseInsensitive&&(r=r.toLowerCase());let n;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;n=r.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;n=r===e.glob||EA(o)(r);break}case"REGEX":{n=new RegExp(e.regex).test(r);break}}return t?.negated?!n:n},Hs=(r,e)=>{try{let{hostname:t,pathname:n}=new URL(r),{hostname:o,pathname:i}=new URL(e);return t!==o||n!==i}catch{return!1}},Uo=r=>{try{return new URL(r),!0}catch{return!1}},Nf=r=>!r.toLowerCase().startsWith("http"),Bo=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function qr(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}import zo from"yaml";import{z as Uf}from"zod";import{execSync as CA}from"child_process";function Kr(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,y.debug({postSaveCommand:n},"Executing post-save hook command");try{CA(n,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as _f}from"deep-object-diff";import dr from"fs";import{cloneDeep as RA}from"lodash-es";import yd from"path";import{v4 as AA}from"uuid";import sa from"yaml";function Yr({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.modules[r.moduleId]?.fullFilePath;if(!i||!dr.existsSync(i))throw new Error(`Tried to update module ${r.moduleId} that could not be found on disk`);let a=dr.readFileSync(i,"utf-8"),s=sa.parse(a),l;if(r.name&&r.name!==s.name){let m=`${ke(r.name)}.${Mt.MODULE}`;if(l=yd.join(yd.dirname(i),m),dr.existsSync(l))throw new Error(`Test with name '${r.name}' already exists at path '${l}'`)}let c={...r,schemaVersion:e},d=$n({fileType:Ae.MODULE,...ad.parse(c),steps:be.array().parse(r.steps)}),p=_f(d,s);if(p&&Object.keys(p).length===0&&!o){y.debug(`Skipping save for module ${r.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,n.config)}function Df({moduleId:r,content:e,momenticFiles:t,project:n,logger:o}){let i=t.modules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update module ${r} that could not be found on disk`);let a=Gn(i,o),s={...a,...e},l=$n({fileType:Ae.MODULE,...ad.parse(s),steps:a.steps}),c=_f(l,a);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${r} since there are no changes`);return}let d=sa.stringify(l);dr.writeFileSync(i,d,"utf-8"),Kr(i,n.config)}async function Ff({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=ke(r),s=yd.join(o,`${a}.module.yaml`),l=AA(),{stepsToSave:c}=await Zt({stepLists:{steps:n}}),d={fileType:Ae.MODULE,schemaVersion:_e,moduleId:l,name:r,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:r,description:e,enabled:t,steps:n}}function Gn(r,e){let t=dr.readFileSync(r,"utf-8"),n=sa.parse(t);try{return cd.parse(n)}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic module`),o}}async function bd(r,e,t,n){let o=Gn(r.fullFilePath,t),{resolvedSteps:i}=await Us({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:n,logger:t,callbacks:{onFetchModule:async({id:s})=>{let l=e.modules[s]?.fullFilePath;if(l)return Gn(l,t)}}}),a={...o,steps:i};return n&&(n[r.id]=RA(a)),a}async function js(r,e){let t={};return await Promise.all(Object.values(r.modules).map(async n=>{await bd(n,r,e,t)})),Array.from(Object.values(t))}async function Bf({test:r,name:e,folder:t}){let n=await Mf({test:r});if(Object.keys(n.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${ke(e)}.${Mt.TEST}`,a=Jr.join(t,i);return mn.writeFileSync(a,n.test,"utf-8"),a}function wd(r,e,t){let n=Jr.join(t.rootDir,r);if(!mn.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=mn.readFileSync(n,"utf-8"),i=zo.parse(o),a,s;if(e.name&&e.name!==i.name){let u=`${ke(e.name)}.${Mt.TEST}`;if(a=Jr.join(Jr.dirname(r),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=zo.stringify(d);return mn.writeFileSync(n,p,"utf-8"),s&&mn.renameSync(n,s),Kr(n,t.config),{newRelativeTestPath:a}}function Wn({relativeTestPath:r,steps:e,schemaVersion:t,project:n,forceSaveOnNoDiffs:o}){let i=Jr.join(n.rootDir,r);if(!mn.existsSync(i))throw new Error(`Test not found at path '${r}' in project '${n.rootDir}'`);let a=mn.readFileSync(i,"utf-8"),s=zo.parse(a),l=Xt.parse({...s,schemaVersion:t}),c=$n({fileType:Ae.TEST,...l,beforeSteps:be.array().or(Uf.undefined()).parse(e.beforeSteps),steps:be.array().parse(e.steps),afterSteps:be.array().or(Uf.undefined()).parse(e.afterSteps)}),d=IA(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=zo.stringify(c);mn.writeFileSync(i,p,"utf-8"),y.debug(`Saving test ${l.name} to ${i}`),Kr(i,n.config)}function $s(r,e){let t=Jr.join(e.rootDir,r);if(!t)throw new Error(`Could not find test with path ${r} in Momentic project (${e.rootDir})`);let n;try{n=mn.readFileSync(t,"utf8"),n=n.replace(/\r\n|\r/g,`
42
- `)}catch(i){throw new Error(`Could not read test file ${t}: ${i}`)}let o;try{o=zo.parse(n)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return vt.parse(o)}function Xr(r,e,t){let n=t.project.rootDir,o;try{o=mn.readFileSync(r,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=zo.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${r} is missing steps`);return i}async function la(r,e,t){let n=Xr(r,e,t),o;try{o=Xt.parse(n)}catch(a){throw new Error(`Test ${r} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await Lf({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.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 PA from"@dotenvx/dotenvx";import LA from"fs";import zf from"path";function jf(r,e){return(r.config.environments??[]).map(t=>ca(t.name,r,e))}function Hf(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function ca(r,e,t){let n=(e.config.environments??[]).find(a=>a.name===r);if(!n)throw new Error(`Environment ${r} not found in local project configuration file`);let o={[Ge]:Hf(n.baseUrl)};if(n.envVariables){let a={};for(let[s,l]of Object.entries(n.envVariables))if(typeof l=="string"){let c=Hf(l);c&&(a[s]=c)}else{let c=l.fromFile,d;try{d=LA.readFileSync(zf.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(n.envFile){let a={},s=PA.config({path:zf.resolve(e.rootDir,n.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 n.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:r,variables:o,browser:n.browser}}import{existsSync as sP,readFileSync as lP,readdirSync as cP,writeFileSync as dP}from"fs";var cS=Fx(tS(),1);var pa=r=>{if(typeof r!="string")throw new TypeError("invalid pattern");if(r.length>65536)throw new TypeError("pattern is too long")};var UA={"[: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=r=>r.replace(/[[\]\\-]/g,"\\$&"),BA=r=>r.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),nS=r=>r.join(""),rS=(r,e)=>{let t=e;if(r.charAt(t)!=="[")throw new Error("not in a brace expression");let n=[],o=[],i=t+1,a=!1,s=!1,l=!1,c=!1,d=t,p="";e:for(;i<r.length;){let g=r.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,v,x]]of Object.entries(UA))if(r.startsWith(f,i)){if(p)return["$.",!1,r.length-t,!0];i+=f.length,x?o.push(S):n.push(S),s=s||v;continue e}}if(l=!1,p){g>p?n.push(ua(p)+"-"+ua(g)):g===p&&n.push(ua(g)),p="",i++;continue}if(r.startsWith("-]",i+1)){n.push(ua(g+"-")),i+=2;continue}if(r.startsWith("-",i+1)){p=g,i+=2;continue}n.push(ua(g)),i++}if(d<i)return["",!1,0,!1];if(!n.length&&!o.length)return["$.",!1,r.length-t,!0];if(o.length===0&&n.length===1&&/^\\?.$/.test(n[0])&&!c){let g=n[0].length===2?n[0].slice(-1):n[0];return[BA(g),!1,d-t,!1]}let u="["+(c?"^":"")+nS(n)+"]",m="["+(c?"":"^")+nS(o)+"]";return[n.length&&o.length?"("+u+"|"+m+")":n.length?u:m,s,d-t,!0]};var hn=(r,{windowsPathsNoEscape:e=!1}={})=>e?r.replace(/\[([^\/\\])\]/g,"$1"):r.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var zA=new Set(["!","?","+","*","@"]),oS=r=>zA.has(r),HA="(?!(?:^|/)\\.\\.?(?:$|/))",Gs="(?!\\.)",jA=new Set(["[","."]),$A=new Set(["..","."]),GA=new Set("().*{}+?[]^$\\!"),WA=r=>r.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Td="[^/]",iS=Td+"*?",aS=Td+"+?",Ho=class r{type;#e;#t;#i=!1;#r=[];#a;#w;#c;#p=!1;#s;#l;#o=!1;constructor(e,t,n={}){this.type=e,e&&(this.#t=!0),this.#a=t,this.#e=this.#a?this.#a.#e:this,this.#s=this.#e===this?n: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,n=t.#a;for(;n;){for(let o=t.#w+1;!n.type&&o<n.#r.length;o++)for(let i of e.#r){if(typeof i=="string")throw new Error("string part in extglob AST??");i.copyIn(n.#r[o])}t=n,n=t.#a}}return this}push(...e){for(let t of e)if(t!==""){if(typeof t!="string"&&!(t instanceof r&&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 n=e.#r[t];if(!(n instanceof r&&n.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 r(this.type,e);for(let n of this.#r)t.copyIn(n);return t}static#S(e,t,n,o){let i=!1,a=!1,s=-1,l=!1;if(t.type===null){let m=n,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&&oS(g)&&e.charAt(m)==="("){t.push(h),h="";let f=new r(g,t);m=r.#S(e,f,m,o),t.push(f);continue}h+=g}return t.push(h),m}let c=n+1,d=new r(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(oS(m)&&e.charAt(c)==="("){d.push(u),u="";let h=new r(m,d);d.push(h),c=r.#S(e,h,c,o);continue}if(m==="|"){d.push(u),u="",p.push(d),d=new r(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(n-1)],c}static fromGlob(e,t={}){let n=new r(null,void 0,t);return r.#S(e,n,0,t),n}toMMPattern(){if(this!==this.#e)return this.#e.toMMPattern();let e=this.toString(),[t,n,o,i]=this.toRegExpSource();if(!(o||this.#t||this.#s.nocase&&!this.#s.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return n;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"?r.#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&&$A.has(this.#r[0]))){let h=jA,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?HA: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 n=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=!n||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:"")+aS;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?Gs:"")+iS+")":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[n,o,i,a]=t.toRegExpSource(e);return this.#i=this.#i||a,n}).filter(t=>!(this.isStart()&&this.isEnd())||!!t).join("|")}static#u(e,t,n=!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+=(GA.has(l)?"\\":"")+l;continue}if(l==="\\"){s===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,d,p,u]=rS(e,s);if(p){i+=c,a=a||d,s+=p-1,t=t||u;continue}}if(l==="*"){n&&e==="*"?i+=aS:i+=iS,t=!0;continue}if(l==="?"){i+=Td,t=!0;continue}i+=WA(l)}return[i,hn(e),!!t,a]}};var jo=(r,{windowsPathsNoEscape:e=!1}={})=>e?r.replace(/[?*()[\]]/g,"[$&]"):r.replace(/[?*()[\]\\]/g,"\\$&");var xt=(r,e,t={})=>(pa(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Bt(e,t).match(r)),VA=/^\*+([^+@!?\*\[\(]*)$/,qA=r=>e=>!e.startsWith(".")&&e.endsWith(r),KA=r=>e=>e.endsWith(r),YA=r=>(r=r.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(r)),JA=r=>(r=r.toLowerCase(),e=>e.toLowerCase().endsWith(r)),XA=/^\*+\.\*+$/,ZA=r=>!r.startsWith(".")&&r.includes("."),QA=r=>r!=="."&&r!==".."&&r.includes("."),eI=/^\.\*+$/,tI=r=>r!=="."&&r!==".."&&r.startsWith("."),nI=/^\*+$/,rI=r=>r.length!==0&&!r.startsWith("."),oI=r=>r.length!==0&&r!=="."&&r!=="..",iI=/^\?+([^+@!?\*\[\(]*)?$/,aI=([r,e=""])=>{let t=dS([r]);return e?(e=e.toLowerCase(),n=>t(n)&&n.toLowerCase().endsWith(e)):t},sI=([r,e=""])=>{let t=pS([r]);return e?(e=e.toLowerCase(),n=>t(n)&&n.toLowerCase().endsWith(e)):t},lI=([r,e=""])=>{let t=pS([r]);return e?n=>t(n)&&n.endsWith(e):t},cI=([r,e=""])=>{let t=dS([r]);return e?n=>t(n)&&n.endsWith(e):t},dS=([r])=>{let e=r.length;return t=>t.length===e&&!t.startsWith(".")},pS=([r])=>{let e=r.length;return t=>t.length===e&&t!=="."&&t!==".."},uS=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",sS={win32:{sep:"\\"},posix:{sep:"/"}},dI=uS==="win32"?sS.win32.sep:sS.posix.sep;xt.sep=dI;var st=Symbol("globstar **");xt.GLOBSTAR=st;var pI="[^/]",uI=pI+"*?",mI="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",hI="(?:(?!(?:\\/|^)\\.).)*?",gI=(r,e={})=>t=>xt(t,r,e);xt.filter=gI;var Qt=(r,e={})=>Object.assign({},r,e),fI=r=>{if(!r||typeof r!="object"||!Object.keys(r).length)return xt;let e=xt;return Object.assign((n,o,i={})=>e(n,o,Qt(r,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,Qt(r,i))}static defaults(o){return e.defaults(Qt(r,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,a={}){super(o,i,Qt(r,a))}static fromGlob(o,i={}){return e.AST.fromGlob(o,Qt(r,i))}},unescape:(n,o={})=>e.unescape(n,Qt(r,o)),escape:(n,o={})=>e.escape(n,Qt(r,o)),filter:(n,o={})=>e.filter(n,Qt(r,o)),defaults:n=>e.defaults(Qt(r,n)),makeRe:(n,o={})=>e.makeRe(n,Qt(r,o)),braceExpand:(n,o={})=>e.braceExpand(n,Qt(r,o)),match:(n,o,i={})=>e.match(n,o,Qt(r,i)),sep:e.sep,GLOBSTAR:st})};xt.defaults=fI;var mS=(r,e={})=>(pa(r),e.nobrace||!/\{(?:(?!\{).)*\}/.test(r)?[r]:(0,cS.default)(r));xt.braceExpand=mS;var SI=(r,e={})=>new Bt(r,e).makeRe();xt.makeRe=SI;var yI=(r,e,t={})=>{let n=new Bt(e,t);return r=r.filter(o=>n.match(o)),n.options.nonull&&!r.length&&r.push(e),r};xt.match=yI;var lS=/[?*]|[+@!]\(.*?\)|\[|\]/,bI=r=>r.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||uS,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 n=this.globSet.map(i=>this.slashSplit(i));this.globParts=this.preprocess(n),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]==="?"||!lS.test(i[2]))&&!lS.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 n=0;n<e.length;n++)for(let o=0;o<e[n].length;o++)e[n][o]==="**"&&(e[n][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 n=-1;for(;(n=t.indexOf("**",n+1))!==-1;){let o=n;for(;t[o+1]==="**";)o++;o!==n&&t.splice(n,o-n)}return t})}levelOneOptimize(e){return e.map(t=>(t=t.reduce((n,o)=>{let i=n[n.length-1];return o==="**"&&i==="**"?n:o===".."&&i&&i!==".."&&i!=="."&&i!=="**"?(n.pop(),n):(n.push(o),n)},[]),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 n=0;for(;(n=e.indexOf("..",n+1))!==-1;){let o=e[n-1];o&&o!=="."&&o!==".."&&o!=="**"&&(t=!0,e.splice(n-1,2),n-=2)}}while(t);return e.length===0?[""]:e}firstPhasePreProcess(e){let t=!1;do{t=!1;for(let n of e){let o=-1;for(;(o=n.indexOf("**",o+1))!==-1;){let a=o;for(;n[a+1]==="**";)a++;a>o&&n.splice(o+1,a-o);let s=n[o+1],l=n[o+2],c=n[o+3];if(s!==".."||!l||l==="."||l===".."||!c||c==="."||c==="..")continue;t=!0,n.splice(o,1);let d=n.slice(0);d[o]="**",e.push(d),o--}if(!this.preserveMultipleSlashes){for(let a=1;a<n.length-1;a++){let s=n[a];a===1&&s===""&&n[0]===""||(s==="."||s==="")&&(t=!0,n.splice(a,1),a--)}n[0]==="."&&n.length===2&&(n[1]==="."||n[1]==="")&&(t=!0,n.pop())}let i=0;for(;(i=n.indexOf("..",i+1))!==-1;){let a=n[i-1];if(a&&a!=="."&&a!==".."&&a!=="**"){t=!0;let l=i===1&&n[i+1]==="**"?["."]:[];n.splice(i-1,2,...l),n.length===0&&n.push(""),i-=2}}}}while(t);return e}secondPhasePreProcess(e){for(let t=0;t<e.length-1;t++)for(let n=t+1;n<e.length;n++){let o=this.partsMatch(e[t],e[n],!this.preserveMultipleSlashes);if(o){e[t]=[],e[n]=o;break}}return e.filter(t=>t.length)}partsMatch(e,t,n=!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(n&&e[o]==="**"&&t[i]===e[o+1])a.push(e[o]),o++;else if(n&&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,n=0;for(let o=0;o<e.length&&e.charAt(o)==="!";o++)t=!t,n++;n&&(this.pattern=e.slice(n)),this.negate=t}matchOne(e,t,n=!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]),v=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),x=f?3:g?0:void 0,b=v?3:S?0:void 0;if(typeof x=="number"&&typeof b=="number"){let[T,C]=[e[x],t[b]];T.toLowerCase()===C.toLowerCase()&&(t[b]=T,b>x?t=t.slice(b):x>b&&(e=e.slice(x)))}}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
- globstar while`,e,u,t,m,h),this.matchOne(e.slice(u),t.slice(m),n))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!!(n&&(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 n;if(s===c)return a===l-1&&e[a]==="";throw new Error("wtf?")}braceExpand(){return mS(this.pattern,this.options)}parse(e){pa(e);let t=this.options;if(e==="**")return st;if(e==="")return"";let n,o=null;(n=e.match(nI))?o=t.dot?oI:rI:(n=e.match(VA))?o=(t.nocase?t.dot?JA:YA:t.dot?KA:qA)(n[1]):(n=e.match(iI))?o=(t.nocase?t.dot?sI:aI:t.dot?lI:cI)(n):(n=e.match(XA))?o=t.dot?QA:ZA:(n=e.match(eI))&&(o=tI);let i=Ho.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,n=t.noglobstar?uI:t.dot?mI:hI,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"?bI(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]="(?:\\/|"+n+"\\/)?"+u:c[p]=n:u===void 0?c[p-1]=m+"(?:\\/|"+n+")?":u!==st&&(c[p-1]=m+"(?:\\/|\\/"+n+"\\/)"+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 n=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(n.matchBase&&l.length===1&&(c=[a]),this.matchOne(c,l,t))return n.flipNegate?!0:!this.negate}return n.flipNegate?!1:this.negate}static defaults(e){return xt.defaults(e).Minimatch}};xt.AST=Ho;xt.Minimatch=Bt;xt.escape=jo;xt.unescape=hn;import{fileURLToPath as XI}from"node:url";var $o=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,gS=new Set,Ed=typeof process=="object"&&process?process:{},fS=(r,e,t,n)=>{typeof Ed.emitWarning=="function"?Ed.emitWarning(r,e,t,n):console.error(`[${t}] ${e}: ${r}`)},Ws=globalThis.AbortController,hS=globalThis.AbortSignal;if(typeof Ws>"u"){hS=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(n,o){this._onabort.push(o)}},Ws=class{constructor(){e()}signal=new hS;abort(n){if(!this.signal.aborted){this.signal.reason=n,this.signal.aborted=!0;for(let o of this.signal._onabort)o(n);this.signal.onabort?.(n)}}};let r=Ed.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{r&&(r=!1,fS("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 wI=r=>!gS.has(r),g3=Symbol("type"),pr=r=>r&&r===Math.floor(r)&&r>0&&isFinite(r),SS=r=>pr(r)?r<=Math.pow(2,8)?Uint8Array:r<=Math.pow(2,16)?Uint16Array:r<=Math.pow(2,32)?Uint32Array:r<=Number.MAX_SAFE_INTEGER?Go:null:null,Go=class extends Array{constructor(e){super(e),this.fill(0)}},Cd=class r{heap;length;static#e=!1;static create(e){let t=SS(e);if(!t)return[];r.#e=!0;let n=new r(e,t);return r.#e=!1,n}constructor(e,t){if(!r.#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 r{#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,n,o,i)=>e.#U(t,n,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:n,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:v,noDeleteOnStaleGet:x,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?SS(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=Cd.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=!!v,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=!!x,this.updateAgeOnGet=!!a,this.updateAgeOnHas=!!s,this.ttlResolution=pr(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=n||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 N="LRU_CACHE_UNBOUNDED";wI(N)&&(gS.add(N),fS("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",N,r))}}getRemainingTTL(e){return this.#s.has(e)?1/0:0}#P(){let e=new Go(this.#e),t=new Go(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=n||o();let c=i.now-l;i.remainingTTL=s-c}};let n=0,o=()=>{let i=$o.now();if(this.ttlResolution>0){n=i;let a=setTimeout(()=>n=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=(n||o())-l;return s-c},this.#y=i=>{let a=t[i],s=e[i];return!!s&&!!a&&(n||o())-a>s}}#R=()=>{};#n=()=>{};#M=()=>{};#y=()=>!1;#L(){let e=new Go(this.#e);this.#p=0,this.#E=e,this.#k=t=>{this.#p-=e[t],e[t]=0},this.#_=(t,n,o,i)=>{if(this.#d(n))return 0;if(!pr(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(n,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.#N=(t,n,o)=>{if(e[t]=n,this.#t){let i=this.#t-e[t];for(;this.#p>i;)this.#F(!0)}this.#p+=e[t],o&&(o.entrySize=n,o.totalCalculatedSize=this.#p)}}#k=e=>{};#N=(e,t,n)=>{};#_=(e,t,n,o)=>{if(n||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 n of this.#A()){let o=this.#o[n],i=this.#d(o)?o.__staleWhileFetching:o;if(i!==void 0&&e(i,this.#l[n],this))return this.get(this.#l[n],t)}}forEach(e,t=this){for(let n of this.#A()){let o=this.#o[n],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[n],this)}}rforEach(e,t=this){for(let n of this.#I()){let o=this.#o[n],i=this.#d(o)?o.__staleWhileFetching:o;i!==void 0&&e.call(t,i,this.#l[n],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 n=this.#o[t],o=this.#d(n)?n.__staleWhileFetching:n;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 n=this.#l[t],o=this.#o[t],i=this.#d(o)?o.__staleWhileFetching:o;if(i===void 0||n===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([n,a])}return e}load(e){this.clear();for(let[t,n]of e){if(n.start){let o=Date.now()-n.start;n.start=$o.now()-o}this.set(t,n.value,n)}}set(e,t,n={}){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}=n,{noUpdateTTL:c=this.noUpdateTTL}=n,d=this.#_(e,t,n.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.#N(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.#k(p),this.#N(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,n=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,n,"evict"),this.#h&&this.#g?.push([o,n,"evict"])),this.#k(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(n),this.#c--,t}has(e,t={}){let{updateAgeOnHas:n=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 n&&this.#R(i),o&&(o.has="hit",this.#n(o,i)),!0}else o&&(o.has="miss");return!1}peek(e,t={}){let{allowStale:n=this.allowStale}=t,o=this.#s.get(e);if(o===void 0||!n&&this.#y(o))return;let i=this.#o[o];return this.#d(i)?i.__staleWhileFetching:i}#U(e,t,n,o){let i=t===void 0?void 0:this.#o[t];if(this.#d(i))return i;let a=new Ws,{signal:s}=n;s?.addEventListener("abort",()=>a.abort(s.reason),{signal:a.signal});let l={signal:a.signal,options:n,context:o},c=(g,f=!1)=>{let{aborted:S}=a.signal,v=n.ignoreFetchAbort&&g!==void 0;if(n.status&&(S&&!f?(n.status.fetchAborted=!0,n.status.fetchError=a.signal.reason,v&&(n.status.fetchAbortIgnored=!0)):n.status.fetchResolved=!0),S&&!v&&!f)return p(a.signal.reason);let x=m;return this.#o[t]===m&&(g===void 0?x.__staleWhileFetching?this.#o[t]=x.__staleWhileFetching:this.#O(e,"fetch"):(n.status&&(n.status.fetchUpdated=!0),this.set(e,g,l.options))),g},d=g=>(n.status&&(n.status.fetchRejected=!0,n.status.fetchError=g),p(g)),p=g=>{let{aborted:f}=a.signal,S=f&&n.allowStaleOnFetchAbort,v=S||n.allowStaleOnFetchRejection,x=v||n.noDeleteOnFetchRejection,b=m;if(this.#o[t]===m&&(!x||b.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=b.__staleWhileFetching)),v)return n.status&&b.__staleWhileFetching!==void 0&&(n.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(v=>g(v===void 0?void 0:v),f),a.signal.addEventListener("abort",()=>{(!n.ignoreFetchAbort||n.allowStaleOnFetchAbort)&&(g(void 0),n.allowStaleOnFetchAbort&&(g=v=>c(v,!0)))})};n.status&&(n.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:n=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:v}=t;if(!this.#x)return S&&(S.fetch="get"),this.get(e,{allowStale:n,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let x={allowStale:n,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:v},b=this.#s.get(e);if(b===void 0){S&&(S.fetch="miss");let T=this.#U(e,b,x,g);return T.__returned=T}else{let T=this.#o[b];if(this.#d(T)){let $=n&&T.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",$&&(S.returnedStale=!0)),$?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,x,g),L=A.__staleWhileFetching!==void 0&&n;return S&&(S.fetch=C?"stale":"refresh",L&&C&&(S.returnedStale=!0)),L?A.__staleWhileFetching:A.__returned=A}}async forceFetch(e,t={}){let n=await this.fetch(e,t);if(n===void 0)throw new Error("fetch() returned undefined");return n}memo(e,t={}){let n=this.#w;if(!n)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=n(e,s,{options:a,context:o});return this.set(e,l,a),l}get(e,t={}){let{allowStale:n=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&&n&&l.__staleWhileFetching!==void 0&&(a.returnedStale=!0),n?l.__staleWhileFetching:void 0):(i||this.#O(e,"expire"),a&&n&&(a.returnedStale=!0),n?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 n=!1;if(this.#c!==0){let o=this.#s.get(e);if(o!==void 0)if(n=!0,this.#c===1)this.#H(t);else{this.#k(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 n}clear(){return this.#H("delete")}#H(e){for(let t of this.#I({allowStale:!0})){let n=this.#o[t];if(this.#d(n))n.__abortController.abort(new Error("deleted"));else{let o=this.#l[t];this.#v&&this.#i?.(n,o,e),this.#h&&this.#g?.push([n,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,n;for(;n=t?.shift();)this.#r?.(...n)}}};import{posix as OI,win32 as _d}from"node:path";import{fileURLToPath as MI}from"node:url";import{lstatSync as kI,readdir as NI,readdirSync as _I,readlinkSync as DI,realpathSync as FI}from"fs";import*as UI from"node:fs";import{lstat as zI,readdir as HI,readlink as jI,realpath as $I}from"node:fs/promises";import{EventEmitter as Md}from"node:events";import xS from"node:stream";import{StringDecoder as vI}from"node:string_decoder";var yS=typeof process=="object"&&process?process:{stdout:null,stderr:null},xI=r=>!!r&&typeof r=="object"&&(r instanceof mr||r instanceof xS||TI(r)||EI(r)),TI=r=>!!r&&typeof r=="object"&&r instanceof Md&&typeof r.pipe=="function"&&r.pipe!==xS.Writable.prototype.pipe,EI=r=>!!r&&typeof r=="object"&&r instanceof Md&&typeof r.write=="function"&&typeof r.end=="function",Vn=Symbol("EOF"),qn=Symbol("maybeEmitEnd"),ur=Symbol("emittedEnd"),Vs=Symbol("emittingEnd"),ha=Symbol("emittedError"),qs=Symbol("closed"),bS=Symbol("read"),Ks=Symbol("flush"),wS=Symbol("flushChunk"),gn=Symbol("encoding"),Wo=Symbol("decoder"),Qe=Symbol("flowing"),ga=Symbol("paused"),Vo=Symbol("resume"),et=Symbol("buffer"),Tt=Symbol("pipes"),tt=Symbol("bufferLength"),Rd=Symbol("bufferPush"),Ys=Symbol("bufferShift"),mt=Symbol("objectMode"),He=Symbol("destroyed"),Ad=Symbol("error"),Id=Symbol("emitData"),vS=Symbol("emitEnd"),Pd=Symbol("emitEnd2"),In=Symbol("async"),Ld=Symbol("abort"),Js=Symbol("aborted"),fa=Symbol("signal"),Zr=Symbol("dataListeners"),zt=Symbol("discarded"),Sa=r=>Promise.resolve().then(r),CI=r=>r(),RI=r=>r==="end"||r==="finish"||r==="prefinish",AI=r=>r instanceof ArrayBuffer||!!r&&typeof r=="object"&&r.constructor&&r.constructor.name==="ArrayBuffer"&&r.byteLength>=0,II=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r),Xs=class{src;dest;opts;ondrain;constructor(e,t,n){this.src=e,this.dest=t,this.opts=n,this.ondrain=()=>e[Vo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Od=class extends Xs{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,t,n){super(e,t,n),this.proxyErrors=o=>t.emit("error",o),e.on("error",this.proxyErrors)}},PI=r=>!!r.objectMode,LI=r=>!r.objectMode&&!!r.encoding&&r.encoding!=="buffer",mr=class extends Md{[Qe]=!1;[ga]=!1;[Tt]=[];[et]=[];[mt];[gn];[In];[Wo];[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");PI(t)?(this[mt]=!0,this[gn]=null):LI(t)?(this[gn]=t.encoding,this[mt]=!1):(this[mt]=!1,this[gn]=null),this[In]=!!t.async,this[Wo]=this[gn]?new vI(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:n}=t;n&&(this[fa]=n,n.aborted?this[Ld]():n.addEventListener("abort",()=>this[Ld]()))}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}[Ld](){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,n){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"&&(n=t,t="utf8"),t||(t="utf8");let o=this[In]?Sa:CI;if(!this[mt]&&!Buffer.isBuffer(e)){if(II(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(AI(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[Rd](e),this[tt]!==0&&this.emit("readable"),n&&o(n),this[Qe]):e.length?(typeof e=="string"&&!(t===this[gn]&&!this[Wo]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[gn]&&(e=this[Wo].write(e)),this[Qe]&&this[tt]!==0&&this[Ks](!0),this[Qe]?this.emit("data",e):this[Rd](e),this[tt]!==0&&this.emit("readable"),n&&o(n),this[Qe]):(this[tt]!==0&&this.emit("readable"),n&&o(n),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[bS](e||null,this[et][0]);return this[qn](),t}[bS](e,t){if(this[mt])this[Ys]();else{let n=t;e===n.length||e===null?this[Ys]():typeof n=="string"?(this[et][0]=n.slice(e),t=n.slice(0,e),this[tt]-=e):(this[et][0]=n.subarray(e),t=n.subarray(0,e),this[tt]-=e)}return this.emit("data",t),!this[et].length&&!this[Vn]&&this.emit("drain"),t}end(e,t,n){return typeof e=="function"&&(n=e,e=void 0),typeof t=="function"&&(n=t,t="utf8"),e!==void 0&&this.write(e,t),n&&this.once("end",n),this[Vn]=!0,this.writable=!1,(this[Qe]||!this[ga])&&this[qn](),this}[Vo](){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[Vo]()}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]}[Rd](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[wS](this[Ys]())&&this[et].length);!e&&!this[et].length&&!this[Vn]&&this.emit("drain")}[wS](e){return this.emit("data",e),this[Qe]}pipe(e,t){if(this[He])return e;this[zt]=!1;let n=this[ur];return t=t||{},e===yS.stdout||e===yS.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,n?t.end&&e.end():(this[Tt].push(t.proxyErrors?new Od(this,e,t):new Xs(this,e,t)),this[In]?Sa(()=>this[Vo]()):this[Vo]()),e}unpipe(e){let t=this[Tt].find(n=>n.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 n=super.on(e,t);if(e==="data")this[zt]=!1,this[Zr]++,!this[Tt].length&&!this[Qe]&&this[Vo]();else if(e==="readable"&&this[tt]!==0)super.emit("readable");else if(RI(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 n}removeListener(e,t){return this.off(e,t)}off(e,t){let n=super.off(e,t);return e==="data"&&(this[Zr]=this.listeners("data").length,this[Zr]===0&&!this[zt]&&!this[Tt].length&&(this[Qe]=!1)),n}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 n=t[0];if(e!=="error"&&e!=="close"&&e!==He&&this[He])return!1;if(e==="data")return!this[mt]&&!n?!1:this[In]?(Sa(()=>this[Id](n)),!0):this[Id](n);if(e==="end")return this[vS]();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]=n,super.emit(Ad,n);let i=!this[fa]||this.listeners("error").length?super.emit("error",n):!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}[Id](e){for(let n of this[Tt])n.dest.write(e)===!1&&this.pause();let t=this[zt]?!1:super.emit("data",e);return this[qn](),t}[vS](){return this[ur]?!1:(this[ur]=!0,this.readable=!1,this[In]?(Sa(()=>this[Pd]()),!0):this[Pd]())}[Pd](){if(this[Wo]){let t=this[Wo].end();if(t){for(let n of this[Tt])n.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",n=>{e.push(n),this[mt]||(e.dataLength+=n.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",n=>t(n)),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(Ad,t),this.off(He,t),this.off("end",t),e=!0,{done:!0,value:void 0}),n=()=>{if(e)return t();let o=this.read();return o===null?t():{done:!1,value:o}};return this.once("end",t),this.once(Ad,t),this.once(He,t),{next:n,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 xI}};var BI=FI.native,ba={lstatSync:kI,readdir:NI,readdirSync:_I,readlinkSync:DI,realpathSync:BI,promises:{lstat:zI,readdir:HI,readlink:jI,realpath:$I}},AS=r=>!r||r===ba||r===UI?ba:{...ba,...r,promises:{...ba.promises,...r.promises||{}}},IS=/^\\\\\?\\([a-z]:)\\?$/i,GI=r=>r.replace(/\//g,"\\").replace(IS,"$1\\"),WI=/[\\\/]/,tn=0,PS=1,LS=2,Pn=4,OS=6,MS=8,Qr=10,kS=12,en=15,ya=~en,kd=16,TS=32,wa=64,fn=128,Zs=256,el=512,ES=wa|fn|el,VI=1023,Nd=r=>r.isFile()?MS:r.isDirectory()?Pn:r.isSymbolicLink()?Qr:r.isCharacterDevice()?LS:r.isBlockDevice()?OS:r.isSocket()?kS:r.isFIFO()?PS:tn,CS=new Map,va=r=>{let e=CS.get(r);if(e)return e;let t=r.normalize("NFKD");return CS.set(r,t),t},RS=new Map,Qs=r=>{let e=RS.get(r);if(e)return e;let t=va(r.toLowerCase());return RS.set(r,t),t},tl=class extends ma{constructor(){super({max:256})}},Dd=class extends ma{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},NS=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,n,o,i,a,s){this.name=e,this.#b=i?Qs(e):va(e),this.#n=t&VI,this.nocase=i,this.roots=o,this.root=n||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=AS(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).#k(o):this.#k(o)}#k(e){let t=this;for(let n of e)t=t.child(n);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&=~kd,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let n=this.children(),o=this.nocase?Qs(e):va(e);for(let l of n)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),n.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 n=t.relative();return n+(!n||!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 n=t.relativePosix();return n+(!n||!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(),n=t+(!t||!e.parent?"":"/")+this.name;return this.#h=n}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)===MS}isDirectory(){return(this.#n&en)===Pn}isCharacterDevice(){return(this.#n&en)===LS}isBlockDevice(){return(this.#n&en)===OS}isFIFO(){return(this.#n&en)===PS}isSocket(){return(this.#n&en)===kS}isSymbolicLink(){return(this.#n&Qr)===Qr}lstatCached(){return this.#n&TS?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&kd)}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()),n=(await this.parent.realpath())?.resolve(t);if(n)return this.#y=n}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()),n=this.parent.realpathSync()?.resolve(t);if(n)return this.#y=n}catch(t){this.#d(t.code);return}}#N(e){this.#n|=kd;for(let t=e.provisional;t<e.length;t++){let n=e[t];n&&n.#_()}}#_(){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 n=Nd(e),o=this.newChild(e.name,n,{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 n=t.provisional;n<t.length;n++){let o=t[n];if((this.nocase?Qs(e.name):va(e.name))===o.#b)return this.#H(e,o,n,t)}}#H(e,t,n,o){let i=t.name;return t.#n=t.#n&ya|Nd(e),i!==e.name&&(t.name=e.name),n!==o.provisional&&(n===o.length-1?o.pop():o.splice(n,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:n,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:v,uid:x}=e;this.#T=t,this.#f=n,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=v,this.#a=x;let b=Nd(e);this.#n=this.#n&ya|b|TS,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(n=>n(null,e))}readdirCB(e,t=!1){if(!this.canReaddir()){t?e(null,[]):queueMicrotask(()=>e(null,[]));return}let n=this.children();if(this.calledReaddir()){let i=n.slice(0,n.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),n.provisional=0;else{for(let s of a)this.#B(s,n);this.#N(n)}this.#V(n.slice(0,n.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 n=()=>{};this.#j=new Promise(o=>n=o);try{for(let o of await this.#e.promises.readdir(t,{withFileTypes:!0}))this.#B(o,e);this.#N(e)}catch(o){this.#F(o.code),e.provisional=0}this.#j=void 0,n()}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 n of this.#e.readdirSync(t,{withFileTypes:!0}))this.#B(n,e);this.#N(e)}catch(n){this.#F(n.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&ES)return!1;let e=en&this.#n;return e===tn||e===Pn||e===Qr}shouldWalk(e,t){return(this.#n&Pn)===Pn&&!(this.#n&ES)&&!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()}}[NS](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let t=new Set([]),n=[],o=this;for(;o&&o.parent;)t.add(o),o.#P=n.join(this.sep),o.#R=n.join("/"),o=o.parent,n.push("..");for(o=e;o&&o.parent&&!t.has(o);)o.#P=void 0,o.#R=void 0,o=o.parent}},nl=class r extends ht{sep="\\";splitSep=WI;constructor(e,t=tn,n,o,i,a,s){super(e,t,n,o,i,a,s)}newChild(e,t=tn,n={}){return new r(e,t,this.root,this.roots,this.nocase,this.childrenCache(),n)}getRootString(e){return _d.parse(e).root}getRoot(e){if(e=GI(e.toUpperCase()),e===this.root.name)return this.root;for(let[t,n]of Object.entries(this.roots))if(this.sameRoot(e,t))return this.roots[e]=n;return this.roots[e]=new qo(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(IS,"$1\\"),e===t}},rl=class r extends ht{splitSep="/";sep="/";constructor(e,t=tn,n,o,i,a,s){super(e,t,n,o,i,a,s)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,t=tn,n={}){return new r(e,t,this.root,this.roots,this.nocase,this.childrenCache(),n)}},ol=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,n,{nocase:o,childrenCacheSize:i=16*1024,fs:a=ba}={}){this.#r=AS(a),(e instanceof URL||e.startsWith("file://"))&&(e=MI(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 Dd(i);let l=s.substring(this.rootPath.length).split(n);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 n=this.#e.get(t);if(n!==void 0)return n;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 n=this.#t.get(t);if(n!==void 0)return n;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:n}=t;if(e.canReaddir()){let o=await e.readdir();return n?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:n=!0}=t;return e.canReaddir()?n?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 n=await e.readlink();return t?n:n?.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 n=e.readlinkSync();return t?n:n?.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 n=await e.realpath();return t?n:n?.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 n=e.realpathSync();return t?n:n?.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:n=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=[];(!i||i(e))&&s.push(n?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(n?S:S.fullpath()),o&&S.isSymbolicLink()?S.realpath().then(v=>v?.isUnknown()?v.lstat():v).then(v=>v?.shouldWalk(l,a)?c(v,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:n=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=[];(!i||i(e))&&s.push(n?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(n?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:n=!0,follow:o=!1,filter:i,walkFilter:a}=t;(!i||i(e))&&(yield n?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 n?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:n=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=new mr({objectMode:!0});(!i||i(e))&&s.write(n?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,v=!1)=>{if(f)return s.emit("error",f);if(o&&!v){let x=[];for(let b of S)b.isSymbolicLink()&&x.push(b.realpath().then(T=>T?.isUnknown()?T.lstat():T));if(x.length){Promise.all(x).then(()=>h(null,S,!0));return}}for(let x of S)x&&(!i||i(x))&&(s.write(n?x:x.fullpath())||(u=!0));d--;for(let x of S){let b=x.realpathCached()||x;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:n=!0,follow:o=!1,filter:i,walkFilter:a}=t,s=new mr({objectMode:!0}),l=new Set;(!i||i(e))&&s.write(n?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(n?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[NS](t)}},qo=class extends ol{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:n=!0}=t;super(e,_d,"\\",{...t,nocase:n}),this.nocase=n;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return _d.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)}},Ko=class extends ol{sep="/";constructor(e=process.cwd(),t={}){let{nocase:n=!1}=t;super(e,OI,"/",{...t,nocase:n}),this.nocase=n}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 Ko{constructor(e=process.cwd(),t={}){let{nocase:n=!0}=t;super(e,{...t,nocase:n})}},A3=process.platform==="win32"?nl:rl,_S=process.platform==="win32"?qo:process.platform==="darwin"?xa:Ko;var qI=r=>r.length>=1,KI=r=>r.length>=1,Yo=class r{#e;#t;#i;length;#r;#a;#w;#c;#p;#s;#l=!0;constructor(e,t,n,o){if(!qI(e))throw new TypeError("empty pattern list");if(!KI(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,n<0||n>=this.length)throw new TypeError("index out of range");if(this.#e=e,this.#t=t,this.#i=n,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 r(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 YI=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Jo=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:n,noext:o,noglobstar:i,platform:a=YI}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=a,this.mmopts={dot:!0,nobrace:t,nocase:n,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 n=0;n<t.set.length;n++){let o=t.set[n],i=t.globParts[n];if(!o||!i)throw new Error("invalid pattern object");for(;o[0]==="."&&i[0]===".";)o.shift(),i.shift();let a=new Yo(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(),n=`${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(n))return!0;return!1}childrenIgnored(e){let t=e.fullpath()+"/",n=(e.relative()||".")+"/";for(let o of this.relativeChildren)if(o.match(n))return!0;for(let o of this.absoluteChildren)if(o.match(t))return!0;return!1}};var Fd=class r{store;constructor(e=new Map){this.store=e}copy(){return new r(new Map(this.store))}hasWalked(e,t){return this.store.get(e.fullpath())?.has(t.globString())}storeWalked(e,t){let n=e.fullpath(),o=this.store.get(n);o?o.add(t.globString()):this.store.set(n,new Set([t.globString()]))}},Ud=class{store=new Map;add(e,t,n){let o=(t?2:0)|(n?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)])}},Bd=class{store=new Map;add(e,t){if(!e.canReaddir())return;let n=this.store.get(e);n?n.find(o=>o.globString()===t.globString())||n.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 r{hasWalkedCache;matches=new Ud;subwalks=new Bd;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Fd}processPatterns(e,t){this.patterns=t;let n=t.map(o=>[e,o]);for(let[o,i]of n){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 r(this.opts,this.hasWalkedCache)}filterEntries(e,t){let n=this.subwalks.get(e),o=this.child();for(let i of t)for(let a of n){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,n,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()&&(n&&t.checkFollowGlobstar()?this.subwalks.add(e,n):t.markFollowGlobstar()&&this.subwalks.add(e,t)))),n){let i=n.pattern();if(typeof i=="string"&&i!==".."&&i!==""&&i!==".")this.testString(e,i,n.rest(),o);else if(i===".."){let a=e.parent||e;this.subwalks.add(a,n)}else i instanceof RegExp&&this.testRegExp(e,i,n.rest(),o)}}testRegExp(e,t,n,o){t.test(e.name)&&(n?this.subwalks.add(e,n):this.matches.add(e,o,!1))}testString(e,t,n,o){e.isNamed(t)&&(n?this.subwalks.add(e,n):this.matches.add(e,o,!1))}};var JI=(r,e)=>typeof r=="string"?new Jo([r],e):Array.isArray(r)?new Jo(r,e):r,il=class{path;patterns;opts;seen=new Set;paused=!1;aborted=!1;#e=[];#t;#i;signal;maxDepth;includeChildMatches;constructor(e,t,n){if(this.patterns=e,this.path=t,this.opts=n,this.#i=!n.posix&&n.platform==="win32"?"\\":"/",this.includeChildMatches=n.includeChildMatches!==!1,(n.ignore||!this.includeChildMatches)&&(this.#t=JI(n.ignore??[],n),!this.includeChildMatches&&typeof this.#t.add!="function")){let o="cannot ignore child matches, ignore lacks add() method.";throw new Error(o)}this.maxDepth=n.maxDepth||1/0,n.signal&&(this.signal=n.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 n;if(this.opts.realpath){if(n=e.realpathCached()||await e.realpath(),!n)return;e=n}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 n;if(this.opts.realpath){if(n=e.realpathCached()||e.realpathSync(),!n)return;e=n}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 n=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(n){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,n){let o=await this.matchCheck(e,n);o&&this.matchFinish(o,t)}matchSync(e,t,n){let o=this.matchCheckSync(e,n);o&&this.matchFinish(o,t)}walkCB(e,t,n){this.signal?.aborted&&n(),this.walkCB2(e,t,new Ta(this.opts),n)}walkCB2(e,t,n,o){if(this.#a(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2(e,t,n,o));return}n.processPatterns(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of n.matches.entries())this.#r(s)||(i++,this.match(s,l,c).then(()=>a()));for(let s of n.subwalkTargets()){if(this.maxDepth!==1/0&&s.depth()>=this.maxDepth)continue;i++;let l=s.readdirCached();s.calledReaddir()?this.walkCB3(s,l,n,a):s.readdirCB((c,d)=>this.walkCB3(s,d,n,a),!0)}a()}walkCB3(e,t,n,o){n=n.filterEntries(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of n.matches.entries())this.#r(s)||(i++,this.match(s,l,c).then(()=>a()));for(let[s,l]of n.subwalks.entries())i++,this.walkCB2(s,l,n.child(),a);a()}walkCBSync(e,t,n){this.signal?.aborted&&n(),this.walkCB2Sync(e,t,new Ta(this.opts),n)}walkCB2Sync(e,t,n,o){if(this.#a(e))return o();if(this.signal?.aborted&&o(),this.paused){this.onResume(()=>this.walkCB2Sync(e,t,n,o));return}n.processPatterns(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of n.matches.entries())this.#r(s)||this.matchSync(s,l,c);for(let s of n.subwalkTargets()){if(this.maxDepth!==1/0&&s.depth()>=this.maxDepth)continue;i++;let l=s.readdirSync();this.walkCB3Sync(s,l,n,a)}a()}walkCB3Sync(e,t,n,o){n=n.filterEntries(e,t);let i=1,a=()=>{--i===0&&o()};for(let[s,l,c]of n.matches.entries())this.#r(s)||this.matchSync(s,l,c);for(let[s,l]of n.subwalks.entries())i++,this.walkCB2Sync(s,l,n.child(),a);a()}},Ea=class extends il{matches=new Set;constructor(e,t,n){super(e,t,n)}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,n){super(e,t,n),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 ZI=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=XI(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||ZI,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"?qo:t.platform==="darwin"?xa:t.platform?Ko:_S;this.scurry=new l(this.cwd,{nocase:t.nocase,fs:t.fs})}this.nocase=this.scurry.nocase;let n=this.platform==="darwin"||this.platform==="win32",o={...t,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:n,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 Yo(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 zd=(r,e={})=>{Array.isArray(r)||(r=[r]);for(let t of r)if(new Bt(t,e).hasMagic())return!0;return!1};function al(r,e={}){return new Sn(r,e).streamSync()}function US(r,e={}){return new Sn(r,e).stream()}function Xo(r,e={}){return new Sn(r,e).walkSync()}async function DS(r,e={}){return new Sn(r,e).walk()}function sl(r,e={}){return new Sn(r,e).iterateSync()}function BS(r,e={}){return new Sn(r,e).iterate()}var QI=al,eP=Object.assign(US,{sync:al}),tP=sl,nP=Object.assign(BS,{sync:sl}),rP=Object.assign(Xo,{stream:al,iterate:sl}),FS=Object.assign(DS,{glob:DS,globSync:Xo,sync:rP,globStream:US,stream:eP,globStreamSync:al,streamSync:QI,globIterate:BS,iterate:nP,globIterateSync:sl,iterateSync:tP,Glob:Sn,hasMagic:zd,escape:jo,unescape:hn});FS.glob=FS;import eo,{dirname as $S}from"path";import{cwd as Wd}from"process";import GS from"yaml";import{z as ue}from"zod";import zS from"fs";import Ra from"path";import oP from"yaml";import{z as Hd}from"zod";var HS=!1,jd=[`**/*.${Mt.TEST}`,`**/*.${Mt.MODULE}`],$d=Hd.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),Gd=50,iP=Hd.object({fileType:Hd.nativeEnum(Ae)});function we(r,e){let t={project:r,tests:{},modules:{}},n=r.config.include??jd,o=Array.from(r.config.exclude??[]).concat(Kh),i=Xo(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:Gd,nodir:!0});for(let a of i)aP(r.rootDir,a,t,e);return HS=!0,t}function aP(r,e,t,n){let o=Ra.join(r,e),i;try{i=zS.readFileSync(o,"utf-8")}catch(p){n.warn(`Could not read possible Momentic file at ${o}, skipping: ${p}`);return}let a;try{if(a=oP.parse(i),typeof a!="object"||a===null)throw new Error("The YAML document should parse as a map with key-value pairs")}catch(p){n.warn(`Could not parse possible Momentic file at ${o}, skipping: ${p}`);return}let s=iP.safeParse(a);if(s.error){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let l=s.data.fileType,c;try{c=zS.statSync(o)}catch(p){n.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.
41
+ `)}function df(n,e){try{if(!n)return n;if(typeof n=="string")return He(n,3e4);if(typeof n=="object"){let{jsonString:t}=Io(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 vd(n,e){for(let t=0;t<n.length;t++){let r=n[t];try{if(r.data){let{jsonString:o}=Io(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":lf(r);break;case"CONDITIONAL":r.assertion&&lf(r.assertion),vd(r.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"IFRAME":case"MODULE":case"SECTION":{vd(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 lf(n){let e=n.command;"cache"in e&&e.cache&&(e.cache=void 0)}function cf(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 Da(n,e){let t=cA(n);if(vd(t,e),t.length>of)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,of);let r=cf(t,e);if(r.length>sf)for(e.error({serializedLength:r.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");r.length>sf;)t.pop(),r=cf(t,e);try{return Ot.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 VV}from"lodash-es";var pA=/^(?!.*\S+\s+\S+).*$/,uA=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,mA=/style="([^"]*)/g,hA=/data-[\w-]+/g,gA=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 pf(n){let e=gA(n),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:pA.test(t)&&uA.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:mA.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"}:hA.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 uf(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 Uf}from"lodash-es";import wA from"diff-lines";import Ua,{gte as vA}from"semver";var mf={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 hf={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 fA=["target","fromTarget","toTarget"];function gf(n){for(let e of fA){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var ff={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 gf(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])gf(r);return e}default:return e}})};import{v4 as SA}from"uuid";var Sf={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=SA()),e;default:return e}})};import{v4 as yf}from"uuid";var bf={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??yf(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??yf()}})),delete e.commands),e;default:return e}})};var wf={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 yA}from"uuid";var vf={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=yA()),e))};import{v4 as xf}from"uuid";var Tf={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=xf())}return e.id=xf(),e})};var Ef={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as bA}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=bA()),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 Rf={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 Af={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&&If(t),e})};function If(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){If(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 Pf={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 Lf={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 Of={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 Mf={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 kf={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 Fa=new Set(["CLICK","TYPE","SELECT_OPTION"]),Nf={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||Fa.has(r))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(s=>{let a=s?.elementDescriptor,l=s?.type;(a!==void 0||Fa.has(l))&&(s.target={elementDescriptor:a??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(s=>{let a=s.command,l=a?.elementDescriptor,c=a?.type;(l!==void 0||Fa.has(c))&&(a.target={elementDescriptor:l??""}),s.commands&&Array.isArray(s.commands)&&s.commands.forEach(p=>{let u=p?.elementDescriptor,m=p?.type;(u!==void 0||Fa.has(m))&&(p.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var _f={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 Df={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 s=i.type;s?.startsWith("PRESET_")&&(i.type=s.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let s=i.command,a=s?.type;a?.startsWith("PRESET_")&&(s.type=a.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 Wr=[kf,_f,Df,Nf,mf,hf,ff,Sf,bf,wf,vf,Tf,Ef,Cf,Rf,Af,Pf,Lf,Of,Mf];if(_e!==Wr[Wr.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Wr.forEach((n,e)=>{if(!Ua.valid(n.toVersion)||!Ua.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Ua.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if(Wr[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function xA(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var is=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:s}=n,a=Wr.findIndex(d=>Ua.gt(d.toVersion,i));if(a===-1)return{steps:o,newVersion:i};let l=i;for(let d=a;d<Wr.length;d++){if(r&&vA(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let p=Wr[d],u={id:s,migration:p.name,toVersion:p.toVersion};try{o=await Ff(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=wA(JSON.stringify(e,void 0,2),JSON.stringify(o,void 0,2),{n_surrounding:1});return c.trim()&&t.debug({diffs:c,id:s},"Migration diffs"),{newVersion:l,steps:o}};async function Ff(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)||xA(i)&&(r[o]=await Ff(i,e))}return t}async function Bf({rawSteps:n,metadata:e,logger:t,callbacks:r}){uf(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:s}=await Ba({rawSteps:n.steps,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o}),a={...e,steps:i,schemaVersion:s};for(let l of["beforeSteps","afterSteps"]){let c=n[l];if(!c)continue;let{resolvedSteps:d}=await Ba({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});a[l]=d}return{resolvedTest:a,moduleIds:Array.from(Object.keys(o))}}async function Vr(n,e,t){let{newVersion:r,steps:o}=await is({metadata:n,steps:e,logger:t});try{return{steps:ve.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 Aa(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function Ba({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:s}=await Vr(e,n,t),a=[];for(let l of s)a.push(await ss({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:a,newSchemaVersion:i}}async function ss({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{...Uf(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 is({metadata:{id:l,schemaVersion:d.schemaVersion},steps:d.steps,logger:t}),m;try{m=ve.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=>ss({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]=Uf(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 ss({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 ss({step:l,callbacks:e,logger:t,resolvedModuleCache:r}))}return{...n,blocks:o,elseSteps:i};case"SECTION":case"IFRAME":let s=[];for(let l of n.steps)s.push(await ss({step:l,callbacks:e,logger:t,resolvedModuleCache:r}));return{...n,steps:s};default:return(l=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}}function TA(n){return typeof n=="object"&&n!==null}function $n(n){if(Array.isArray(n))return n.map($n);if(TA(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=$n(r))}),e}return n}import{cloneDeep as EA}from"lodash-es";import{stringify as zf}from"yaml";async function Hf({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 CA({originalStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),s={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:zf(s),modules:o}}async function CA({originalStepLists:n,modules:e,processedModuleNames:t,createNewCacheIds:r}){let o=EA(n);Object.values(o).forEach(a=>{RA(a??[])});let{stepsToSave:i,moduleUpdates:s}=await _t({stepLists:o,createNewCacheIds:r});for(let a of s)t.has(a.name)||(e[a.name]=AA(a),t.add(a.name));return i}function RA(n){fd({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 AA(n){let e=Pt.parse(n),t={fileType:Ae.MODULE,...e,schemaVersion:_e,steps:n.steps};return zf(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 as({promiseGenerator:n,signal:e,codePath:t,logger:r}){let i=Date.now(),s=setInterval(()=>{if(e?.aborted){clearInterval(s);return}r?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((a,l)=>{function c(){clearInterval(s),e?.removeEventListener("abort",c),l(e?.reason)}if(e?.aborted){l(e?.reason),clearInterval(s);return}e?.addEventListener("abort",c),(async()=>{try{a(await n())}catch(d){l(d)}finally{clearInterval(s),e?.removeEventListener("abort",c)}})()})}async function qr({promiseGenerator:n,timeoutMs:e,codePath:t,logger:r,signal:o}){let i=!1,s=new AbortController,a=()=>{s.abort()},l=setTimeout(()=>{i||s.abort()},e);o?.addEventListener("abort",a);try{return await as({promiseGenerator:n,signal:s.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",a),clearTimeout(l)}}function za(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:za(t.steps)};e.push(ve.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:za(o.steps)})),elseSteps:t.elseSteps?za(t.elseSteps):void 0};e.push(Lr.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 Ha(n){return za([n])[0]}import IA from"picomatch";var jf=(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||IA(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r},ja=(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}},zo=n=>{try{return new URL(n),!0}catch{return!1}},$f=n=>!n.toLowerCase().startsWith("http"),Ho=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function Kr(n,e){try{return!!new URL(n).origin.trim()}catch(t){return e?.error({url:n,err:t},"Invalid URL in check"),!1}}import jo from"yaml";import{z as qf}from"zod";import{execSync as PA}from"child_process";function Yr(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{PA(r,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")}}import{diff as Gf}from"deep-object-diff";import pr from"fs";import{cloneDeep as LA}from"lodash-es";import xd from"path";import{v4 as OA}from"uuid";import ls from"yaml";function Jr({content:n,schemaVersion:e,momenticFiles:t,project:r,forceSaveOnNoDiffs:o}){let i=t.modules[n.moduleId]?.fullFilePath;if(!i||!pr.existsSync(i))throw new Error(`Tried to update module ${n.moduleId} that could not be found on disk`);let s=pr.readFileSync(i,"utf-8"),a=ls.parse(s),l;if(n.name&&n.name!==a.name){let m=`${ke(n.name)}.${Nt.MODULE}`;if(l=xd.join(xd.dirname(i),m),pr.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,...dd.parse(c),steps:ve.array().parse(n.steps)}),p=Gf(d,a);if(p&&Object.keys(p).length===0&&!o){y.debug(`Skipping save for module ${n.moduleId} since there are no changes`);return}let u=ls.stringify(d);pr.writeFileSync(i,u,"utf-8"),l&&pr.renameSync(i,l),Yr(l||i,r.config)}function Wf({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 s=Gn(i,o),a={...s,...e},l=$n({fileType:Ae.MODULE,...dd.parse(a),steps:s.steps}),c=Gf(l,s);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let d=ls.stringify(l);pr.writeFileSync(i,d,"utf-8"),Yr(i,r.config)}async function Vf({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let s=ke(n),a=xd.join(o,`${s}.module.yaml`),l=OA(),{stepsToSave:c}=await _t({stepLists:{steps:r}}),d={fileType:Ae.MODULE,schemaVersion:_e,moduleId:l,name:n,description:e,enabled:t,steps:c.steps},p=ls.stringify(d);return pr.writeFileSync(a,p,"utf-8"),Yr(a,i.config),{moduleId:l,name:n,description:e,enabled:t,steps:r}}function Gn(n,e){let t=pr.readFileSync(n,"utf-8"),r=ls.parse(t);try{return md.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 Td(n,e,t,r){let o=Gn(n.fullFilePath,t),{resolvedSteps:i}=await Ba({rawSteps:o.steps,migrationMetadata:{id:o.moduleId,schemaVersion:o.schemaVersion},resolvedModuleCache:r,logger:t,callbacks:{onFetchModule:async({id:a})=>{let l=e.modules[a]?.fullFilePath;if(l)return Gn(l,t)}}}),s={...o,steps:i};return r&&(r[n.id]=LA(s)),s}async function $a(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await Td(r,n,e,t)})),Array.from(Object.values(t))}async function Kf({test:n,name:e,folder:t}){let r=await Hf({test:n});if(Object.keys(r.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${ke(e)}.${Nt.TEST}`,s=Xr.join(t,i);return mn.writeFileSync(s,r.test,"utf-8"),s}function Ed(n,e,t){let r=Xr.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=jo.parse(o),s,a;if(e.name&&e.name!==i.name){let u=`${ke(e.name)}.${Nt.TEST}`;if(s=Xr.join(Xr.dirname(n),u),a=Xr.join(t.rootDir,s),mn.existsSync(a))throw new Error(`Test with name '${e.name}' already exists at path '${a}'`)}let l={...i,...e},c=tn.parse(l),d={fileType:Ae.TEST,...tn.parse(c),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},p=jo.stringify(d);return mn.writeFileSync(r,p,"utf-8"),a&&mn.renameSync(r,a),Yr(r,t.config),{newRelativeTestPath:s}}function Wn({relativeTestPath:n,steps:e,schemaVersion:t,project:r,forceSaveOnNoDiffs:o}){let i=Xr.join(r.rootDir,n);if(!mn.existsSync(i))throw new Error(`Test not found at path '${n}' in project '${r.rootDir}'`);let s=mn.readFileSync(i,"utf-8"),a=jo.parse(s),l=tn.parse({...a,schemaVersion:t}),c=$n({fileType:Ae.TEST,...l,beforeSteps:ve.array().or(qf.undefined()).parse(e.beforeSteps),steps:ve.array().parse(e.steps),afterSteps:ve.array().or(qf.undefined()).parse(e.afterSteps)}),d=MA(c,a);if(d&&Object.keys(d).length===0&&!o){y.debug(`Skipping save for test ${l.name} since there are no changes`);return}let p=jo.stringify(c);mn.writeFileSync(i,p,"utf-8"),y.debug(`Saving test ${l.name} to ${i}`),Yr(i,r.config)}function Ga(n,e){let t=Xr.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=jo.parse(r)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return wt.parse(o)}function Zr(n,e,t){let r=t.project.rootDir,o;try{o=mn.readFileSync(n,"utf-8")}catch(s){throw e.error({err:s,projectRoot:r},s.message),new Error(s.message)}let i=jo.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${n} is missing steps`);return i}async function cs(n,e,t){let r=Zr(n,e,t),o;try{o=tn.parse(r)}catch(s){throw new Error(`Test ${n} is missing metadata or has invalid metadata: ${s}`)}let{resolvedTest:i}=await Bf({rawSteps:{steps:r.steps,beforeSteps:r.beforeSteps,afterSteps:r.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:s,logger:a})=>{let l=t.modules[s]?.fullFilePath;if(l)return Gn(l,a)}}});return i}import kA from"@dotenvx/dotenvx";import NA from"fs";import Yf from"path";function Xf(n,e){return(n.config.environments??[]).map(t=>ds(t.name,n,e))}function Jf(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 ds(n,e,t){let r=(e.config.environments??[]).find(s=>s.name===n);if(!r)throw new Error(`Environment ${n} not found in local project configuration file`);let o={[We]:Jf(r.baseUrl)};if(r.envVariables){let s={};for(let[a,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=Jf(l);c&&(s[a]=c)}else{let c=l.fromFile,d;try{d=NA.readFileSync(Yf.resolve(e.rootDir,c),"utf-8")}catch(p){throw new Error(`Failed to read environment variable '${a}' from file '${c}': ${p}`)}if(l.json)try{s[a]=JSON.parse(d)}catch(p){throw new Error(`Failed to parse environment variable '${a}' from file '${c}' as JSON: ${p}`)}else s[a]=d}Object.keys(s).length>0&&y.debug(s,"Set environment variables with interpolation from project configuration"),Object.assign(o,s)}if(r.envFile){let s={},a=kA.config({path:Yf.resolve(e.rootDir,r.envFile),processEnv:s,logLevel:"error",quiet:!0});if(a.error)throw new Error(`Failed to load .env file: ${a.error.message}`);t.debug(s,"Set environment variables from .env file"),Object.assign(o,s)}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 pP,readFileSync as uP,readdirSync as mP,writeFileSync as hP}from"fs";var yS=Hx(dS(),1);var us=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var jA={"[: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]},ms=n=>n.replace(/[[\]\\-]/g,"\\$&"),$A=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),pS=n=>n.join(""),uS=(n,e)=>{let t=e;if(n.charAt(t)!=="[")throw new Error("not in a brace expression");let r=[],o=[],i=t+1,s=!1,a=!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==="]"&&s&&!l){d=i+1;break}if(s=!0,g==="\\"&&!l){l=!0,i++;continue}if(g==="["&&!l){for(let[f,[S,v,x]]of Object.entries(jA))if(n.startsWith(f,i)){if(p)return["$.",!1,n.length-t,!0];i+=f.length,x?o.push(S):r.push(S),a=a||v;continue e}}if(l=!1,p){g>p?r.push(ms(p)+"-"+ms(g)):g===p&&r.push(ms(g)),p="",i++;continue}if(n.startsWith("-]",i+1)){r.push(ms(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){p=g,i+=2;continue}r.push(ms(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?"^":"")+pS(r)+"]",m="["+(c?"":"^")+pS(o)+"]";return[r.length&&o.length?"("+u+"|"+m+")":r.length?u:m,a,d-t,!0]};var hn=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/\[([^\/\\])\]/g,"$1"):n.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var GA=new Set(["!","?","+","*","@"]),mS=n=>GA.has(n),WA="(?!(?:^|/)\\.\\.?(?:$|/))",Wa="(?!\\.)",VA=new Set(["[","."]),qA=new Set(["..","."]),KA=new Set("().*{}+?[]^$\\!"),YA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Ad="[^/]",hS=Ad+"*?",gS=Ad+"+?",$o=class n{type;#e;#t;#i=!1;#r=[];#s;#w;#c;#p=!1;#a;#l;#o=!1;constructor(e,t,r={}){this.type=e,e&&(this.#t=!0),this.#s=t,this.#e=this.#s?this.#s.#e:this,this.#a=this.#e===this?r:this.#e.#a,this.#c=this.#e===this?[]:this.#e.#c,e==="!"&&!this.#e.#p&&this.#c.push(this),this.#w=this.#s?this.#s.#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.#s;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.#s}}return this}push(...e){for(let t of e)if(t!==""){if(typeof t!="string"&&!(t instanceof n&&t.#s===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.#s?.type==="!")&&e.push({}),e}isStart(){if(this.#e===this)return!0;if(!this.#s?.isStart())return!1;if(this.#w===0)return!0;let e=this.#s;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.#s?.type==="!")return!0;if(!this.#s?.isEnd())return!1;if(!this.type)return this.#s?.isEnd();let e=this.#s?this.#s.#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,s=!1,a=-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(s){m===a+1?(g==="^"||g==="!")&&(l=!0):g==="]"&&!(m===a+2&&l)&&(s=!1),h+=g;continue}else if(g==="["){s=!0,a=m,l=!1,h+=g;continue}if(!o.noext&&mS(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(s){c===a+1?(m==="^"||m==="!")&&(l=!0):m==="]"&&!(c===a+2&&l)&&(s=!1),u+=m;continue}else if(m==="["){s=!0,a=c,l=!1,u+=m;continue}if(mS(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.#a.nocase&&!this.#a.nocaseMagicOnly&&e.toUpperCase()!==e.toLowerCase()))return r;let a=(this.#a.nocase?"i":"")+(i?"u":"");return Object.assign(new RegExp(`^${t}$`,a),{_src:t,_glob:e})}get options(){return this.#a}toRegExpSource(e){let t=e??!!this.#a.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&&qA.has(this.#r[0]))){let h=VA,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?WA:f?Wa:""}let p="";return this.isEnd()&&this.#e.#p&&this.#s?.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 s=!r||e||t||!Wa?"":this.#m(!0);s===i&&(s=""),s&&(i=`(?:${i})(?:${s})*?`);let a="";if(this.type==="!"&&this.#o)a=(this.isStart()&&!t?Wa:"")+gS;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?Wa:"")+hS+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&s?")":this.type==="*"&&s?")?":`)${this.type}`;a=o+i+l}return[a,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,s]=t.toRegExpSource(e);return this.#i=this.#i||s,r}).filter(t=>!(this.isStart()&&this.isEnd())||!!t).join("|")}static#u(e,t,r=!1){let o=!1,i="",s=!1;for(let a=0;a<e.length;a++){let l=e.charAt(a);if(o){o=!1,i+=(KA.has(l)?"\\":"")+l;continue}if(l==="\\"){a===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,d,p,u]=uS(e,a);if(p){i+=c,s=s||d,a+=p-1,t=t||u;continue}}if(l==="*"){r&&e==="*"?i+=gS:i+=hS,t=!0;continue}if(l==="?"){i+=Ad,t=!0;continue}i+=YA(l)}return[i,hn(e),!!t,s]}};var Go=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/[?*()[\]]/g,"[$&]"):n.replace(/[?*()[\]\\]/g,"\\$&");var vt=(n,e,t={})=>(us(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Ht(e,t).match(n)),JA=/^\*+([^+@!?\*\[\(]*)$/,XA=n=>e=>!e.startsWith(".")&&e.endsWith(n),ZA=n=>e=>e.endsWith(n),QA=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),eI=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),tI=/^\*+\.\*+$/,nI=n=>!n.startsWith(".")&&n.includes("."),rI=n=>n!=="."&&n!==".."&&n.includes("."),oI=/^\.\*+$/,iI=n=>n!=="."&&n!==".."&&n.startsWith("."),sI=/^\*+$/,aI=n=>n.length!==0&&!n.startsWith("."),lI=n=>n.length!==0&&n!=="."&&n!=="..",cI=/^\?+([^+@!?\*\[\(]*)?$/,dI=([n,e=""])=>{let t=bS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},pI=([n,e=""])=>{let t=wS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},uI=([n,e=""])=>{let t=wS([n]);return e?r=>t(r)&&r.endsWith(e):t},mI=([n,e=""])=>{let t=bS([n]);return e?r=>t(r)&&r.endsWith(e):t},bS=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},wS=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},vS=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",fS={win32:{sep:"\\"},posix:{sep:"/"}},hI=vS==="win32"?fS.win32.sep:fS.posix.sep;vt.sep=hI;var at=Symbol("globstar **");vt.GLOBSTAR=at;var gI="[^/]",fI=gI+"*?",SI="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",yI="(?:(?!(?:\\/|^)\\.).)*?",bI=(n,e={})=>t=>vt(t,n,e);vt.filter=bI;var nn=(n,e={})=>Object.assign({},n,e),wI=n=>{if(!n||typeof n!="object"||!Object.keys(n).length)return vt;let e=vt;return Object.assign((r,o,i={})=>e(r,o,nn(n,i)),{Minimatch:class extends e.Minimatch{constructor(o,i={}){super(o,nn(n,i))}static defaults(o){return e.defaults(nn(n,o)).Minimatch}},AST:class extends e.AST{constructor(o,i,s={}){super(o,i,nn(n,s))}static fromGlob(o,i={}){return e.AST.fromGlob(o,nn(n,i))}},unescape:(r,o={})=>e.unescape(r,nn(n,o)),escape:(r,o={})=>e.escape(r,nn(n,o)),filter:(r,o={})=>e.filter(r,nn(n,o)),defaults:r=>e.defaults(nn(n,r)),makeRe:(r,o={})=>e.makeRe(r,nn(n,o)),braceExpand:(r,o={})=>e.braceExpand(r,nn(n,o)),match:(r,o,i={})=>e.match(r,o,nn(n,i)),sep:e.sep,GLOBSTAR:at})};vt.defaults=wI;var xS=(n,e={})=>(us(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,yS.default)(n));vt.braceExpand=xS;var vI=(n,e={})=>new Ht(n,e).makeRe();vt.makeRe=vI;var xI=(n,e,t={})=>{let r=new Ht(e,t);return n=n.filter(o=>r.match(o)),r.options.nonull&&!n.length&&n.push(e),n};vt.match=xI;var SS=/[?*]|[+@!]\(.*?\)|\[|\]/,TI=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Ht=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,t={}){us(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||vS,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,s,a)=>{if(this.isWindows&&this.windowsNoMagicRoot){let l=i[0]===""&&i[1]===""&&(i[2]==="?"||!SS.test(i[2]))&&!SS.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 s=this.set[i];s[0]===""&&s[1]===""&&this.globParts[i][2]==="?"&&typeof s[3]=="string"&&/^[a-z]:$/i.test(s[3])&&(s[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 s=o;for(;r[s+1]==="**";)s++;s>o&&r.splice(o+1,s-o);let a=r[o+1],l=r[o+2],c=r[o+3];if(a!==".."||!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 s=1;s<r.length-1;s++){let a=r[s];s===1&&a===""&&r[0]===""||(a==="."||a==="")&&(t=!0,r.splice(s,1),s--)}r[0]==="."&&r.length===2&&(r[1]==="."||r[1]==="")&&(t=!0,r.pop())}let i=0;for(;(i=r.indexOf("..",i+1))!==-1;){let s=r[i-1];if(s&&s!=="."&&s!==".."&&s!=="**"){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,s=[],a="";for(;o<e.length&&i<t.length;)if(e[o]===t[i])s.push(a==="b"?t[i]:e[o]),o++,i++;else if(r&&e[o]==="**"&&t[i]===e[o+1])s.push(e[o]),o++;else if(r&&t[i]==="**"&&e[o]===t[i+1])s.push(t[i]),i++;else if(e[o]==="*"&&t[i]&&(this.options.dot||!t[i].startsWith("."))&&t[i]!=="**"){if(a==="b")return!1;a="a",s.push(e[o]),o++,i++}else if(t[i]==="*"&&e[o]&&(this.options.dot||!e[o].startsWith("."))&&e[o]!=="**"){if(a==="a")return!1;a="b",s.push(t[i]),o++,i++}else return!1;return e.length===t.length&&s}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]),v=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),x=f?3:g?0:void 0,b=v?3:S?0:void 0;if(typeof x=="number"&&typeof b=="number"){let[T,C]=[e[x],t[b]];T.toLowerCase()===C.toLowerCase()&&(t[b]=T,b>x?t=t.slice(b):x>b&&(e=e.slice(x)))}}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 s=0,a=0,l=e.length,c=t.length;s<l&&a<c;s++,a++){this.debug("matchOne loop");var d=t[a],p=e[s];if(this.debug(t,d,p),d===!1)return!1;if(d===at){this.debug("GLOBSTAR",[t,d,p]);var u=s,m=a+1;if(m===c){for(this.debug("** at the end");s<l;s++)if(e[s]==="."||e[s]===".."||!o.dot&&e[s].charAt(0)===".")return!1;return!0}for(;u<l;){var h=e[u];if(this.debug(`
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(s===l&&a===c)return!0;if(s===l)return r;if(a===c)return s===l-1&&e[s]==="";throw new Error("wtf?")}braceExpand(){return xS(this.pattern,this.options)}parse(e){us(e);let t=this.options;if(e==="**")return at;if(e==="")return"";let r,o=null;(r=e.match(sI))?o=t.dot?lI:aI:(r=e.match(JA))?o=(t.nocase?t.dot?eI:QA:t.dot?ZA:XA)(r[1]):(r=e.match(cI))?o=(t.nocase?t.dot?pI:dI:t.dot?uI:mI)(r):(r=e.match(tI))?o=t.dot?rI:nI:(r=e.match(oI))&&(o=iI);let i=$o.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?fI:t.dot?SI:yI,o=new Set(t.nocase?["i"]:[]),i=e.map(l=>{let c=l.map(d=>{if(d instanceof RegExp)for(let p of d.flags.split(""))o.add(p);return typeof d=="string"?TI(d):d===at?at:d._src});return c.forEach((d,p)=>{let u=c[p+1],m=c[p-1];d!==at||m===at||(m===void 0?u!==void 0&&u!==at?c[p+1]="(?:\\/|"+r+"\\/)?"+u:c[p]=r:u===void 0?c[p-1]=m+"(?:\\/|"+r+")?":u!==at&&(c[p-1]=m+"(?:\\/|\\/"+r+"\\/)"+u,c[p+1]=at))}),c.filter(d=>d!==at).join("/")}).join("|"),[s,a]=e.length>1?["(?:",")"]:["",""];i="^"+s+i+a+"$",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 s=o[o.length-1];if(!s)for(let a=o.length-2;!s&&a>=0;a--)s=o[a];for(let a=0;a<i.length;a++){let l=i[a],c=o;if(r.matchBase&&l.length===1&&(c=[s]),this.matchOne(c,l,t))return r.flipNegate?!0:!this.negate}return r.flipNegate?!1:this.negate}static defaults(e){return vt.defaults(e).Minimatch}};vt.AST=$o;vt.Minimatch=Ht;vt.escape=Go;vt.unescape=hn;import{fileURLToPath as tP}from"node:url";var Wo=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,ES=new Set,Id=typeof process=="object"&&process?process:{},CS=(n,e,t,r)=>{typeof Id.emitWarning=="function"?Id.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},Va=globalThis.AbortController,TS=globalThis.AbortSignal;if(typeof Va>"u"){TS=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},Va=class{constructor(){e()}signal=new TS;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=Id.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 EI=n=>!ES.has(n),w3=Symbol("type"),ur=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),RS=n=>ur(n)?n<=Math.pow(2,8)?Uint8Array:n<=Math.pow(2,16)?Uint16Array:n<=Math.pow(2,32)?Uint32Array:n<=Number.MAX_SAFE_INTEGER?Vo:null:null,Vo=class extends Array{constructor(e){super(e),this.fill(0)}},Pd=class n{heap;length;static#e=!1;static create(e){let t=RS(e);if(!t)return[];n.#e=!0;let r=new n(e,t);return n.#e=!1,r}constructor(e,t){if(!n.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new t(e),this.length=0}push(e){this.heap[this.length++]=e}pop(){return this.heap[--this.length]}},hs=class n{#e;#t;#i;#r;#s;#w;ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#c;#p;#a;#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.#a,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.#s}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:s,updateAgeOnHas:a,allowStale:l,dispose:c,disposeAfter:d,noDisposeOnSet:p,noUpdateTTL:u,maxSize:m=0,maxEntrySize:h=0,sizeCalculation:g,fetchMethod:f,memoMethod:S,noDeleteOnFetchRejection:v,noDeleteOnStaleGet:x,allowStaleOnFetchRejection:b,allowStaleOnFetchAbort:T,ignoreFetchAbort:C}=e;if(t!==0&&!ur(t))throw new TypeError("max option must be a nonnegative integer");let A=t?RS(t):Array;if(!A)throw new Error("invalid max value: "+t);if(this.#e=t,this.#t=m,this.maxEntrySize=h||this.#t,this.sizeCalculation=g,this.sizeCalculation){if(!this.#t&&!this.maxEntrySize)throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");if(typeof this.sizeCalculation!="function")throw new TypeError("sizeCalculation set to non-function")}if(S!==void 0&&typeof S!="function")throw new TypeError("memoMethod must be a function if defined");if(this.#w=S,f!==void 0&&typeof f!="function")throw new TypeError("fetchMethod must be a function if specified");if(this.#s=f,this.#x=!!f,this.#a=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=Pd.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=!!v,this.allowStaleOnFetchRejection=!!b,this.allowStaleOnFetchAbort=!!T,this.ignoreFetchAbort=!!C,this.maxEntrySize!==0){if(this.#t!==0&&!ur(this.#t))throw new TypeError("maxSize must be a positive integer if specified");if(!ur(this.maxEntrySize))throw new TypeError("maxEntrySize must be a positive integer if specified");this.#L()}if(this.allowStale=!!l,this.noDeleteOnStaleGet=!!x,this.updateAgeOnGet=!!s,this.updateAgeOnHas=!!a,this.ttlResolution=ur(o)||o===0?o:1,this.ttlAutopurge=!!i,this.ttl=r||0,this.ttl){if(!ur(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";EI(N)&&(ES.add(N),CS("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",N,n))}}getRemainingTTL(e){return this.#a.has(e)?1/0:0}#P(){let e=new Vo(this.#e),t=new Vo(this.#e);this.#b=e,this.#C=t,this.#M=(i,s,a=Wo.now())=>{if(t[i]=s!==0?a:0,e[i]=s,s!==0&&this.ttlAutopurge){let l=setTimeout(()=>{this.#y(i)&&this.#O(this.#l[i],"expire")},s+1);l.unref&&l.unref()}},this.#R=i=>{t[i]=e[i]!==0?Wo.now():0},this.#n=(i,s)=>{if(e[s]){let a=e[s],l=t[s];if(!a||!l)return;i.ttl=a,i.start=l,i.now=r||o();let c=i.now-l;i.remainingTTL=a-c}};let r=0,o=()=>{let i=Wo.now();if(this.ttlResolution>0){r=i;let s=setTimeout(()=>r=0,this.ttlResolution);s.unref&&s.unref()}return i};this.getRemainingTTL=i=>{let s=this.#a.get(i);if(s===void 0)return 0;let a=e[s],l=t[s];if(!a||!l)return 1/0;let c=(r||o())-l;return a-c},this.#y=i=>{let s=t[i],a=e[i];return!!a&&!!s&&(r||o())-s>a}}#R=()=>{};#n=()=>{};#M=()=>{};#y=()=>!1;#L(){let e=new Vo(this.#e);this.#p=0,this.#E=e,this.#k=t=>{this.#p-=e[t],e[t]=0},this.#_=(t,r,o,i)=>{if(this.#d(r))return 0;if(!ur(o))if(i){if(typeof i!="function")throw new TypeError("sizeCalculation must be a function");if(o=i(r,t),!ur(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.#N=(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)}}#k=e=>{};#N=(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.#a.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.#a.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 s=this.#b[t],a=this.#C[t];if(s&&a){let l=s-(Wo.now()-a);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 s={value:i};if(this.#b&&this.#C){s.ttl=this.#b[t];let a=Wo.now()-this.#C[t];s.start=Math.floor(Date.now()-a)}this.#E&&(s.size=this.#E[t]),e.unshift([r,s])}return e}load(e){this.clear();for(let[t,r]of e){if(r.start){let o=Date.now()-r.start;r.start=Wo.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:s=this.noDisposeOnSet,sizeCalculation:a=this.sizeCalculation,status:l}=r,{noUpdateTTL:c=this.noUpdateTTL}=r,d=this.#_(e,t,r.size||0,a);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.#a.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.#a.set(e,p),this.#f[this.#u]=p,this.#S[p]=this.#u,this.#u=p,this.#c++,this.#N(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&&!s&&(this.#v&&this.#i?.(m,e,"set"),this.#h&&this.#g?.push([m,e,"set"]))}else s||(this.#v&&this.#i?.(u,e,"set"),this.#h&&this.#g?.push([u,e,"set"]));if(this.#k(p),this.#N(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)),!s&&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.#k(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.#a.delete(r),this.#c--,t}has(e,t={}){let{updateAgeOnHas:r=this.updateAgeOnHas,status:o}=t,i=this.#a.get(e);if(i!==void 0){let s=this.#o[i];if(this.#d(s)&&s.__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.#a.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 s=new Va,{signal:a}=r;a?.addEventListener("abort",()=>s.abort(a.reason),{signal:s.signal});let l={signal:s.signal,options:r,context:o},c=(g,f=!1)=>{let{aborted:S}=s.signal,v=r.ignoreFetchAbort&&g!==void 0;if(r.status&&(S&&!f?(r.status.fetchAborted=!0,r.status.fetchError=s.signal.reason,v&&(r.status.fetchAbortIgnored=!0)):r.status.fetchResolved=!0),S&&!v&&!f)return p(s.signal.reason);let x=m;return this.#o[t]===m&&(g===void 0?x.__staleWhileFetching?this.#o[t]=x.__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}=s.signal,S=f&&r.allowStaleOnFetchAbort,v=S||r.allowStaleOnFetchRejection,x=v||r.noDeleteOnFetchRejection,b=m;if(this.#o[t]===m&&(!x||b.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=b.__staleWhileFetching)),v)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.#s?.(e,i,l);S&&S instanceof Promise&&S.then(v=>g(v===void 0?void 0:v),f),s.signal.addEventListener("abort",()=>{(!r.ignoreFetchAbort||r.allowStaleOnFetchAbort)&&(g(void 0),r.allowStaleOnFetchAbort&&(g=v=>c(v,!0)))})};r.status&&(r.status.fetchDispatched=!0);let m=new Promise(u).then(c,d),h=Object.assign(m,{__abortController:s,__staleWhileFetching:i,__returned:void 0});return t===void 0?(this.set(e,h,{...l.options,status:void 0}),t=this.#a.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 Va}async fetch(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,ttl:s=this.ttl,noDisposeOnSet:a=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:v}=t;if(!this.#x)return S&&(S.fetch="get"),this.get(e,{allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let x={allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:s,noDisposeOnSet:a,size:l,sizeCalculation:c,noUpdateTTL:d,noDeleteOnFetchRejection:p,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:S,signal:v},b=this.#a.get(e);if(b===void 0){S&&(S.fetch="miss");let T=this.#U(e,b,x,g);return T.__returned=T}else{let T=this.#o[b];if(this.#d(T)){let H=r&&T.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",H&&(S.returnedStale=!0)),H?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,x,g),O=A.__staleWhileFetching!==void 0&&r;return S&&(S.fetch=C?"stale":"refresh",O&&C&&(S.returnedStale=!0)),O?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,...s}=t,a=this.get(e,s);if(!i&&a!==void 0)return a;let l=r(e,a,{options:s,context:o});return this.set(e,l,s),l}get(e,t={}){let{allowStale:r=this.allowStale,updateAgeOnGet:o=this.updateAgeOnGet,noDeleteOnStaleGet:i=this.noDeleteOnStaleGet,status:s}=t,a=this.#a.get(e);if(a!==void 0){let l=this.#o[a],c=this.#d(l);return s&&this.#n(s,a),this.#y(a)?(s&&(s.get="stale"),c?(s&&r&&l.__staleWhileFetching!==void 0&&(s.returnedStale=!0),r?l.__staleWhileFetching:void 0):(i||this.#O(e,"expire"),s&&r&&(s.returnedStale=!0),r?l:void 0)):(s&&(s.get="hit"),c?l.__staleWhileFetching:(this.#z(a),o&&this.#R(a),l))}else s&&(s.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.#a.get(e);if(o!==void 0)if(r=!0,this.#c===1)this.#H(t);else{this.#k(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.#a.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 s=this.#S[o];this.#f[s]=this.#f[o];let a=this.#f[o];this.#S[a]=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.#a.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 _I,win32 as Bd}from"node:path";import{fileURLToPath as DI}from"node:url";import{lstatSync as FI,readdir as UI,readdirSync as BI,readlinkSync as zI,realpathSync as HI}from"fs";import*as jI from"node:fs";import{lstat as GI,readdir as WI,readlink as VI,realpath as qI}from"node:fs/promises";import{EventEmitter as Dd}from"node:events";import OS from"node:stream";import{StringDecoder as CI}from"node:string_decoder";var AS=typeof process=="object"&&process?process:{stdout:null,stderr:null},RI=n=>!!n&&typeof n=="object"&&(n instanceof hr||n instanceof OS||AI(n)||II(n)),AI=n=>!!n&&typeof n=="object"&&n instanceof Dd&&typeof n.pipe=="function"&&n.pipe!==OS.Writable.prototype.pipe,II=n=>!!n&&typeof n=="object"&&n instanceof Dd&&typeof n.write=="function"&&typeof n.end=="function",Vn=Symbol("EOF"),qn=Symbol("maybeEmitEnd"),mr=Symbol("emittedEnd"),qa=Symbol("emittingEnd"),gs=Symbol("emittedError"),Ka=Symbol("closed"),IS=Symbol("read"),Ya=Symbol("flush"),PS=Symbol("flushChunk"),gn=Symbol("encoding"),qo=Symbol("decoder"),et=Symbol("flowing"),fs=Symbol("paused"),Ko=Symbol("resume"),tt=Symbol("buffer"),xt=Symbol("pipes"),nt=Symbol("bufferLength"),Ld=Symbol("bufferPush"),Ja=Symbol("bufferShift"),mt=Symbol("objectMode"),je=Symbol("destroyed"),Od=Symbol("error"),Md=Symbol("emitData"),LS=Symbol("emitEnd"),kd=Symbol("emitEnd2"),In=Symbol("async"),Nd=Symbol("abort"),Xa=Symbol("aborted"),Ss=Symbol("signal"),Qr=Symbol("dataListeners"),jt=Symbol("discarded"),ys=n=>Promise.resolve().then(n),PI=n=>n(),LI=n=>n==="end"||n==="finish"||n==="prefinish",OI=n=>n instanceof ArrayBuffer||!!n&&typeof n=="object"&&n.constructor&&n.constructor.name==="ArrayBuffer"&&n.byteLength>=0,MI=n=>!Buffer.isBuffer(n)&&ArrayBuffer.isView(n),Za=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[Ko](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},_d=class extends Za{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)}},kI=n=>!!n.objectMode,NI=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",hr=class extends Dd{[et]=!1;[fs]=!1;[xt]=[];[tt]=[];[mt];[gn];[In];[qo];[Vn]=!1;[mr]=!1;[qa]=!1;[Ka]=!1;[gs]=null;[nt]=0;[je]=!1;[Ss];[Xa]=!1;[Qr]=0;[jt]=!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");kI(t)?(this[mt]=!0,this[gn]=null):NI(t)?(this[gn]=t.encoding,this[mt]=!1):(this[mt]=!1,this[gn]=null),this[In]=!!t.async,this[qo]=this[gn]?new CI(this[gn]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[tt]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[xt]});let{signal:r}=t;r&&(this[Ss]=r,r.aborted?this[Nd]():r.addEventListener("abort",()=>this[Nd]()))}get bufferLength(){return this[nt]}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}[Nd](){this[Xa]=!0,this.emit("abort",this[Ss]?.reason),this.destroy(this[Ss]?.reason)}get aborted(){return this[Xa]}set aborted(e){}write(e,t,r){if(this[Xa])return!1;if(this[Vn])throw new Error("write after end");if(this[je])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]?ys:PI;if(!this[mt]&&!Buffer.isBuffer(e)){if(MI(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(OI(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[et]&&this[nt]!==0&&this[Ya](!0),this[et]?this.emit("data",e):this[Ld](e),this[nt]!==0&&this.emit("readable"),r&&o(r),this[et]):e.length?(typeof e=="string"&&!(t===this[gn]&&!this[qo]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[gn]&&(e=this[qo].write(e)),this[et]&&this[nt]!==0&&this[Ya](!0),this[et]?this.emit("data",e):this[Ld](e),this[nt]!==0&&this.emit("readable"),r&&o(r),this[et]):(this[nt]!==0&&this.emit("readable"),r&&o(r),this[et])}read(e){if(this[je])return null;if(this[jt]=!1,this[nt]===0||e===0||e&&e>this[nt])return this[qn](),null;this[mt]&&(e=null),this[tt].length>1&&!this[mt]&&(this[tt]=[this[gn]?this[tt].join(""):Buffer.concat(this[tt],this[nt])]);let t=this[IS](e||null,this[tt][0]);return this[qn](),t}[IS](e,t){if(this[mt])this[Ja]();else{let r=t;e===r.length||e===null?this[Ja]():typeof r=="string"?(this[tt][0]=r.slice(e),t=r.slice(0,e),this[nt]-=e):(this[tt][0]=r.subarray(e),t=r.subarray(0,e),this[nt]-=e)}return this.emit("data",t),!this[tt].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[et]||!this[fs])&&this[qn](),this}[Ko](){this[je]||(!this[Qr]&&!this[xt].length&&(this[jt]=!0),this[fs]=!1,this[et]=!0,this.emit("resume"),this[tt].length?this[Ya]():this[Vn]?this[qn]():this.emit("drain"))}resume(){return this[Ko]()}pause(){this[et]=!1,this[fs]=!0,this[jt]=!1}get destroyed(){return this[je]}get flowing(){return this[et]}get paused(){return this[fs]}[Ld](e){this[mt]?this[nt]+=1:this[nt]+=e.length,this[tt].push(e)}[Ja](){return this[mt]?this[nt]-=1:this[nt]-=this[tt][0].length,this[tt].shift()}[Ya](e=!1){do;while(this[PS](this[Ja]())&&this[tt].length);!e&&!this[tt].length&&!this[Vn]&&this.emit("drain")}[PS](e){return this.emit("data",e),this[et]}pipe(e,t){if(this[je])return e;this[jt]=!1;let r=this[mr];return t=t||{},e===AS.stdout||e===AS.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[xt].push(t.proxyErrors?new _d(this,e,t):new Za(this,e,t)),this[In]?ys(()=>this[Ko]()):this[Ko]()),e}unpipe(e){let t=this[xt].find(r=>r.dest===e);t&&(this[xt].length===1?(this[et]&&this[Qr]===0&&(this[et]=!1),this[xt]=[]):this[xt].splice(this[xt].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[jt]=!1,this[Qr]++,!this[xt].length&&!this[et]&&this[Ko]();else if(e==="readable"&&this[nt]!==0)super.emit("readable");else if(LI(e)&&this[mr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[gs]){let o=t;this[In]?ys(()=>o.call(this,this[gs])):o.call(this,this[gs])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Qr]=this.listeners("data").length,this[Qr]===0&&!this[jt]&&!this[xt].length&&(this[et]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Qr]=0,!this[jt]&&!this[xt].length&&(this[et]=!1)),t}get emittedEnd(){return this[mr]}[qn](){!this[qa]&&!this[mr]&&!this[je]&&this[tt].length===0&&this[Vn]&&(this[qa]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Ka]&&this.emit("close"),this[qa]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==je&&this[je])return!1;if(e==="data")return!this[mt]&&!r?!1:this[In]?(ys(()=>this[Md](r)),!0):this[Md](r);if(e==="end")return this[LS]();if(e==="close"){if(this[Ka]=!0,!this[mr]&&!this[je])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[gs]=r,super.emit(Od,r);let i=!this[Ss]||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}[Md](e){for(let r of this[xt])r.dest.write(e)===!1&&this.pause();let t=this[jt]?!1:super.emit("data",e);return this[qn](),t}[LS](){return this[mr]?!1:(this[mr]=!0,this.readable=!1,this[In]?(ys(()=>this[kd]()),!0):this[kd]())}[kd](){if(this[qo]){let t=this[qo].end();if(t){for(let r of this[xt])r.dest.write(t);this[jt]||super.emit("data",t)}}for(let t of this[xt])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(je,()=>t(new Error("stream destroyed"))),this.on("error",r=>t(r)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[jt]=!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,s,a=p=>{this.off("data",l),this.off("end",c),this.off(je,d),t(),s(p)},l=p=>{this.off("error",a),this.off("end",c),this.off(je,d),this.pause(),i({value:p,done:!!this[Vn]})},c=()=>{this.off("error",a),this.off("data",l),this.off(je,d),t(),i({done:!0,value:void 0})},d=()=>a(new Error("stream destroyed"));return new Promise((p,u)=>{s=u,i=p,this.once(je,d),this.once("error",a),this.once("end",c),this.once("data",l)})},throw:t,return:t,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[jt]=!1;let e=!1,t=()=>(this.pause(),this.off(Od,t),this.off(je,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(Od,t),this.once(je,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[je])return e?this.emit("error",e):this.emit(je),this;this[je]=!0,this[jt]=!0,this[tt].length=0,this[nt]=0;let t=this;return typeof t.close=="function"&&!this[Ka]&&t.close(),e?this.emit("error",e):this.emit(je),this}static get isStream(){return RI}};var $I=HI.native,ws={lstatSync:FI,readdir:UI,readdirSync:BI,readlinkSync:zI,realpathSync:$I,promises:{lstat:GI,readdir:WI,readlink:VI,realpath:qI}},DS=n=>!n||n===ws||n===jI?ws:{...ws,...n,promises:{...ws.promises,...n.promises||{}}},FS=/^\\\\\?\\([a-z]:)\\?$/i,KI=n=>n.replace(/\//g,"\\").replace(FS,"$1\\"),YI=/[\\\/]/,on=0,US=1,BS=2,Pn=4,zS=6,HS=8,eo=10,jS=12,rn=15,bs=~rn,Fd=16,MS=32,vs=64,fn=128,Qa=256,tl=512,kS=vs|fn|tl,JI=1023,Ud=n=>n.isFile()?HS:n.isDirectory()?Pn:n.isSymbolicLink()?eo:n.isCharacterDevice()?BS:n.isBlockDevice()?zS:n.isSocket()?jS:n.isFIFO()?US:on,NS=new Map,xs=n=>{let e=NS.get(n);if(e)return e;let t=n.normalize("NFKD");return NS.set(n,t),t},_S=new Map,el=n=>{let e=_S.get(n);if(e)return e;let t=xs(n.toLowerCase());return _S.set(n,t),t},nl=class extends hs{constructor(){super({max:256})}},zd=class extends hs{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},$S=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}#s;get uid(){return this.#s}#w;get gid(){return this.#w}#c;get rdev(){return this.#c}#p;get blksize(){return this.#p}#a;get ino(){return this.#a}#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=on,r,o,i,s,a){this.name=e,this.#b=i?el(e):xs(e),this.#n=t&JI,this.nocase=i,this.roots=o,this.root=r||this,this.#M=s,this.#x=a.fullpath,this.#P=a.relative,this.#R=a.relativePosix,this.parent=a.parent,this.parent?this.#e=this.parent.#e:this.#e=DS(a.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).#k(o):this.#k(o)}#k(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&=~Fd,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?el(e):xs(e);for(let l of r)if(l.#b===o)return l;let i=this.parent?this.sep:"",s=this.#x?this.#x+i+e:void 0,a=this.newChild(e,on,{...t,parent:this,fullpath:s});return this.canReaddir()||(a.#n|=fn),r.push(a),a}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&rn)===on}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&rn)===HS}isDirectory(){return(this.#n&rn)===Pn}isCharacterDevice(){return(this.#n&rn)===BS}isBlockDevice(){return(this.#n&rn)===zS}isFIFO(){return(this.#n&rn)===US}isSocket(){return(this.#n&rn)===jS}isSymbolicLink(){return(this.#n&eo)===eo}lstatCached(){return this.#n&MS?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&rn;return!(e!==on&&e!==eo||this.#n&Qa||this.#n&fn)}calledReaddir(){return!!(this.#n&Fd)}isENOENT(){return!!(this.#n&fn)}isNamed(e){return this.nocase?this.#b===el(e):this.#b===xs(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}}#N(e){this.#n|=Fd;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#_()}}#_(){this.#n&fn||(this.#n=(this.#n|fn)&bs,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#_()}#I(){this.#n|=tl,this.#D()}#D(){if(this.#n&vs)return;let e=this.#n;(e&rn)===Pn&&(e&=bs),this.#n=e|vs,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|=Qa,e==="ENOENT"&&(t|=fn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=bs),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=Ud(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&rn;return i!==Pn&&i!==eo&&i!==on&&(o.#n|=vs),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?el(e.name):xs(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&bs|Ud(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:s,blocks:a,ctime:l,ctimeMs:c,dev:d,gid:p,ino:u,mode:m,mtime:h,mtimeMs:g,nlink:f,rdev:S,size:v,uid:x}=e;this.#T=t,this.#f=r,this.#C=o,this.#u=i,this.#p=s,this.#o=a,this.#E=l,this.#m=c,this.#t=d,this.#w=p,this.#a=u,this.#i=m,this.#g=h,this.#S=g,this.#r=f,this.#c=S,this.#l=v,this.#s=x;let b=Ud(e);this.#n=this.#n&bs|b|MS,b!==on&&b!==Pn&&b!==eo&&(this.#n|=vs)}#$=[];#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,s)=>{if(i)this.#F(i.code),r.provisional=0;else{for(let a of s)this.#B(a,r);this.#N(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.#N(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.#N(e)}catch(r){this.#F(r.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&kS)return!1;let e=rn&this.#n;return e===on||e===Pn||e===eo}shouldWalk(e,t){return(this.#n&Pn)===Pn&&!(this.#n&kS)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((tl|Qa|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(!((tl|Qa|fn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[$S](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}},rl=class n extends ht{sep="\\";splitSep=YI;constructor(e,t=on,r,o,i,s,a){super(e,t,r,o,i,s,a)}newChild(e,t=on,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}getRootString(e){return Bd.parse(e).root}getRoot(e){if(e=KI(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 Yo(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(FS,"$1\\"),e===t}},ol=class n extends ht{splitSep="/";sep="/";constructor(e,t=on,r,o,i,s,a){super(e,t,r,o,i,s,a)}getRootString(e){return e.startsWith("/")?"/":""}getRoot(e){return this.root}newChild(e,t=on,r={}){return new n(e,t,this.root,this.roots,this.nocase,this.childrenCache(),r)}},il=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:s=ws}={}){this.#r=DS(s),(e instanceof URL||e.startsWith("file://"))&&(e=DI(e));let a=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(a),this.#e=new nl,this.#t=new nl,this.#i=new zd(i);let l=a.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 s=e[i];if(!(!s||s===".")&&(t=t?`${s}/${t}`:s,this.isAbsolute(s)))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 s=e[i];if(!(!s||s===".")&&(t=t?`${s}/${t}`:s,this.isAbsolute(s)))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:s}=t,a=[];(!i||i(e))&&a.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))&&a.push(r?S:S.fullpath()),o&&S.isSymbolicLink()?S.realpath().then(v=>v?.isUnknown()?v.lstat():v).then(v=>v?.shouldWalk(l,s)?c(v,f):f()):S.shouldWalk(l,s)?c(S,f):f()},!0)},d=e;return new Promise((p,u)=>{c(d,m=>{if(m)return u(m);p(a)})})}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:s}=t,a=[];(!i||i(e))&&a.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))&&a.push(r?p:p.fullpath());let u=p;if(p.isSymbolicLink()){if(!(o&&(u=p.realpathSync())))continue;u.isUnknown()&&u.lstatSync()}u.shouldWalk(l,s)&&l.add(u)}}return a}[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:s}=t;(!i||i(e))&&(yield r?e:e.fullpath());let a=new Set([e]);for(let l of a){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(a,s)&&a.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:s}=t,a=new hr({objectMode:!0});(!i||i(e))&&a.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&&a.end();return}d++,l.add(m);let h=(f,S,v=!1)=>{if(f)return a.emit("error",f);if(o&&!v){let x=[];for(let b of S)b.isSymbolicLink()&&x.push(b.realpath().then(T=>T?.isUnknown()?T.lstat():T));if(x.length){Promise.all(x).then(()=>h(null,S,!0));return}}for(let x of S)x&&(!i||i(x))&&(a.write(r?x:x.fullpath())||(u=!0));d--;for(let x of S){let b=x.realpathCached()||x;b.shouldWalk(l,s)&&c.push(b)}u&&!a.flowing?a.once("drain",p):g||p()},g=!0;m.readdirCB(h,!0),g=!1}};return p(),a}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:s}=t,a=new hr({objectMode:!0}),l=new Set;(!i||i(e))&&a.write(r?e:e.fullpath());let c=[e],d=0,p=()=>{let u=!1;for(;!u;){let m=c.shift();if(!m){d===0&&a.end();return}d++,l.add(m);let h=m.readdirSync();for(let g of h)(!i||i(g))&&(a.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,s)&&c.push(f)}}u&&!a.flowing&&a.once("drain",p)};return p(),a}chdir(e=this.cwd){let t=this.cwd;this.cwd=typeof e=="string"?this.cwd.resolve(e):e,this.cwd[$S](t)}},Yo=class extends il{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,Bd,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return Bd.parse(e).root.toUpperCase()}newRoot(e){return new rl(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)}},Jo=class extends il{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,_I,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new ol(this.rootPath,Pn,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},Ts=class extends Jo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},M3=process.platform==="win32"?rl:ol,GS=process.platform==="win32"?Yo:process.platform==="darwin"?Ts:Jo;var XI=n=>n.length>=1,ZI=n=>n.length>=1,Xo=class n{#e;#t;#i;length;#r;#s;#w;#c;#p;#a;#l=!0;constructor(e,t,r,o){if(!XI(e))throw new TypeError("empty pattern list");if(!ZI(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,s,a,l,...c]=this.#e,[d,p,u,m,...h]=this.#t;c[0]===""&&(c.shift(),h.shift());let g=[i,s,a,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,...s]=this.#e,[a,...l]=this.#t;s[0]===""&&(s.shift(),l.shift());let c=i+"/",d=a+"/";this.#e=[c,...s],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.#s!==void 0?this.#s:this.hasMore()?(this.#s=new n(this.#e,this.#t,this.#i+1,this.#r),this.#s.#a=this.#a,this.#s.#p=this.#p,this.#s.#c=this.#c,this.#s):this.#s=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.#a!==void 0?this.#a:this.#a=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 QI=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Zo=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:r,noext:o,noglobstar:i,platform:s=QI}){this.relative=[],this.absolute=[],this.relativeChildren=[],this.absoluteChildren=[],this.platform=s,this.mmopts={dot:!0,nobrace:t,nocase:r,noext:o,noglobstar:i,optimizationLevel:2,platform:s,nocomment:!0,nonegate:!0};for(let a of e)this.add(a)}add(e){let t=new Ht(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 s=new Xo(o,i,0,this.platform),a=new Ht(s.globString(),this.mmopts),l=i[i.length-1]==="**",c=s.isAbsolute();c?this.absolute.push(a):this.relative.push(a),l&&(c?this.absoluteChildren.push(a):this.relativeChildren.push(a))}}ignored(e){let t=e.fullpath(),r=`${t}/`,o=e.relative()||".",i=`${o}/`;for(let s of this.relative)if(s.match(o)||s.match(i))return!0;for(let s of this.absolute)if(s.match(t)||s.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 Hd=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()]))}},jd=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)])}},$d=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())}},Es=class n{hasWalkedCache;matches=new jd;subwalks=new $d;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Hd}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 s=i.root(),a=i.isAbsolute()&&this.opts.absolute!==!1;if(s){o=o.resolve(s==="/"&&this.opts.root!==void 0?this.opts.root:s);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),a,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,a,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,a,!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 s of r){let a=s.isAbsolute(),l=s.pattern(),c=s.rest();l===at?o.testGlobstar(i,s,c,a):l instanceof RegExp?o.testRegExp(i,l,c,a):o.testString(i,l,c,a)}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 s=e.parent||e;this.subwalks.add(s,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 eP=(n,e)=>typeof n=="string"?new Zo([n],e):Array.isArray(n)?new Zo(n,e):n,sl=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=eP(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)}#s(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 s=await i.realpath();s&&(s.isUnknown()||this.opts.stat)&&await s.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 s=i.realpathSync();s&&(s?.isUnknown()||this.opts.stat)&&s.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(),s=this.opts.dotRelative&&!i.startsWith(".."+this.#i)?"."+this.#i:"";this.matchEmit(i?s+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 Es(this.opts),r)}walkCB2(e,t,r,o){if(this.#s(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,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||(i++,this.match(a,l,c).then(()=>s()));for(let a of r.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let l=a.readdirCached();a.calledReaddir()?this.walkCB3(a,l,r,s):a.readdirCB((c,d)=>this.walkCB3(a,d,r,s),!0)}s()}walkCB3(e,t,r,o){r=r.filterEntries(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||(i++,this.match(a,l,c).then(()=>s()));for(let[a,l]of r.subwalks.entries())i++,this.walkCB2(a,l,r.child(),s);s()}walkCBSync(e,t,r){this.signal?.aborted&&r(),this.walkCB2Sync(e,t,new Es(this.opts),r)}walkCB2Sync(e,t,r,o){if(this.#s(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,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||this.matchSync(a,l,c);for(let a of r.subwalkTargets()){if(this.maxDepth!==1/0&&a.depth()>=this.maxDepth)continue;i++;let l=a.readdirSync();this.walkCB3Sync(a,l,r,s)}s()}walkCB3Sync(e,t,r,o){r=r.filterEntries(e,t);let i=1,s=()=>{--i===0&&o()};for(let[a,l,c]of r.matches.entries())this.#r(a)||this.matchSync(a,l,c);for(let[a,l]of r.subwalks.entries())i++,this.walkCB2Sync(a,l,r.child(),s);s()}},Cs=class extends sl{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}},Rs=class extends sl{results;constructor(e,t,r){super(e,t,r),this.results=new hr({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 nP=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=tP(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||nP,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"?Yo:t.platform==="darwin"?Ts:t.platform?Jo:GS;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 Ht(l,o)),[s,a]=i.reduce((l,c)=>(l[0].push(...c.set),l[1].push(...c.globParts),l),[[],[]]);this.patterns=s.map((l,c)=>{let d=a[c];if(!d)throw new Error("invalid pattern object");return new Xo(l,d,0,this.platform)})}async walk(){return[...await new Cs(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 Cs(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 Rs(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 Rs(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 Gd=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Ht(t,e).hasMagic())return!0;return!1};function al(n,e={}){return new Sn(n,e).streamSync()}function qS(n,e={}){return new Sn(n,e).stream()}function Qo(n,e={}){return new Sn(n,e).walkSync()}async function WS(n,e={}){return new Sn(n,e).walk()}function ll(n,e={}){return new Sn(n,e).iterateSync()}function KS(n,e={}){return new Sn(n,e).iterate()}var rP=al,oP=Object.assign(qS,{sync:al}),iP=ll,sP=Object.assign(KS,{sync:ll}),aP=Object.assign(Qo,{stream:al,iterate:ll}),VS=Object.assign(WS,{glob:WS,globSync:Qo,sync:aP,globStream:qS,stream:oP,globStreamSync:al,streamSync:rP,globIterate:KS,iterate:sP,globIterateSync:ll,iterateSync:iP,Glob:Sn,hasMagic:Gd,escape:Go,unescape:hn});VS.glob=VS;import to,{dirname as ZS}from"path";import{cwd as Yd}from"process";import QS from"yaml";import{z as pe}from"zod";import YS from"fs";import As from"path";import lP from"yaml";import{z as Wd}from"zod";var JS=!1,Vd=[`**/*.${Nt.TEST}`,`**/*.${Nt.MODULE}`],qd=Wd.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),Kd=50,cP=Wd.object({fileType:Wd.nativeEnum(Ae)});function be(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??Vd,o=Array.from(n.config.exclude??[]).concat(ng),i=Qo(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:Kd,nodir:!0});for(let s of i)dP(n.rootDir,s,t,e);return JS=!0,t}function dP(n,e,t,r){let o=As.join(n,e),i;try{i=YS.readFileSync(o,"utf-8")}catch(p){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${p}`);return}let s;try{if(s=lP.parse(i),typeof s!="object"||s===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 a=cP.safeParse(s);if(a.error){r.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${a.error}`);return}let l=a.data.fileType,c;try{c=YS.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:As.sep,fullPathSegments:o.split(As.sep),relativePathSegments:e.split(As.sep),fileName:As.basename(o),lastModified:c.mtime,createdAt:c.birthtime};switch(l){case Ae.TEST:try{let p=tn.parse(s);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:Ae.TEST,name:p.name,id:p.id,description:p.description??void 0,labels:p.labels,...d};return}catch(p){n.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","");!HS&&ke(p.name)!==u&&n.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){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${p}`);return}default:n.warn(`Unsupported file type ${l}, skipping...`);return}}var Zo="momentic.config.yaml",jS="momentic.workspace.yaml",pP=ue.object({projects:ue.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),uP=ue.union([ue.string(),ue.object({fromFile:ue.string(),json:ue.boolean().optional()})]),mP=ue.object({name:$d,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(),uP).optional(),inheritFromShell:ue.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Mr.optional()}),hP=ue.object({postSave:ue.string().optional()}),gP=ue.object({name:$d,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(mP).optional(),gitMainBranch:ue.string().optional(),gitProtectedBranches:ue.string().array().optional(),ai:sd.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:Xh.optional(),hooks:hP.optional()});function WS(r,e){let t;try{t=lP(r,"utf-8")}catch(o){y.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=GS.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){y.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function Vd(r){let e=WS(r,"project configuration");if(e!==void 0)try{return gP.parse(e)}catch(t){y.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function fP(r){let e=WS(r,"workspace configuration");if(e!==void 0)try{return pP.parse(e)}catch(t){y.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function SP(){let r=[],e=Wd(),t=eo.parse(e).root,n=15,o=0;for(;o<n;){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.`),r;for(let a of cP(e))if(a.endsWith(Zo)){let s=eo.join(e,a),l=Vd(s);l&&r.push({configFilePath:s,config:l,rootDir:$S(s)})}if(r.length)return r;if(e=eo.dirname(e),e===t)break}return r}function nn(r={}){let{configFilePath:e,nameFilter:t}=r,n=qd(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
49
- ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return y.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}function yP(r){let e=fP(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${Zo}`)),n=Xo(t,{absolute:!1,cwd:Wd(),dotRelative:!1,maxDepth:Gd,nodir:!0}),o=[];for(let i of n){let a=eo.join(Wd(),i),s=Vd(a);s&&o.push({configFilePath:a,config:s,rootDir:$S(a)})}return o}function qd(r){if(r){r=eo.resolve(r);let t=Vd(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:eo.dirname(r)}]}if(sP(jS)){let t=yP(jS);if(t)return t}return SP()}function Qo(r,e){let t=GS.stringify(r);dP(e,t)}import ei from"fs";import Kd from"path";import{z as Yd}from"zod";var VS="golden/visual-diff",qS="reports",KS="test-results";var bP=Yd.object({width:Yd.number(),height:Yd.number()}),ti=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let n=Kd.join(e.rootDir,e.config.goldenFileDir??VS);this.defaultGoldenScreenshotDir=n,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,n){if(t.screenshot?.data?.startsWith("https://")){let a=await fetch(t.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=Kd.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ei.mkdirSync(Kd.dirname(o),{recursive:!0}),ei.writeFileSync(o,n.buffer),ei.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(ei.existsSync(o)){let a=ei.readFileSync(o),s=bP.parse(JSON.parse(ei.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 ni=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 wP from"simple-git";var ve=wP();function ll(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function xe(r,e){try{return(await e).trim()}catch(t){r.error({err:t},"Failed to run git command");return}}function vP(){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 xP(r){let[e,t,n,o]=await Promise.all([xe(r,ve.show(["--no-patch","--format=%ci"])),xe(r,ve.listRemote(["--get-url","origin"])),xe(r,ve.show(["-s","--pretty=%B"])),xe(r,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:n,gitCommitAuthorName:o,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:`${process.env.GITHUB_RUN_ID}:${process.env.GITHUB_RUN_ATTEMPT}`}}async function TP(r){let[e,t,n]=await Promise.all([xe(r,ve.listRemote(["--get-url","origin"])),xe(r,ve.show(["-s","--pretty=%B"])),xe(r,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:n,gitlabProjectPath:process.env.CI_SERVER_HOST,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function EP(r){let[e,t,n,o]=await Promise.all([xe(r,ve.show(["--no-patch","--format=%ci"])),xe(r,ve.listRemote(["--get-url","origin"])),xe(r,ve.show(["-s","--pretty=%B"])),xe(r,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:n,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 CP(r){let[e,t,n]=await Promise.all([xe(r,ve.show(["--no-patch","--format=%ci"])),xe(r,ve.show(["-s","--pretty=%B"])),xe(r,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:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function RP(r){let[e,t,n]=await Promise.all([xe(r,ve.show(["--no-patch","--format=%ci"])),xe(r,ve.show(["-s","--pretty=%B"])),xe(r,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:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function AP(r,e){let[t,n,o,i,a,s,l,c]=await Promise.all([xe(r,ve.revparse(["HEAD"])),xe(r,ve.revparse(["--short","HEAD"])),xe(r,ve.revparse(["--abbrev-ref","HEAD"])),xe(r,ve.listRemote(["--get-url","origin"])),xe(r,ve.show(["--no-patch","--format=%ci"])),xe(r,ve.show(["-s","--pretty=%B"])),xe(r,ve.show(["-s","--pretty=%an"])),e?xe(r,ve.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0)]),d=c?await xe(r,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:n,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 IP(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function PP(r,e){let t=vP();if(!t)return AP(r,e);switch(t){case"GithubActions":return xP(r);case"GitlabCI":return TP(r);case"CircleCI":return EP(r);case"Buildkite":return CP(r);case"AzureDevOps":return RP(r)}}async function LP(r,e,t){if(t.lastCommitOnMainSha&&t.lastCommitOnMainTimestamp)return{};if(t.gitlabProjectPath){if(!t.gitMainBranch||!t.gitCommitSha)return{};try{let n=await e.getMergeBaseCommitFromGitlab(t.gitlabProjectPath,t.gitMainBranch,t.gitCommitSha);return{lastCommitOnMainSha:n.sha,lastCommitOnMainTimestamp:n.committer.date}}catch(n){return r.warn({err:n},"Failed to get remote metadata from Gitlab"),{}}}if(t.githubRepository){if(!t.gitMainBranch||!t.gitCommitSha)return{};try{let[n,o]=t.githubRepository.split("/"),i=await e.getMergeBaseCommitFromGithub(n,o,t.gitMainBranch,t.gitCommitSha);return{lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(n){return r.warn({err:n},"Failed to get remote metadata from Github"),{}}}return{}}async function ri(r,e,t){let n=await IP(t),o=await PP(r,n.gitMainBranch),i={...n,...o},a=await LP(r,e,i);return{...n,...o,...a}}import zk from"http";import{z as Zd}from"zod";var j="v1",Aa="2.4.4";var hr=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var YS=r=>{let e=r.reason===void 0?new DOMException("This operation was aborted.","AbortError"):r.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function D(r,e){let{milliseconds:t,fallback:n,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a,s;if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);return new Promise((l,c)=>{if(e.signal){let{signal:p}=e;if(p.aborted)return c(YS(p));s=()=>c(YS(p)),p.addEventListener("abort",s)}let d=()=>{if(n)try{l(n())}catch(p){c(p)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let p=o instanceof Error?o:new hr(o??`Promise timed out after ${t}ms`);c(p)}};a=i.setTimeout(d,t),Promise.resolve(r).then(p=>l(p)).catch(p=>c(p))}).finally(()=>{i.clearTimeout(a),e.signal&&s&&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 n=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};var Jd=["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 JS(r){return new Array(r).fill(0).map(()=>Jd[Math.floor(Math.random()*Jd.length)]).join("-")}var OP=9e4,MP=15e3,yn=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function kP(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Xd=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Aa&&(e[Zh]=Aa),e}async sendRequest(e,t,n=3,o=OP){let i=n,a,s={path:e,baseUrl:this.baseUrl,method:t.method};for(;n>0;)try{return n--,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),n===0)throw a;let c=1500,d=i-n,p=Math.min(c*Math.pow(2,d-1),MP);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,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s);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 kP(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)}}},kt=class extends Xd{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var lt=class extends kt{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${j}/auth/check`,{method:"GET",noLog:!0},10,5e3),{orgId:t,userId:n}=yg.parse(e);return{orgId:t,userId:n}}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${j}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return hg.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${j}/tests/export`,{method:"POST",body:e},3,3e4);return cg.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${j}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${j}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return dg.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${j}/tests/queue`,{method:"POST",body:e},3,1e4);return lg.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${j}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return Sg.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${j}/environments`,{method:"GET"},3,5e3);return bg.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${j}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return Rg.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${j}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${j}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${j}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${j}/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(`/${j}/suites/queue`,{method:"POST",body:e},3,5e3);return wg.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${j}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return Zm.array().parse(n)}async updateCacheLastUsedDate(e,t,n,o){try{await this.sendRequest(`/${j}/cache/last-used-at`,{method:"PATCH",body:{uniqueKeys:t,testId:e},noLog:!0,extraHeaders:o},3,7500)}catch(i){n.error({err:i},"Failed to update cache last used date")}}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${j}/test-fragments/`,{method:"POST",body:e},3,1e4)}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async uploadSnapshotScreenshot(e,t,n){try{await this.sendRequest(`/${j}/snapshots/${t}/screenshot`,{method:"POST",body:n,noLog:!0},3,1e4)}catch(o){e.error({err:o},"Failed to upload screenshot")}}async generateConsoleLogsForRunAttemptUploadUrl(e,t,n){let o=await this.sendRequest(`/${j}/runs/${t}/attempts/${n}/console-logs`,{method:"POST",noLog:!0},3,5e3);return na.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,n){let o=await this.sendRequest(`/${j}/runs/${t}/attempts/${n}/network-logs`,{method:"POST",noLog:!0},3,1e4);return na.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let n=await this.sendRequest(`/${j}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return na.parse(n)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${j}/billing/events`,{method:"POST",body:t,noLog:!0},10,1e4)}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${j}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return vg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${j}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let n=await this.sendRequest(`/${j}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return xg.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${j}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return Tg.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${j}/results/uploads/${e}/process`,{method:"POST",noLog:!0,body:t},3,1e4);return Eg.parse(n)}async fetchIconKnowledgeBase(e,t){try{let n=await this.sendRequest(`/${j}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return Mg.parse(n)}catch(n){return t.error({err:n},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${j}/knowledge-base/icons`,{method:"POST",body:e,noLog:!0},3,5e3)}catch(n){t.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${j}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return dd.parse(a)}async getMergeBaseCommitFromGitlab(e,t,n){let o=new URLSearchParams;o.set("base",t),o.set("head",n);let i=await this.sendRequest(`/${j}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return dd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${j}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return Zd.record(Zd.string(),Zd.string()).parse(e)}};import{randomUUID as XS}from"crypto";var dl=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvent(e,t,n){try{return await this.apiClient.reportBillableEvents(e,[{event:t,timestamp:new Date().toISOString(),transactionId:n?.eventId??XS(),properties:Zc({},n)}])}catch(o){e.error({err:o},"Failed to report billable event")}}async reportCreditsUsed(e,t,n,o){if(n)try{return await this.apiClient.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:o?.eventId??XS(),properties:Zc({creditsUsed:n,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function oi(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var pl=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,n,o){try{let i=JSON.stringify(o),{uploadUrl:a}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,n),s=await oi(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,n,o){let i=JSON.stringify(o);try{let{uploadUrl:a}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,n),s=await oi(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,n){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await oi(o,"text/html",n);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,n){try{await this.client.uploadSnapshotScreenshot(e,t,{screenshot:n.toString("base64")})}catch(o){e.error({err:o},"Failed to upload screenshot")}}async storeA11yTreeSnapshot(e,t,n){return Promise.resolve()}async getConsoleLogsForRunAttempt(e,t,n){}async getNetworkLogsForRunAttempt(e,t,n){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}};var ii=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,n){return this.client.saveNewIcons(t,n)}};import{Faker as NP,en as _P}from"@faker-js/faker";var ai="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 NP({locale:_P}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${ai}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof yn?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${ai}/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(`/${ai}/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(`/${ai}/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(`/${ai}/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(`/${ai}/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 DP}from"zod";var si=class extends kt{agentConfig;constructor(e,t){super(t),this.agentConfig=e}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return mh.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${j}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Aa,...e},signal:t.abortSignal});return uh.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${j}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return DP.string().parse(t)}async getElementLocation(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${j}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return ag.parse(o)}async getAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${j}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return ld.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return ig.parse(o)}async getVisualAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return ld.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${j}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return og.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${j}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let n=await this.sendRequest(`/${j}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Rc.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${j}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return sg.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Cc.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${j}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Uc.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${j}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return ph.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${j}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return em.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${j}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return tm.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${j}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return _u.parse(n)}};var li=class extends kt{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${j}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Du.parse(n)}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:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await oi(n,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function ci({client:r,gitMetadata:e,alwaysSaveCache:t,noCache:n}){return n?new Ls:new Qd(r,e,t)}var Qd=class{constructor(e,{gitMainBranch:t,gitBranchName:n,gitProtectedBranches:o,gitCommitTimestamp:i,lastCommitOnMainSha:a,lastCommitOnMainTimestamp:s},l){this.client=e;this.cacheHeaders={},t&&(this.cacheHeaders[Qh]=t),n&&(this.cacheHeaders[eg]=n),i&&(this.cacheHeaders[tg]=i.toISOString()),a&&(this.cacheHeaders[ng]=a),s&&(this.cacheHeaders[rg]=s.toISOString()),l?this.writeCaches=!0:n?this.writeCaches=!o.includes(n):this.writeCaches=!0}cacheHeaders;writeCaches;async saveStepCacheEntries(e,t,n){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.error({err:o},"Failed to save step cache entries")}}async resolveStepCacheEntries(e){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:n}=Fo({steps:e.steps,stepCacheEntries:t,logger:e.logger});this.client.updateCacheLastUsedDate(e.testId,n,e.logger,this.cacheHeaders)}};import Hk from"path";import{Server as uk}from"socket.io";import{cloneDeep as FP}from"lodash-es";var UP={showOverlay:!1},ep=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:n,clientIp:o,sessionId:i,browserbaseSessionId:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:n,clientIp:o,browserbaseSessionId:a,browserBehavior:FP(UP)}),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)}},Z=new ep;function ZS(r,e,t){let n=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(),v=g.toEditorDisplayCopy();JSON.stringify(v)===JSON.stringify(i)&&S===l&&n>o||(r.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:a??[],context:v,isInPageLoad:h.isInPageLoad}),n=Date.now()),l=S,i=v}catch(f){if(!r.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=Z.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=Z.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 BP=r=>()=>{let{sessionId:e}=r.metadata;fr[e]?.abort?.abort()},QS={event:"cancelApiTest",createHandler:BP};import{CookieJar as oL}from"tough-cookie";import{randomUUID as qP}from"crypto";import{faker as zP}from"@faker-js/faker";import HP from"assert";import jP from"axios";import $P from"moment";import*as GP from"otpauth";import WP from"pg";async function ey(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=xs(n,e);t.push(...o)}),t}var VP=Object.getPrototypeOf(async function(){}).constructor;async function ty(r,e,t){let n=e.code;e.options.fragment&&(n=`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;n.includes("Octokit")&&(d=(await import("@octokit/rest")).Octokit);let p;n.includes("createAppAuth")&&(p=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new VP("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",n)(jP,$P,i.fakerInstance??zP,HP,WP,d,p,GP,ey,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:n},`[${r}] 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 ny({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=ar}){let s=qP(),l=await ty(s,{code:r,options:{fragment:e,timeoutMs:a},bindings:t.toObjectCopy(),tools:n,signal:i},o);return y.debug(`[${s}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as KP,randomUUID as YP}from"crypto";import JP from"fetch-retry";var XP=JP(global.fetch,{retries:3,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),ry=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,oy=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function iy({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=ar,retries:i=2,signal:a,logger:s}){if(!ry)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!oy)throw new Error("Missing lambda auth secret.");let p=KP("sha256",oy).update(r).digest("hex");for(;d<=i;){d++,a?.throwIfAborted();let m={id:YP(),orgId:r,momenticLambdaAuthHash:p,code:e,fragment:t,state:n.toObjectCopy(),timeoutMs:o};try{if(l=await D(XP(ry,{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=vh.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(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await iy(r);else if(r.localTools)e=await ny({...r,localTools:r.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=Pt.parse(s);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","");!JS&&ke(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 ei="momentic.config.yaml",XS="momentic.workspace.yaml",gP=pe.object({projects:pe.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),fP=pe.union([pe.string(),pe.object({fromFile:pe.string(),json:pe.boolean().optional()})]),SP=pe.object({name:qd,baseUrl:pe.string(),envFile:pe.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:pe.record(pe.string(),fP).optional(),inheritFromShell:pe.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:kr.optional()}),yP=pe.object({postSave:pe.string().optional()}),bP=pe.object({name:qd,include:pe.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:pe.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:pe.string().optional(),reporterDir:pe.string().optional(),outputDir:pe.string().optional(),retries:pe.number().optional().describe("number of retries per test"),parallel:pe.number().optional().describe("degree of parallelism"),environments:pe.array(SP).optional(),gitMainBranch:pe.string().optional(),gitProtectedBranches:pe.string().array().optional(),ai:pd.extend({aiPageFiltering:pe.boolean().optional().describe("rag v2 flag")}).optional(),browser:kr.extend({autoExpandIframes:pe.boolean().optional(),disableSecondaryCacheResolution:pe.boolean().optional(),showZeroOpacityElements:pe.boolean().optional(),globalLocatorRedirect:pe.boolean().optional(),visualActions:pe.boolean().optional()}).optional(),advanced:sg.optional(),hooks:yP.optional()});function ey(n,e){let t;try{t=uP(n,"utf-8")}catch(o){y.warn(`Could not read possible Momentic ${e} file at ${n}: ${o}`);return}let r;try{if(r=QS.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 Jd(n){let e=ey(n,"project configuration");if(e!==void 0)try{return bP.parse(e)}catch(t){y.warn(`Possible Momentic project configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function wP(n){let e=ey(n,"workspace configuration");if(e!==void 0)try{return gP.parse(e)}catch(t){y.warn(`Possible Momentic workspace configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function vP(){let n=[],e=Yd(),t=to.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=to.basename(e);if(Pa.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 s of mP(e))if(s.endsWith(ei)){let a=to.join(e,s),l=Jd(a);l&&n.push({configFilePath:a,config:l,rootDir:ZS(a)})}if(n.length)return n;if(e=to.dirname(e),e===t)break}return n}function $t(n={}){let{configFilePath:e,nameFilter:t}=n,r=Xd(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 xP(n){let e=wP(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${ei}`)),r=Qo(t,{absolute:!1,cwd:Yd(),dotRelative:!1,maxDepth:Kd,nodir:!0}),o=[];for(let i of r){let s=to.join(Yd(),i),a=Jd(s);a&&o.push({configFilePath:s,config:a,rootDir:ZS(s)})}return o}function Xd(n){if(n){n=to.resolve(n);let t=Jd(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:to.dirname(n)}]}if(pP(XS)){let t=xP(XS);if(t)return t}return vP()}function ti(n,e){let t=QS.stringify(n);hP(e,t)}import ni from"fs";import Zd from"path";import{z as Qd}from"zod";var ty="golden/visual-diff",ny="reports",ry="test-results";var TP=Qd.object({width:Qd.number(),height:Qd.number()}),ri=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=Zd.join(e.rootDir,e.config.goldenFileDir??ty);this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){if(t.screenshot?.data?.startsWith("https://")){let s=await fetch(t.screenshot.data);return{buffer:Buffer.from(await s.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=Zd.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ni.mkdirSync(Zd.dirname(o),{recursive:!0}),ni.writeFileSync(o,r.buffer),ni.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(ni.existsSync(o)){let s=ni.readFileSync(o),a=TP.parse(JSON.parse(ni.readFileSync(i,"utf-8")));return{buffer:s,width:a.width,height:a.height}}else throw new R("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var oi=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 EP from"simple-git";var xe=EP();function cl(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 Te(n,e){try{return(await e).trim()}catch(t){n.error({err:t},"Failed to run git command");return}}function CP(){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 RP(n){let[e,t,r,o]=await Promise.all([Te(n,xe.show(["--no-patch","--format=%ci"])),Te(n,xe.listRemote(["--get-url","origin"])),Te(n,xe.show(["-s","--pretty=%B"])),Te(n,xe.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 AP(n){let[e,t,r]=await Promise.all([Te(n,xe.listRemote(["--get-url","origin"])),Te(n,xe.show(["-s","--pretty=%B"])),Te(n,xe.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 IP(n){let[e,t,r,o]=await Promise.all([Te(n,xe.show(["--no-patch","--format=%ci"])),Te(n,xe.listRemote(["--get-url","origin"])),Te(n,xe.show(["-s","--pretty=%B"])),Te(n,xe.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),s=t?.includes("gitlab.com"),a=t?cl(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?a:void 0,gitlabProjectPath:s?a:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function PP(n){let[e,t,r]=await Promise.all([Te(n,xe.show(["--no-patch","--format=%ci"])),Te(n,xe.show(["-s","--pretty=%B"])),Te(n,xe.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),s=o?.includes("gitlab.com"),a=o?cl(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?a:void 0,gitlabProjectPath:s?a:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function LP(n){let[e,t,r]=await Promise.all([Te(n,xe.show(["--no-patch","--format=%ci"])),Te(n,xe.show(["-s","--pretty=%B"])),Te(n,xe.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),s=o?.includes("gitlab.com"),a=o?cl(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?a:void 0,gitlabProjectPath:s?a:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function OP(n,e){let[t,r,o,i,s,a,l,c]=await Promise.all([Te(n,xe.revparse(["HEAD"])),Te(n,xe.revparse(["--short","HEAD"])),Te(n,xe.revparse(["--abbrev-ref","HEAD"])),Te(n,xe.listRemote(["--get-url","origin"])),Te(n,xe.show(["--no-patch","--format=%ci"])),Te(n,xe.show(["-s","--pretty=%B"])),Te(n,xe.show(["-s","--pretty=%an"])),e?Te(n,xe.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0)]),d=c?await Te(n,xe.show(["--no-patch","--format=%ci",c])):void 0,p=i?.includes("github.com"),u=i?.includes("gitlab.com"),m=i?cl(i):void 0;return{gitCommitSha:t,gitCommitShaShort:r,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:s?new Date(s):void 0,gitCommitMessage:a,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 MP(n){let e=n.config.gitProtectedBranches??[];return n.config.gitMainBranch&&e.push(n.config.gitMainBranch),{gitMainBranch:n.config.gitMainBranch,gitProtectedBranches:e}}async function kP(n,e){let t=CP();if(!t)return OP(n,e);switch(t){case"GithubActions":return RP(n);case"GitlabCI":return AP(n);case"CircleCI":return IP(n);case"Buildkite":return PP(n);case"AzureDevOps":return LP(n)}}async function NP(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 ii(n,e,t){let r=await MP(t),o=await kP(n,r.gitMainBranch),i={...r,...o},s=await NP(n,e,i);return{...r,...o,...s}}import Gk from"http";import{z as np}from"zod";var j="v1",Is="2.5.0";var gr=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var oy=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")};function D(n,e){let{milliseconds:t,fallback:r,message:o,customTimers:i={setTimeout,clearTimeout}}=e,s,a;if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);return new Promise((l,c)=>{if(e.signal){let{signal:p}=e;if(p.aborted)return c(oy(p));a=()=>c(oy(p)),p.addEventListener("abort",a)}let d=()=>{if(r)try{l(r())}catch(p){c(p)}else{typeof n.cancel=="function"&&Promise.resolve().then(()=>n.cancel()).catch(()=>{});let p=o instanceof Error?o:new gr(o??`Promise timed out after ${t}ms`);c(p)}};s=i.setTimeout(d,t),Promise.resolve(n).then(p=>l(p)).catch(p=>c(p))}).finally(()=>{i.clearTimeout(s),e.signal&&a&&e.signal.removeEventListener("abort",a)})}var dl=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 s=this.userActions.get(o)?.filter(a=>r-a<=this.windowMs)??[];s.length>0?this.userActions.set(o,s):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 ep=["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 iy(n){return new Array(n).fill(0).map(()=>ep[Math.floor(Math.random()*ep.length)]).join("-")}var _P=9e4,DP=15e3,yn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function FP(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var tp=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Is&&(e[ag]=Is),e}async sendRequest(e,t,r=3,o=_P){let i=r,s,a={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(s=l,l instanceof yn&&l.status>=400&&l.status<500)throw l;if(l instanceof Error&&l.name==="AbortError"&&(s=new gr),r===0)throw s;let c=1500,d=i-r,p=Math.min(c*Math.pow(2,d-1),DP);await new Promise(u=>setTimeout(u,p))}throw this.logger.warn({...a,err:s},"Got fatal error response from Momentic server"),s}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,s=setTimeout(()=>i.abort(),r),a=()=>i.abort();t.signal&&t.signal.addEventListener("abort",a);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 FP(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(s),t.signal&&t.signal.removeEventListener("abort",a)}}},Dt=class extends tp{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var lt=class extends Dt{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${j}/auth/check`,{method:"GET",noLog:!0},10,5e3);return Ag.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${j}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return Tg.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${j}/tests/export`,{method:"POST",body:e},3,3e4);return yg.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${j}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${j}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return bg.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${j}/tests/queue`,{method:"POST",body:e},3,1e4);return Sg.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${j}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return Rg.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${j}/environments`,{method:"GET"},3,5e3);return Ig.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${j}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return _g.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${j}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${j}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${j}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${j}/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(`/${j}/suites/queue`,{method:"POST",body:e},3,5e3);return Pg.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${j}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return sh.array().parse(r)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${j}/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(`/${j}/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(`/${j}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return rs.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${j}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return rs.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${j}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return rs.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${j}/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(`/${j}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return Lg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${j}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${j}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return Og.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${j}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return Mg.parse(e)}async startProcessingResultsUpload(e,t){let r=await this.sendRequest(`/${j}/results/uploads/${e}/process`,{method:"POST",noLog:!0,body:t},3,1e4);return kg.parse(r)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${j}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return Hg.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${j}/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 s=await this.sendRequest(`/${j}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return hd.parse(s)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${j}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return hd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${j}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return np.record(np.string(),np.string()).parse(e)}};import{randomUUID as sy}from"crypto";var pl=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??sy(),properties:td({},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??sy(),properties:td({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function si(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var ul=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:s}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),a=await si(s,"application/json",i);if(!a.ok)throw new Error(`Failed to upload network logs: ${a.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:s}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),a=await si(s,"application/json",i);if(!a.ok)throw new Error(`Failed to upload network logs: ${a.statusText}`)}catch(s){e.error({err:s},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await si(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(t)}saveNewIcons(e,t,r){return this.client.saveNewIcons(t,r)}};import{Faker as UP,en as BP}from"@faker-js/faker";var li="v1",fr=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 UP({locale:BP}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${li}/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(`/${li}/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(`/${li}/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(`/${li}/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(`/${li}/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(`/${li}/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 zP}from"zod";var ci=class extends Dt{agentConfig;constructor(e,t){super(t),this.agentConfig=e}async rankChunksWithAi(e,t){let r={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return vh.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${j}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Is,...e},signal:t.abortSignal});return wh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${j}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return zP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${j}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return gg.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(`/${j}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return ud.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return hg.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return ud.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${j}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return mg.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${j}/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(`/${j}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Pc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${j}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return fg.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${j}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return Ic.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${j}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Hc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${j}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return bh.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${j}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return lm.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${j}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return cm.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${j}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return $u.parse(r)}};var di=class extends Dt{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${j}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Gu.parse(r)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var ml=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:r,id:o}=await this.client.generateTestResultsUploadUrl(),i=await si(r,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:s}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return s}};function pi({orgId:n,client:e,gitMetadata:t,alwaysSaveCache:r,noCache:o}){return o?new Oa:new rp(n,e,t,r)}var rp=class{constructor(e,t,{gitMainBranch:r,gitBranchName:o,gitProtectedBranches:i,gitCommitTimestamp:s,lastCommitOnMainSha:a,lastCommitOnMainTimestamp:l},c){this.orgId=e;this.client=t;this.cacheHeaders={},r&&(this.cacheHeaders[lg]=r),o&&(this.cacheHeaders[cg]=o),s&&(this.cacheHeaders[dg]=s.toISOString()),a&&(this.cacheHeaders[pg]=a),l&&(this.cacheHeaders[ug]=l.toISOString()),c?this.writeCaches=!0:o?this.writeCaches=!i.includes(o):this.writeCaches=!0}cacheHeaders;writeCaches;async saveStepCacheEntries({entries:e,testId:t,logger: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,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}Bo({steps:e.steps,stepCacheEntries:t,logger:e.logger});let{cachesToSave:r}=await _t({stepLists:{steps:e.steps},cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:r,testId:e.testId},this.cacheHeaders)}};import Wk from"path";import{Server as fk}from"socket.io";import{cloneDeep as HP}from"lodash-es";var jP={showOverlay:!1},op=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:s}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:s,browserBehavior:HP(jP)}),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(s){t.error({err:s},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(s){t.error({err:s},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}},Z=new op;function ay(n,e,t){let r=Date.now(),o=Date.now(),i,s,a,l,c=!1,d=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=a;a=void 0;let S=h.url(),v=g.toEditorDisplayCopy();JSON.stringify(v)===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:s??[],context:v,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=v}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=Z.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(s)||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=Z.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)&&(s=f,a=S,o=Date.now())}catch(f){t.warn({err:f},"Failed to fetch extended details")}finally{c=!1}},2500);return{timers:[p,m]}}var Sr={};var $P=n=>()=>{let{sessionId:e}=n.metadata;Sr[e]?.abort?.abort()},ly={event:"cancelApiTest",createHandler:$P};import{CookieJar as lL}from"tough-cookie";import{randomUUID as XP}from"crypto";import{faker as GP}from"@faker-js/faker";import WP from"assert";import VP from"axios";import qP from"moment";import*as KP from"otpauth";import YP from"pg";async function cy(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=Ta(r,e);t.push(...o)}),t}var JP=Object.getPrototypeOf(async function(){}).constructor;async function dy(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,s={},a=(f,S)=>{o[f]=S,s[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)(VP,qP,i.fakerInstance??GP,WP,YP,d,p,KP,cy,o,a,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 gr?g=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:g=f instanceof Error?f.message:`${f}`}return{result:h,variableUpdates:s,persistentVariableUpdates:l,success:m,error:g}}async function py({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:s=ar}){let a=XP(),l=await dy(a,{code:n,options:{fragment:e,timeoutMs:s},bindings:t.toObjectCopy(),tools:r,signal:i},o);return y.debug(`[${a}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as ZP,randomUUID as QP}from"crypto";import eL from"fetch-retry";var tL=eL(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}}),uy=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,my=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function hy({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=ar,retries:i=2,signal:s,logger:a}){if(!uy)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!my)throw new Error("Missing lambda auth secret.");let p=ZP("sha256",my).update(n).digest("hex");for(;d<=i;){d++,s?.throwIfAborted();let m={id:QP(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await D(tL(uy,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:s}),!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 a.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 Kn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await hy(n);else if(n.localTools)e=await py({...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
- ${r.code}`;throw r.logger.error({err:e.error,code:r.code,env:r.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,n]of Object.entries(e.variableUpdates))r.context.setVariable(t,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await r.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,n]of Object.entries(e.persistentVariableUpdates))r.context.setVariable(t,n)}return e.result}import{set as ZP}from"lodash-es";async function Ht(r){let{orgId:e,s:t,context:n,logger:o,signal:i,flagStore:a,retries:s=2,timeoutMs:l=ar,allowUndefined:c=!1}=r,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:n,timeoutMs:l,logger:o,retries:s,localTools:r.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(r){return ay(r)}async function ay({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in r){if(e.includes(s))continue;let l=!1;if(t)if(t.includes(s))l=!0;else continue;let c=r[s],d=[...o,s];if(typeof c=="string"&&c.includes("{{")){let p=await Ht({s:c,context:n,...a});if(c===p)continue;i.push({path:d,original:c}),r[s]=p}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await ay({obj:c,bannedKeys:e,context:n,prefixPath:d,replacements:i,allowList:l?void 0:t,...a})}return i}function sy(r,e){for(let{path:t,original:n}of e)ZP(r,t,n)}import QP from"fetch-retry";var HX=process.env.MAILINATOR_API_KEY,jX=QP(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import tL from"fetch-cookie";import{cloneDeep as nL}from"lodash-es";var eL=3e4;async function ml({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??eL/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([m,h])=>m&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{a.append(m,h)});let s=a.toString(),l;if(Uo(r.url)&&(l=r.url),t&&Bo(r.url,t)&&(l=new URL(r.url,t).toString()),!l)throw new R("ActionFailureError",`Invalid URL: ${r.url}`);e.debug({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await D((async()=>{let m=s?`${l}?${s}`:l;try{return await n(m,{headers:i,method:r.method,body:r.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 ly(r){let{fixtures:e,inputs:t}=r,{context:n}=e,{orgId:o,step:i}=t,a=nL(i);await di({obj:a,orgId:o,bannedKeys:["code"],...e});let s=await rL(r);return a.envKey&&s.data&&n.setVariable(a.envKey,s.data),s}async function rL(r){let{fixtures:e,inputs:t}=r,{step:n,orgId:o,baseUrl:i}=t,{cookieJar:a}=e,s=new Date;switch(n.type){case"JAVASCRIPT":{let c=await Kn({code:n.code,orgId:o,fragment:!!n.fragment,timeoutMs:n.timeout?n.timeout*1e3:void 0,...e});try{JSON.stringify(c)}catch(d){return{...n,startedAt:s,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${d instanceof Error?d.message:`${d}`}`}}return{...n,startedAt:s,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=tL(fetch,a),d=await ml({command:n,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...n,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"})(n)}}async function cy(r){let{inputs:e,fixtures:t,callbacks:n}=r,{signal:o}=t,{steps:i,orgId:a,baseUrl:s}=e,{test:l,step:c}=n,d={startedAt:new Date,status:"RUNNING",results:[]},p=d.results,u=new oL,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await ly({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 dy(r){let{socket:e,storage:t}=r,n=r.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 tp({testId:o,orgId:i,logger:r.logger,storage:t,authorization:r.authorization}),c={type:"api-test",orgId:await r.storage.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:n,latestContext:new It({baseUrl:a||"",currentUrl:a||"",variablesFromEnvironment:l,envName:s})};return fr[n]=c,c}async function tp({testId:r,orgId:e,logger:t,storage:n,authorization:o}){let i=await n.fetchApiTestMetadata(r,e,t);if(!i)throw new Error(`Failed to fetch API test metadata for test ID: ${r}`);let a;o?.type==="API_KEY"&&(a=new gr({httpClient:new kt({...o,logger:t}),fakerSeed:void 0}));let s=i.envs?.find(p=>p.default),l;s&&(l=await n.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 iL=r=>async(e,t)=>{let{steps:n}=e,{authorization:o,metadata:i,socket:a,storage:s,logger:l,flagStoreFactory:c}=r,{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:v}=await tp({testId:p,orgId:d,logger:m,storage:s,authorization:o}),x={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(d)},C=await cy({inputs:{steps:n,orgId:d,baseUrl:v},fixtures:x,callbacks:{test:{onFinished:()=>{a.emit("apiTestFinished")}},step:{onStarted:A=>{a.emit("apiStepStarted",A)},onFinished:A=>{a.emit("apiStepFinished",A)}}}});t({result:C})},py={event:"executeApiTest",createHandler:iL};var aL=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async()=>{e.info({sessionId:t},"Cancel event received");let n=Z.getSession(t);if(!n)throw new Error("No active session found");try{n.controller.setClosed()}catch{}}},uy={event:"cancel",createHandler:aL};var sL=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async(n,o)=>{let i=Z.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})}}},my={event:"fetchA11yTree",createHandler:sL};var lL=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async(n,o)=>{let i=Z.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})}}},hy={event:"fetchDom",createHandler:lL};var cL=({metadata:r,logger:e})=>{let{sessionId:t,type:n}=r;return o=>{e.info({sessionId:t,reason:o},`Disconnect event received (${o})`),n==="e2e"?Z.removeSession(t,e):n==="api-test"&&delete fr[t]}},gy={event:"disconnect",createHandler:cL};function rn(r){let{result:e,nestedResults:t}=r;if(!r.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=dL(t);pL(e,n,o);let i=[...r.asyncTasks];r.asyncTasks.push((async()=>{try{await uL(i,e,n,o)}catch(a){r.logger.error({result:r.result,err:a},"Error hoisting scalar result metadata")}})())}function dL(r){let e=r[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 n=r[r.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function pL(r,e,t){e&&(r.beforeUrl=e.beforeUrl),t&&(r.afterUrl=t.afterUrl,r.data=t.data,t.status!=="SUCCESS"&&(r.message=t.message))}async function uL(r,e,t,n){await Promise.allSettled(r),t&&(e.beforeSnapshot=t.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import Ia from"os";import mL from"v8";var fy,Ln,hL=Ia.platform(),gL=Ia.cpus().map(r=>({model:r.model,speed:r.speed}));function Sy(r){let e=()=>{try{let t=!1,n=fL(),o=SL();n.freeMemory<1e6&&(t=!0);let i=mL.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(t=!0),t?r.warn({memory:n,cpu:o,heapStats:i},"Critical resource usage metrics detected"):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),{interval:setInterval(e,1e4),cpuMetadata:gL,platform:hL}}function fL(){let r=Ia.totalmem(),e=Ia.freemem(),t=r-e;return{totalMemory:r,freeMemory:e,usedMemory:t}}function SL(){let r=Ia.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of r)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!Ln)return Ln=t,null;let n={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 fy={measurementTime:e,intervalMs:e-Ln.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100},Ln=t,fy}import{hostname as xL}from"os";async function by(r){let{command:e,tracer:t,timeoutMs:n,targetingWrapper:o,disableCache:i,fixtures:a}=r,{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<n;){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=>yL(S.locator,r),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 ${n}ms.`);return u}async function yL(r,{command:e,fixtures:t}){let n=e.assertion;await t.browser.highlight(r);let o=!0,i,a;switch(n.type){case"ELEMENT_CONTENT":{let s=await r.textContent()??"";if(a={elementTextContent:ze(s,500,!0)},!yy(s,n.value,n.operation,!!n.negated)){let l=n.negated?lr[n.operation]:cr[n.operation];o=!1,i=new R("AssertionFailureError",`The content ${l} '${n.value}': ${s}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:ze(await r.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let s;try{s=await r.getAttribute(n.attr,{timeout:3e3})??""}catch(l){i=new R("AssertionFailureError",`The element does not have an attribute named ${n.attr}: ${l}`),o=!1;break}if(!yy(s,n.value,n.operation,!!n.negated)){let l=n.negated?lr[n.operation]:cr[n.operation];o=!1,n.operation==="EXISTS"?i=n.negated?new R("AssertionFailureError",`The attribute ${n.attr} ${l}: ${s}`):new R("AssertionFailureError",`The attribute ${n.attr} ${l}`):i=new R("AssertionFailureError",`The attribute ${n.attr} ${l} '${n.value}': ${s}`)}break}case"ELEMENT_EXISTENCE":{switch(n.condition){case"VISIBLE":{o=await r.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 r.isEditable({timeout:En*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await r.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"})(n.condition)}if(o=n.negated?!o:o,!o){let s=n.negated?hd[n.condition]:gd[n.condition];i=new R("AssertionFailureError",`The element ${s}`)}break}}return{success:o,data:a,err:i}}function yy(r,e,t,n){let o;switch(t){case"CONTAINS":{o=r.includes(e);break}case"EQUALS":{o=r.trim()===e.trim();break}case"STARTS_WITH":{o=r.trim().startsWith(e);break}case"EXISTS":{o=r.trim().length>0;break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return n?!o:o}import{Jimp as bL}from"jimp";async function Pa(r,e){let t=await r.screenshot(e),n=await bL.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as wy}from"jimp";import np from"jpeg-js";import wL from"pixelmatch";async function vy({ctx:r,tracer:e,command:t,disableCache:n,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:r,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:!!n,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 $=`${c.width}x${c.height}`,U=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${$}) 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 wy.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await wy.fromBuffer(d.buffer),h={width:d.width,height:d.height},g,f=u.width*u.height,S=h.width*h.height,v=Math.abs(u.height-h.height),x=Math.abs(u.width-h.width);if(f>S){let $=p.cover({w:h.width,h:h.height});c.buffer=await $.getBuffer("image/jpeg"),g="current",c.width=h.width,c.height=h.height}else if(S>f){let $=m.cover({w:u.width,h:u.height});d.buffer=await $.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=wL(np.decode(d.buffer).data,np.decode(c.buffer).data,b.data,c.width,c.height,{threshold:T,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,N=A>T*100,L=`Visual diff of ${A.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${T*100}%.`;if(g&&(L+=` The ${g} screenshot was cropped since it was taller by ${v} pixels and wider by ${x} pixels.`),N)throw new R("ActionFailureError",L);return{fail:N,thoughts:L,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:np.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var vL=5e3;async function hl({timeout:r=En,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal.throwIfAborted();let l=Date.now();i=await xy(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),vL);else return i}return i=await xy(e),i}async function xy({assertion:r,browser:e,flagStore:t}){switch(r.type){case"CONTENT":{let o,i=!1,a;try{let s;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(Ty,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.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(Ty,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let l=r.negated?lr.CONTAINS:cr.CONTAINS;a=new R("AssertionFailureError",`The page ${l} '${r.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"})(r.type)}}function Ty({value:r,negated:e,returnHtml:t}){let n=document.documentElement.outerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var rp=async r=>{let{step:e,resolvedInputs:t}=r.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=r.fixtures,l=s.browser,{orgId:c,runId:d}=r.inputs,p=s.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),n.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:n,localTools:a,signal:p,flagStore:s.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([x,b])=>`${x}:${b}`)]},n.debug({original:f,keyParams:g},"Module cache key params");let v=Date.now();for(;Date.now()-v<Jh;){p?.throwIfAborted();let x=await i.getCacheResult(g);if(x){n.debug({cacheResult:x},"Got result from module execution cache"),u=gl(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(x),m=!0;break}else n.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${xL()};runId:${d}`},p);if(b.acquired){h=b.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else n.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 TL(r);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}`);n.debug("Automatically loading auth state after cached module result"),await l.loadAuthState(f.data);let S=!1,v=e.advanced?.cacheInvalidation;if(v&&v.type==="PAGE_CHECK"){let x={type:"CONTENT",value:v.substring},b=await hl({timeout:En,assertion:x,browser:l,flagStore:s.flagStore,logger:n,signal:p});b.success?n.debug({invalResult:b},"Cached result still valid after page check, continuing..."):(n.info({invalResult:b},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),rp(r)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await EL({step:e,result:u,browser:s.browser,cacheKeyPrefix:h,logger:n,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},TL=async r=>{let{step:e,tracer:t}=r.moduleParams,n=gl(e,r.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:a}=await Sr(r.work,()=>r.executeStepList({...r,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return n.results=a,n.status=i,n.finishedAt=new Date,rn({asyncTasks:r.work.asyncTasks,nestedResults:a,result:n,logger:r.fixtures.logger}),n};function gl(r,e,t){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:r.id,moduleId:r.moduleId,moduleName:r.name,startedAt:new Date,cacheConfig:r.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:t}}async function Ey({orgId:r,step:e,context:t,logger:n,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){n.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}s[l]=await Kn({orgId:r,code:c,fragment:!0,context:t,logger:n,localTools:i,signal:a,flagStore:o})}return s}catch(l){throw a?.throwIfAborted(),new R("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function EL({step:r,result:e,browser:t,cacheKeyPrefix:n,logger:o,storage:i}){let a=r.cacheConfig?.cacheExpiryMs;(!a||a===Ag)&&(a=r.defaultCacheTtl??Ig);let s;r.autoAuth?s=JSON.stringify(await t.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:ef(s)},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function yr(r,e,t){let n=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof R?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,r.type==="RESOLVED_MODULE"){let l=gl(r,{},"FAILED");return l.message=s,l.startedAt=n,l.finishedAt=i,l}return{...zs(r),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Sr(r,e){let t=!1;try{return r&&!r.state.failureRecoveryDisabled&&(r.state.failureRecoveryDisabled=!0,t=!0),await e()}finally{r&&t&&(r.state.failureRecoveryDisabled=void 0)}}import{randomUUID as Cy}from"crypto";import{cloneDeep as RL}from"lodash-es";function fl(r,e){r.state.healingDetails?r.state.healingDetails.push(e):r.state.healingDetails=[e]}var Sl=async r=>{let{step:e,tracer:t}=r.presetParams,{logger:n,controller:o,context:i,billingReporter:a}=r.fixtures,{collectDebugData:s}=r.options,{testMetadata:l,suiteMetadata:c}=r.inputs,d=e.command.type,p=n.child({commandType:d,stepId:e.id,commandId:e.command.id}),u=Qi(e.command);r.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=Cy(),S=Cy();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}),r.work.asyncTasks.push(r.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 v,x,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}=AL({work:r.work,step:e,newTargets:C.newTargets,logger:p}),N=new Date,L=o.browser.url();x={beforeUrl:m,afterUrl:L,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},v={...e,message:C.thoughts??IL(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:L,finishedAt:N,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[x],details:T.details,proposedStep:A},"assertion"in e.command&&(v.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(),N=new Date,L=C instanceof Error?C.message:`${C}`;C instanceof R&&C.getLastScreenshotBuffer()&&(b=C.getLastScreenshotBuffer()),x={beforeUrl:m,afterUrl:A,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:L},v={...e,startedAt:h,finishedAt:N,beforeUrl:m,afterUrl:A,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:L,failureReason:C instanceof R?C.reason:void 0,results:[x],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}),r.work.asyncTasks.push(r.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 x.beforeSnapshot=f,v.beforeSnapshot=f,x.afterSnapshot=S,v.afterSnapshot=S,g&&(t.attachBeforeScreenshot({logger:p,snapshotId:f,screenshot:g}),r.work.asyncTasks.push(r.fixtures.debugDataStorage.storeScreenshot(p,f,g))),b&&(t.attachAfterScreenshot({logger:p,snapshotId:S,screenshot:b}),r.work.asyncTasks.push(r.fixtures.debugDataStorage.storeScreenshot(p,S,b))),v};function AL({work:r,step:e,newTargets:t,logger:n}){if(!t?.length)return{proposedStep:void 0};let o=e.command;qg(o,t,n);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={...RL(e),command:a};return fl(r,{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 IL(r){if(r?.length){if(r.length===1&&r[0]?.thoughts)return r[0].thoughts;if(r.length===2&&r.every(e=>e.thoughts))return`Located first element: ${r[0]?.thoughts}
53
- Located second element: ${r[1]?.thoughts}`}}async function Ry({codePath:r,screenshotBuff:e,storage:t,logger:n}){if(e)try{let o=await t.uploadScreenshot(e);return n.debug({screenshotUrl:o,codePath:r},"Saved screenshot for debugging"),o}catch(o){n.error({err:o,codePath:r},"Failed to save screenshot for debugging")}}async function On({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var PL=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Ay({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(PL.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,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!==r&&m!==p){o.info({beforePages:e,afterPages:d,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(u)});break}}}}var Iy="MOMENTIC_RUN_ID",Py="FINAL_SCREENSHOT_URL";import{cloneDeep as UL}from"lodash-es";async function Ly(r){let{step:e,tracer:t}=r.conditionalParams,{logger:n,controller:o}=r.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++){n.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let v=await Sl({...r,presetParams:{tracer:t,step:S.assertion}});c.push(v),n.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),l=!1,s=S.steps,d=v}catch(v){n.info({err:v},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(s)l&&n.info("No conditions resolved to true, executing the else block steps");else return n.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};n.info(`Executing ${s.length} steps in the selected conditional block`);let u=await r.conditionalParams.tracer.startSubSteps(),m=await r.executeStepList({...r,listParams:{steps:s,containerName:"conditional block",tracer:u}}),g={...a,assertion:d,...m,startedAt:i,finishedAt:new Date};return rn({asyncTasks:r.work.asyncTasks,nestedResults:[...c,...m.results],result:g,logger:n}),g}import{randomUUID as Oy}from"crypto";var My=async r=>{let{controller:e}=r.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),n=await LL(r);n.finishedAt=new Date,rn({asyncTasks:r.work.asyncTasks,result:n,nestedResults:n.results,logger:r.fixtures.logger});let o=await e.browser.screenshot({}),i=Oy();n.beforeSnapshot=i,r.work.asyncTasks.push(r.fixtures.debugDataStorage.storeScreenshot(r.fixtures.logger,i,t));let a=Oy();return n.afterSnapshot=a,r.work.asyncTasks.push(r.fixtures.debugDataStorage.storeScreenshot(r.fixtures.logger,a,o)),n},LL=async r=>{let{step:e,tracer:t}=r.aiStepParams,{controller:n,context:o,logger:i}=r.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new 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 r.executeStepList({...r,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=n.executeAbortController.signal.aborted;a.message=l instanceof Error?l.message:`${l}`,a.status=c?"CANCELLED":"FAILED"}return a};import{randomUUID as op}from"crypto";var ky=15,OL=7,Ny=async r=>{let{controller:e}=r.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),n=await ML(r);n.finishedAt=new Date,rn({asyncTasks:r.work.asyncTasks,result:n,nestedResults:n.results,logger:r.fixtures.logger});let o=await e.browser.screenshot({}),i=op();n.beforeSnapshot=i,r.work.asyncTasks.push(r.fixtures.debugDataStorage.storeScreenshot(r.fixtures.logger,i,t));let a=op();return n.afterSnapshot=a,r.work.asyncTasks.push(r.fixtures.debugDataStorage.storeScreenshot(r.fixtures.logger,a,o)),n},ML=async r=>{let{step:e,tracer:t}=r.aiStepParams,{testMetadata:n,orgId:o}=r.inputs,{controller:i,context:a,logger:s,codeEvalTools:l}=r.fixtures,{step:c}=r.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,v=0,x,b;for(;;){if(S>ky)return u.message=`Exceeded the maximum number of commands allowed per AI step (${ky})`,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:N}=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:`${N}
54
- ${A}`}),u;case"RIGHT_TRACK":{x=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(x=`${A}
55
- ${C.feedback}`,v++,v>=OL)return u.message=`Our AI agent requires additional information to achieve this goal:
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 nL}from"lodash-es";async function Gt(n){let{orgId:e,s:t,context:r,logger:o,signal:i,flagStore:s,retries:a=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:a,localTools:n.localTools,signal:i,flagStore:s})}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 ui(n){return gy(n)}async function gy({obj:n,bannedKeys:e,allowList:t,context:r,prefixPath:o=[],replacements:i=[],...s}){for(let a in n){if(e.includes(a))continue;let l=!1;if(t)if(t.includes(a))l=!0;else continue;let c=n[a],d=[...o,a];if(typeof c=="string"&&c.includes("{{")){let p=await Gt({s:c,context:r,...s});if(c===p)continue;i.push({path:d,original:c}),n[a]=p}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await gy({obj:c,bannedKeys:e,context:r,prefixPath:d,replacements:i,allowList:l?void 0:t,...s})}return i}function fy(n,e){for(let{path:t,original:r}of e)nL(n,t,r)}import rL from"fetch-retry";var VX=process.env.MAILINATOR_API_KEY,qX=rL(global.fetch,{retryOn:function(n,e,t){return n>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(n){return 500}});import iL from"fetch-cookie";import{cloneDeep as sL}from"lodash-es";var oL=3e4;async function hl({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??oL/1e3,i=Object.fromEntries(Object.entries(n.headers||{}).filter(([m,h])=>m&&h)),s=new URLSearchParams;Object.entries(n.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{s.append(m,h)});let a=s.toString(),l;if(zo(n.url)&&(l=n.url),t&&Ho(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);e.debug({url:l,searchParams:a,headers:i,body:n.body,method:n.method},"Making HTTP request");let d=await D((async()=>{let m=a?`${l}?${a}`: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 Sy(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,s=sL(i);await ui({obj:s,orgId:o,bannedKeys:["code"],...e});let a=await aL(n);return s.envKey&&a.data&&r.setVariable(s.envKey,a.data),a}async function aL(n){let{fixtures:e,inputs:t}=n,{step:r,orgId:o,baseUrl:i}=t,{cookieJar:s}=e,a=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:a,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${d instanceof Error?d.message:`${d}`}`}}return{...r,startedAt:a,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=iL(fetch,s),d=await hl({command:r,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...r,startedAt:a,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 yy(n){let{inputs:e,fixtures:t,callbacks:r}=n,{signal:o}=t,{steps:i,orgId:s,baseUrl:a}=e,{test:l,step:c}=r,d={startedAt:new Date,status:"RUNNING",results:[]},p=d.results,u=new lL,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await Sy({inputs:{step:h,baseUrl:a,orgId:s},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:Ca(u,new URL(a).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 by(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 n.getOrgId({type:"api-test",testId:o}),{baseUrl:s,envName:a,environmentVariables:l}=await ip({testId:o,orgId:i,logger:n.logger,storage:t,authorization:n.authorization}),c={type:"api-test",orgId:await n.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new Lt({baseUrl:s||"",currentUrl:s||"",variablesFromEnvironment:l,envName:a})};return Sr[r]=c,c}async function ip({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 s;o?.type==="API_KEY"&&(s=new fr({httpClient:new Dt({...o,logger:t}),fakerSeed:void 0}));let a=i.envs?.find(p=>p.default),l;a&&(l=await r.fetchEnvironment(e,a.name,t));let c=i.baseUrl||l?.variables?.[We];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:s}}var cL=n=>async(e,t)=>{let{steps:r}=e,{authorization:o,metadata:i,socket:s,storage:a,logger:l,flagStoreFactory:c}=n,{orgId:d,testId:p,sessionId:u}=i,m=l.child({testId:p,orgId:d,sessionId:u}),h=Sr[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:v}=await ip({testId:p,orgId:d,logger:m,storage:a,authorization:o}),x={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(d)},C=await yy({inputs:{steps:r,orgId:d,baseUrl:v},fixtures:x,callbacks:{test:{onFinished:()=>{s.emit("apiTestFinished")}},step:{onStarted:A=>{s.emit("apiStepStarted",A)},onFinished:A=>{s.emit("apiStepFinished",A)}}}});t({result:C})},wy={event:"executeApiTest",createHandler:cL};var dL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{e.info({sessionId:t},"Cancel event received");let r=Z.getSession(t);if(!r)throw new Error("No active session found");try{r.controller.setClosed()}catch{}}},vy={event:"cancel",createHandler:dL};var pL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=Z.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let s=i.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),o({a11yTree:l})}catch(a){e.error({err:a},"Error fetching a11y tree from the browser"),o({err:a.message})}}},xy={event:"fetchA11yTree",createHandler:pL};var uL=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async(r,o)=>{let i=Z.getSession(t);if(!i)throw new Error("No active session found");i.controller.setOpen();let s=i.controller.browser;try{let a=await s.html();o({html:a})}catch(a){e.error({err:a},"Error fetching DOM from the browser"),a.name==="TimeoutError"?o({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):o({err:a.message})}}},Ty={event:"fetchDom",createHandler:uL};var mL=({metadata:n,logger:e})=>{let{sessionId:t,type:r}=n;return o=>{e.info({sessionId:t,reason:o},`Disconnect event received (${o})`),r==="e2e"?Z.removeSession(t,e):r==="api-test"&&delete Sr[t]}},Ey={event:"disconnect",createHandler:mL};function sn(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=hL(t);gL(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await fL(i,e,r,o)}catch(s){n.logger.error({result:n.result,err:s},"Error hoisting scalar result metadata")}})())}function hL(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(s=>{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(s=>{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 gL(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 fL(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Ps from"os";import SL from"v8";var Cy,Ln,yL=Ps.platform(),bL=Ps.cpus().map(n=>({model:n.model,speed:n.speed}));function Ry(n){let e=()=>{try{let t=!1,r=wL(),o=vL();r.freeMemory<1e6&&(t=!0);let i=SL.getHeapStatistics(),s=i.used_heap_size,a=i.heap_size_limit;s/a>.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:bL,platform:yL}}function wL(){let n=Ps.totalmem(),e=Ps.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function vL(){let n=Ps.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 Cy={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,Cy}import{hostname as RL}from"os";async function Iy(n){let{command:e,tracer:t,timeoutMs:r,targetingWrapper:o,disableCache:i,fixtures:s}=n,{logger:a,abortSignal:l}=s;if(e.target&&!or(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:s.ctx,tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async S=>xL(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:Mr(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(a.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 xL(n,{command:e,fixtures:t}){let r=e.assertion;await t.browser.highlight(n);let o=!0,i,s;switch(r.type){case"ELEMENT_CONTENT":{let a=await n.textContent()??"";if(s={elementTextContent:He(a,500,!0)},!Ay(a,r.value,r.operation,!!r.negated)){let l=r.negated?cr[r.operation]:dr[r.operation];o=!1,i=new R("AssertionFailureError",`The content ${l} '${r.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{s={elementOuterHtml:He(await n.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let a;try{a=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(!Ay(a,r.value,r.operation,!!r.negated)){let l=r.negated?cr[r.operation]:dr[r.operation];o=!1,r.operation==="EXISTS"?i=r.negated?new R("AssertionFailureError",`The attribute ${r.attr} ${l}: ${a}`):new R("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new R("AssertionFailureError",`The attribute ${r.attr} ${l} '${r.value}': ${a}`)}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 a=r.negated?yd[r.condition]:bd[r.condition];i=new R("AssertionFailureError",`The element ${a}`)}break}}return{success:o,data:s,err:i}}function Ay(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(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return r?!o:o}import{Jimp as TL}from"jimp";async function Ls(n,e){let t=await n.screenshot(e),r=await TL.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as Py}from"jimp";import sp from"jpeg-js";import EL from"pixelmatch";async function Ly({ctx:n,tracer:e,command:t,disableCache:r,browser:o,targetingWrapper:i,logger:s,screenshotStorage:a}){if(t.target&&!or(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:s});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 B=>Ls(o,{locator:B.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await Ls(o,l);let d=await a.prepareGoldenScreenshotForComparison(s,t,c);if((c.height!==d.height||c.width!==d.width)&&s.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}`,B=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${H}) does not match saved screenshot dimensions (${B}) - 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 Py.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await Py.fromBuffer(d.buffer),h={width:d.width,height:d.height},g,f=u.width*u.height,S=h.width*h.height,v=Math.abs(u.height-h.height),x=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},T=t.threshold??.1,A=EL(sp.decode(d.buffer).data,sp.decode(c.buffer).data,b.data,c.width,c.height,{threshold:T,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,N=A>T*100,O=`Visual diff of ${A.toFixed(2)}% detected, which is ${N?"over":"under"} the threshold of ${T*100}%.`;if(g&&(O+=` The ${g} screenshot was cropped since it was taller by ${v} pixels and wider by ${x} pixels.`),N)throw new R("ActionFailureError",O);return{fail:N,thoughts:O,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:sp.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var CL=5e3;async function gl({timeout:n=En,...e}){let t=Date.now(),r=n*1e3,o=r+1e4,i,s=0,a=500;for(;s-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 Oy(e),s=Date.now();let c=s-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await ne(a,e.signal),a=Math.min(Math.floor(a*1.5),CL);else return i}return i=await Oy(e),i}async function Oy({assertion:n,browser:e,flagStore:t}){switch(n.type){case"CONTENT":{let o,i=!1,s;try{let a;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(My,{value:n.value,negated:!!n.negated,returnHtml:!1});i=n.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),a=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:a}=await e.evaluateFunctionInPage(My,{value:n.value,negated:!!n.negated,returnHtml:!0},"checking page content"));if(!i){let l=n.negated?cr.CONTAINS:dr.CONTAINS;s=new R("AssertionFailureError",`The page ${l} '${n.value}'.`),o=a}}catch(a){s=new R("AssertionFailureError",`Failed to evaluate page content assertion: ${a instanceof Error?a.message:`${a}`}`)}return{success:i,err:s,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 My({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 ap=async n=>{let{step:e,resolvedInputs:t}=n.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:s,controller:a}=n.fixtures,l=a.browser,{orgId:c,runId:d}=n.inputs,p=a.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 Gt({orgId:c,s:f,context:o,logger:r,localTools:s,signal:p,flagStore:a.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([x,b])=>`${x}:${b}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let v=Date.now();for(;Date.now()-v<ig;){p?.throwIfAborted();let x=await i.getCacheResult(g);if(x){r.debug({cacheResult:x},"Got result from module execution cache"),u=fl(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(x),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:${RL()};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 AL(n);else if(e.autoAuth){let f=Ea.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,v=e.advanced?.cacheInvalidation;if(v&&v.type==="PAGE_CHECK"){let x={type:"CONTENT",value:v.substring},b=await gl({timeout:En,assertion:x,browser:l,flagStore:a.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),ap(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await IL({step:e,result:u,browser:a.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},AL=async n=>{let{step:e,tracer:t}=n.moduleParams,r=fl(e,n.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:s}=await yr(n.work,()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return r.results=s,r.status=i,r.finishedAt=new Date,sn({asyncTasks:n.work.asyncTasks,nestedResults:s,result:r,logger:n.fixtures.logger}),r};function fl(n,e,t){let r={};return Object.entries(e).forEach(([i,s])=>{r[i]=JSON.stringify(s)}),{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 ky({orgId:n,step:e,context:t,logger:r,flagStore:o,codeEvalTools:i,signal:s}){let a={};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}a[l]=await Kn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:s,flagStore:o})}return a}catch(l){throw s?.throwIfAborted(),new R("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function IL({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let s=n.cacheConfig?.cacheExpiryMs;(!s||s===Dg)&&(s=n.defaultCacheTtl??Fg);let a;n.autoAuth?a=JSON.stringify(await t.saveAuthState()):e.data!==void 0?a=JSON.stringify(e.data):a='""',o.debug({cacheKeyPrefix:r,ttlMs:s,truncatedCacheResultJson:df(a)},"Setting module cache result"),await i.setCacheResult({result:a,keyPrefix:r,ttlMs:s})}async function br(n,e,t){let r=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,s="FAILED",a;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(a="Step aborted by user.",s="CANCELLED"):o instanceof R?a=`${o}`:a=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=fl(n,{},"FAILED");return l.message=a,l.startedAt=r,l.finishedAt=i,l}return{...Ha(n),startedAt:r,finishedAt:i,status:s,data:null,message:a,results:[]}}}async function yr(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 Ny}from"crypto";import{cloneDeep as LL}from"lodash-es";function Sl(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var yl=async n=>{let{step:e,tracer:t}=n.presetParams,{logger:r,controller:o,context:i,billingReporter:s}=n.fixtures,{collectDebugData:a}=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=es(e.command);n.work.asyncTasks.push(s.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=Ny(),S=Ny();if(a)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 v,x,b,T=wa();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}=OL({work:n.work,step:e,newTargets:C.newTargets,logger:p}),N=new Date,O=o.browser.url();x={beforeUrl:m,afterUrl:O,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},v={...e,message:C.thoughts??ML(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:O,finishedAt:N,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[x],details:T.details,proposedStep:A},"assertion"in e.command&&(v.message=C.thoughts||"Assertion passed.")}catch(C){p.error({message:C.message,stack:C.stack},`Failed executing preset step ${$r(e.command)}`);let A=o.browser.url(),N=new Date,O=C instanceof Error?C.message:`${C}`;C instanceof R&&C.getLastScreenshotBuffer()&&(b=C.getLastScreenshotBuffer()),x={beforeUrl:m,afterUrl:A,startedAt:h,finishedAt:N,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:O},v={...e,startedAt:h,finishedAt:N,beforeUrl:m,afterUrl:A,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:O,failureReason:C instanceof R?C.reason:void 0,results:[x],details:T.details}}if(a)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 x.beforeSnapshot=f,v.beforeSnapshot=f,x.afterSnapshot=S,v.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))),v};function OL({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;nf(o,t,r);let i=t[0]?.description;if(i&&"target"in o&&o.target&&o.target.type==="description"){let s={...o,target:{...o.target,elementDescriptor:i}},a={...LL(e),command:s};return Sl(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:a}}return{proposedStep:void 0}}function ML(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 _y({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 kL=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Dy({beforeUrl:n,beforePages:e,browser:t,command:r,logger:o}){if(kL.includes(r.type))return;let a=("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<a;){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(Kr(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 Fy="MOMENTIC_RUN_ID",Uy="FINAL_SCREENSHOT_URL";import{cloneDeep as jL}from"lodash-es";async function By(n){let{step:e,tracer:t}=n.conditionalParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=Ha(e),a=e.elseSteps,l=!0,c=[],d,p=wa();for(let f=0;f<e.blocks.length;f++){r.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let v=await yl({...n,presetParams:{tracer:t,step:S.assertion}});c.push(v),r.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),l=!1,a=S.steps,d=v}catch(v){r.info({err:v},`Condition ${f} resolved to false`)}finally{o.throwIfClosed()}}if(a)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"),{...s,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 ${a.length} steps in the selected conditional block`);let u=await n.conditionalParams.tracer.startSubSteps(),m=await n.executeStepList({...n,listParams:{steps:a,containerName:"conditional block",tracer:u}}),g={...s,assertion:d,...m,startedAt:i,finishedAt:new Date};return sn({asyncTasks:n.work.asyncTasks,nestedResults:[...c,...m.results],result:g,logger:r}),g}import{randomUUID as zy}from"crypto";var Hy=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await NL(n);r.finishedAt=new Date,sn({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=zy();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=zy();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},NL=async n=>{let{step:e,tracer:t}=n.aiStepParams,{controller:r,context:o,logger:i}=n.fixtures,s={...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:s.results,tracer:l}});return s.finishedAt=new Date,s.status=c,s}catch(l){i.warn({err:l},"Failed executing saved deprecated AI action steps");let c=r.executeAbortController.signal.aborted;s.message=l instanceof Error?l.message:`${l}`,s.status=c?"CANCELLED":"FAILED"}return s};import{randomUUID as lp}from"crypto";var jy=15,_L=7,$y=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await DL(n);r.finishedAt=new Date,sn({asyncTasks:n.work.asyncTasks,result:r,nestedResults:r.results,logger:n.fixtures.logger});let o=await e.browser.screenshot({}),i=lp();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=lp();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},DL=async n=>{let{step:e,tracer:t}=n.aiStepParams,{testMetadata:r,orgId:o}=n.inputs,{controller:i,context:s,logger:a,codeEvalTools:l}=n.fixtures,{step:c}=n.callbacks,d=`${e.id}-${Date.now()}`,p=a.child({stepId:e.id,langfuseSessionId:d}),u={...e,startedAt:new Date,beforeTestContext:s.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await Gt({orgId:o,s:e.text,context:s,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,v=0,x,b;for(;;){if(S>jy)return u.message=`Exceeded the maximum number of commands allowed per AI step (${jy})`,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:N}=T;p.info(T,"Got AI evaluation");let O=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",O&&c.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"SUCCESS",message:`${N}
54
+ ${A}`}),u;case"RIGHT_TRACK":{x=void 0,S===0?c.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:A}):O&&c.onDynamicAIActionEvaluatingEvent?.({stepId:O,status:"SUCCESS",message:A});break}case"WRONG_TRACK":{if(x=`${A}
55
+ ${C.feedback}`,v++,v>=_L)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;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 $=setTimeout(()=>{c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);p.info({commandIndex:S,lastActionHint:x},`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:n?.advanced.disableAICaching??!1,logger:p,actionHint:x,langfuseSessionId:d})),p.info({command:U,reasoning:M},"Got proposed command")}finally{clearTimeout($)}if(U.type==="FAILURE")return clearTimeout($),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${M}`,u;let z={id:op(),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 Y=await t.startSubSteps(),J=(await r.executeStepList({...r,options:{...r.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[z],tracer:Y}})).results[0];c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:p});let Q=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(J),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Q.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,v<3)v++,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 Dy(r){let{results:e}=r.failureRecoveryParams,t=e[e.length-1],n=NL(t);if(n)return r.fixtures.logger.info({failedResult:t,isNotEligible:n},"Skipping failure recovery because of ineligible failure"),null;try{return await kL(r)}catch(o){return r.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function _y({screenshot:r,controller:e,currentPageState:t,newStep:n,patch:o,logger:i}){if(n.aiSuggested=!0,n.type==="PRESET_ACTION"&&"cache"in n.command&&n.command.cache&&"target"in n.command.cache&&"target"in n.command&&n.command.target?.type==="description")try{let a=n.command.cache.target.id,s=await e.getReverseMappedDescription({browserState:t,targetId:a,disableCache:!1,screenshot:r});n.command.target.elementDescriptor=s}catch(a){i.error({err:a},"Error while reverse mapping target in failure recovery")}n.type==="PRESET_ACTION"&&(n.command.thoughts=o.thoughts)}async function kL(r){let{fixtures:e,work:t,failureRecoveryParams:n}=r,{controller:o,logger:i}=e,{results:a,failedStep:s,nextSteps:l,tracer:c}=n;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 Ns(i,e.debugDataStorage,a,{numScreenshots:3,addIndices:!0}),h=l.map(x=>un(x)),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 x=g.patch.value;if(!x)throw new Error("No value in add patch in failure recovery");await _y({screenshot:p,controller:o,currentPageState:u,newStep:x,patch:g.patch,logger:i}),f=[x,s]}else if(g.patch.op==="replace"){let x=g.patch.value;if(!x)throw new Error("No value in replace patch in failure recovery");await _y({screenshot:p,controller:o,currentPageState:u,newStep:x,patch:g.patch,logger:i}),f=[x]}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(),v;if(f.length){v=await Sr(r.work,()=>r.executeStepList({...r,fixtures:{...r.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let x of v.results)x.aiSuggested&&x.type==="PRESET_ACTION"&&(x.message=`AI suggested step: ${x.command.thoughts}`)}else v={status:"SUCCESS",results:[],proposedSteps:[]};return fl(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,v}function NL(r){if(!r)return"No failed result";if(r.type!=="PRESET_ACTION")return"Not a preset action";let e=r.message;return e?e.includes("AbortError:")?"AbortError":$m.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function Fy(r){let{step:e,tracer:t}=r.frameParams,{logger:n,controller:o}=r.fixtures,i=new Date,a=o.browser.getActiveFrameConfig();o.browser.setActiveFrameConfig(e.identifier);let s;try{let d=await t.startSubSteps();s=await r.executeStepList({...r,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:r.work.asyncTasks,nestedResults:s.results,result:c,logger:n}),c}import{randomUUID as yl}from"crypto";import _L from"fast-json-patch";import{cloneDeep as DL}from"lodash-es";async function Uy(r){let e=r.failedResults,t=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:l}=r,{step:c}=n,{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=DL(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:v}=await Ns(p,u,e.results,{numScreenshots:4}),x=await d.runSectionAutohealing({results:v,errorMessage:e.terminalResult?.message,goal:c.description});S=_L.applyPatch(S,x.patches).newDocument;let b=It.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await FL({logger:p,controller:d,tracer:l,context:b,restartConfig:h,startingUrl:a});let T=await Sr(r.work,()=>r.executeStepList({...r,fixtures:{...r.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 FL({logger:r,controller:e,tracer:t,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:yl(),type:"PRESET_ACTION",command:{id:yl(),type:"NAVIGATE",url:n.url}},s=await t.startStep({logger:r,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:r,step:a});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function By(r,e){switch(r||(r="ON_FAILURE"),r){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Vu(e.command.type))}}async function zy(r){let{step:e,tracer:t}=r.sectionParams,{logger:n,controller:o,context:i}=r.fixtures,a=new Date,s=o.browser.url(),l=i.toObjectCopy(),c=await t.startSubSteps(),d=async()=>r.executeStepList({...r,listParams:{steps:e.steps,containerName:"section step list",tracer:c}}),p=e.autohealingConfig?await Sr(r.work,d):await d(),u,m;if(p.status==="FAILED"&&e.autohealingConfig&&!r.work.state.autoHealingDisabled&&By(e.autohealingConfig.trigger,p.terminalResult)){let g=await t.startSubSteps(),f=await Uy({...r,startingContextSnapshot:l,startingUrl:s,failedResults:p,tracer:g});f.successfulHealing&&(u=f.successfulHealing.proposedStep,p=f.successfulHealing.listResult,r.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...p,startedAt:a,finishedAt:new Date,proposedStep:u,healingAttempts:m};return rn({asyncTasks:r.work.asyncTasks,nestedResults:p.results,result:h,logger:n}),h}async function Mn(r){let{results:e=[],containerName:t,steps:n,tracer:o}=r.listParams,{logger:i,context:a,controller:s,codeEvalTools:l,billingReporter:c,analytics:d}=r.fixtures,p=o.getParentStepIdChain(),{orgId:u,fromStep:m,toStep:h}=r.inputs,g=r.work,f=[],S="SUCCESS",v,x=0;for(x;x<n.length;x++){let b=n[x],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(!zg(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 ${x+1}/${n.length} in ${t}: ${C}`);let L=await o.startStep({logger:i,step:b}),$=UL(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:r.inputs.testMetadata?.id,testName:r.inputs.testMetadata?.name,suiteId:r.inputs.suiteMetadata?.id,suiteName:r.inputs.suiteMetadata?.name}));let Y,B;switch(b.type){case"PRESET_ACTION":{Y="Preset action",B=await yr(b,async()=>await Sl({...r,presetParams:{tracer:L,step:b}}),z),"proposedStep"in B&&B.proposedStep&&(T=B.proposedStep,B.proposedStep=void 0);break}case"AI_ACTION":{Y="AI action",B=await yr(b,()=>My({...r,aiStepParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"AI_ACTION_DYNAMIC":{Y="AI action",B=await yr(b,()=>Ny({...r,aiStepParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"RESOLVED_MODULE":{Y=`Module (${b.name})`,B=await yr(b,async()=>{let re=await Ey({orgId:u,step:b,context:a,logger:i,flagStore:s.flagStore,codeEvalTools:l,signal:z});return rp({...r,executeStepList:Mn,moduleParams:{step:b,resolvedInputs:re,tracer:L}})},z);break}case"CONDITIONAL":{Y="Conditional step",B=await yr(b,()=>Ly({...r,conditionalParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"IFRAME":{Y="Frame step",B=await yr(b,()=>Fy({...r,frameParams:{step:b,tracer:L},executeStepList:Mn}),z);break}case"SECTION":{Y="Section";let re=await yr(b,()=>zy({...r,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 BL({startedAt:A,stepTypeName:Y,result:B,callbacks:r.callbacks,analytics:N,globalWorkRef:r.work,tracer:L});let Q;if(B.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let re=await Dy({...r,executeStepList:Mn,failureRecoveryParams:{failedStep:$,nextSteps:n.slice(x+1),results:e,tracer:L}});re&&re.status==="SUCCESS"&&(Q=re.proposedSteps,e.push(...re.results))}if(Q?f.push(...Q):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"&&!Q||s.closed){S=B.status,v=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:v,proposedSteps:f}}async function BL({startedAt:r,stepTypeName:e,result:t,analytics:n,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.`,n.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-r.getTime()});break;case"FAILED":l=t.message??`${a} failed.`,n.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-r.getTime(),fail_reason:t.message??`${a} failed.`});break;case"CANCELLED":l=t.message??`${a} cancelled.`,n.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:s.getTime()-r.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 Hy}from"crypto";async function jy({browser:r,signal:e}){let t=new Date;try{return await r.navigate({url:r.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:Hy(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:t,finishedAt:new Date,results:[],command:{id:Hy(),type:"NAVIGATE",url:r.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var bl=async r=>{let{orgId:e,runId:t,runAttemptId:n,testMetadata:o,steps:i,beforeSteps:a,afterSteps:s}=r.inputs;r.fixtures.logger=r.fixtures.logger.child({orgId:e,runId:t,runAttemptId:n,testId:o?.id}),r.fixtures.analytics=r.fixtures.analytics.child({run_id:t,test_id:o?.id,test_name:o?.name});let{logger:l,controller:c}=r.fixtures,{onTestComplete:d,onTestSuccess:p}=r.callbacks.test,u=Sy(l);if(r.options.reinitializeBrowser){let h=await jy({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 zL(r),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...")}}},zL=async r=>{let{tracer:e}=r.testParams,{runId:t,runAttemptId:n,testMetadata:o,fromStep:i,toStep:a,steps:s,beforeSteps:l,afterSteps:c,orgId:d}=r.inputs,{logger:p,controller:u,context:m,storage:h}=r.fixtures,{collectDebugData:g,disableHealing:f}=r.options;m.setCurrentUrl(u.browser.url());let S="test",v=s,x=[],b=f||i!==void 0||a!==void 0||void 0,T={results:x,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:Y}=await $y(l,"beforeSteps",r);if(O!=="PASSED")return g&&Gy({tracer:e,debugDataStorage:r.fixtures.debugDataStorage,work:T,controller:u,storage:h,context:m,runId:t,runAttemptId:n,logger:p,status:O}),T.asyncTasks.push(Promise.resolve(r.callbacks.test.onSaveFinalRunResults?.({beforeResults:Y,results:[]}))),{status:O,beforeResults:Y,results:[]}}p.debug({stepsToExecute:v,fromStep:i,toStep:a},`Starting step execution for ${S}`);let N=await e.startStepList(),{status:L,terminalResult:$,proposedSteps:U}=await Mn({...r,work:T,listParams:{steps:v,containerName:S,results:x,tracer:N}}),M;if(C&&c&&c.length>0){p.debug("Starting step execution for after step list");try{let{results:O}=await $y(c,"afterSteps",r);M=O}catch(O){p.error({err:O},"Failed to execute after steps list, continuing...")}}if(g&&Gy({tracer:e,debugDataStorage:r.fixtures.debugDataStorage,work:T,controller:u,storage:h,context:m,runId:t,runAttemptId:n,logger:p,status:L}),await Promise.allSettled(T.asyncTasks),T.asyncTasks.push(Promise.resolve(r.callbacks.test.onSaveFinalRunResults?.({results:x,beforeResults:A,afterResults:M}))),L==="FAILED")return{status:"FAILED",results:x,beforeResults:A,afterResults:M,failedStepResult:$};if(L==="CANCELLED")return{status:"CANCELLED",results:x,beforeResults:A,afterResults:M};let z;if(U&&T.state.healingDetails&&o){let O=JS(3);await r.callbacks.test.onProposedTestSteps?.({name:O,testId:o.id,orgId:r.inputs.orgId,runId:r.inputs.runId,steps:U,details:T.state.healingDetails,purpose:"AUTO_HEALING"}),z={orgId:r.inputs.orgId,name:O}}return{proposedTest:z,status:"PASSED",results:x,beforeResults:A,afterResults:M}};async function $y(r,e,t){let n=t.fixtures.logger,o=await t.testParams.tracer.startStepList();n.debug({stepsToExecute:r},`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:r,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 Gy({tracer:r,debugDataStorage:e,work:t,controller:n,storage:o,logger:i,context:a,runId:s,runAttemptId:l,status:c}){let d=n.browser.retrieveAndClearDebugData(),p=Kg(d.logsPerPage),u=ed(d.harPages||{},d.harEntries||{});r.attachConsoleLogs({logger:i,logs:p}),r.attachNetworkLogs({logger:i,logs:u}),t.asyncTasks.push((async()=>{try{let m=await n.browser.screenshot({}),h=await Ry({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await D(n.browser.html(),{milliseconds:2e3});a.setVariable(Py,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:r,customHeaders:e,envVariables:t,envName:n,baseUrl:o,logger:i,localTools:a,orgId:s,flagStore:l}){let c=hs.parse(r);e&&(c.extraHeaders={...c.extraHeaders,...e});let d=new It({baseUrl:o,envName:n,variablesFromEnvironment:t,currentUrl:o});await di({obj:c,context:d,bannedKeys:[],allowList:Km,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 JM}from"lodash-es";var Wy={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;O&&c.onDynamicAIActionEvaluatingEvent?.({stepId:O,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:O??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:x},`Generating new sub-command ${S} within AI action`);let B,M;try{({command:B,reasoning:M}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:r?.advanced.disableAICaching??!1,logger:p,actionHint:x,langfuseSessionId:d})),p.info({command:B,reasoning:M},"Got proposed command")}finally{clearTimeout(H)}if(B.type==="FAILURE")return clearTimeout(H),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${M}`,u;let U={id:lp(),type:"PRESET_ACTION",command:B},L={substepIndex:S+1,message:M||"Generated new command."};c.onDynamicCommandGenerated?.({...L,step:U,parentStepId:e.id}),p.info({commandId:B.id},`Executing sub-command ${S} within AI step: ${$r(B)}`);let Y=await t.startSubSteps(),J=(await n.executeStepList({...n,options:{...n.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[U],tracer:Y}})).results[0];c.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:p});let Q=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(J),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${Q.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:$r(B),elementInteracted:J.results[0]?.elementInteracted,thoughts:M});let Et={substepIndex:S,output:{...J,message:J.message??"Successfully executed preset action."},step:U,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(Et),await t.finish({output:ca.parse(J),step:J,message:J.message}),J.status==="FAILED")if(u.status="FAILED",u.message=J.message,v<3)v++,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 Wy(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=UL(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await FL(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function Gy({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 s=r.command.cache.target.id,a=await e.getReverseMappedDescription({browserState:t,targetId:s,disableCache:!1,screenshot:n});r.command.target.elementDescriptor=a}catch(s){i.error({err:s},"Error while reverse mapping target in failure recovery")}r.type==="PRESET_ACTION"&&(r.command.thoughts=o.thoughts)}async function FL(n){let{fixtures:e,work:t,failureRecoveryParams:r}=n,{controller:o,logger:i}=e,{results:s,failedStep:a,nextSteps:l,tracer:c}=r;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(t.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,u=(await o.browser.getBrowserState({skipWait:!0})).serialize(),{results:m}=await _a(i,e.debugDataStorage,s,{numScreenshots:3,addIndices:!0}),h=l.map(x=>un(x)),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 x=g.patch.value;if(!x)throw new Error("No value in add patch in failure recovery");await Gy({screenshot:p,controller:o,currentPageState:u,newStep:x,patch:g.patch,logger:i}),f=[x,a]}else if(g.patch.op==="replace"){let x=g.patch.value;if(!x)throw new Error("No value in replace patch in failure recovery");await Gy({screenshot:p,controller:o,currentPageState:u,newStep:x,patch:g.patch,logger:i}),f=[x]}else if(g.patch.op==="remove"&&a.type==="PRESET_ACTION"&&["AI_ASSERTION","PAGE_CHECK","ELEMENT_CHECK"].includes(a.command.type))throw new Error("Cannot modify assertion step in failure recovery");let S=await c.startSubSteps(),v;if(f.length){v=await yr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let x of v.results)x.aiSuggested&&x.type==="PRESET_ACTION"&&(x.message=`AI suggested step: ${x.command.thoughts}`)}else v={status:"SUCCESS",results:[],proposedSteps:[]};return Sl(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,v}function UL(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":Xm.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function Vy(n){let{step:e,tracer:t}=n.frameParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=o.browser.getActiveFrameConfig();o.browser.setActiveFrameConfig(e.identifier);let a;try{let d=await t.startSubSteps();a=await n.executeStepList({...n,listParams:{steps:e.steps,containerName:"frame step list",tracer:d}})}finally{o.browser.setActiveFrameConfig(s)}let c={...e,...a,startedAt:i,finishedAt:new Date};return sn({asyncTasks:n.work.asyncTasks,nestedResults:a.results,result:c,logger:r}),c}import{randomUUID as bl}from"crypto";import BL from"fast-json-patch";import{cloneDeep as zL}from"lodash-es";async function qy(n){let e=n.failedResults,t=[],{sectionParams:r,fixtures:o,work:i,startingUrl:s,startingContextSnapshot:a,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=zL(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:v}=await _a(p,u,e.results,{numScreenshots:4}),x=await d.runSectionAutohealing({results:v,errorMessage:e.terminalResult?.message,goal:c.description});S=BL.applyPatch(S,x.patches).newDocument;let b=Lt.fromSnapshot({snapshot:a,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await HL({logger:p,controller:d,tracer:l,context:b,restartConfig:h,startingUrl:s});let T=await yr(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 HL({logger:n,controller:e,tracer:t,restartConfig:r,context:o,startingUrl:i}){switch(r.type){case"NAVIGATE_URL":{let s={id:bl(),type:"PRESET_ACTION",command:{id:bl(),type:"NAVIGATE",url:r.url}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}case"GO_TO_SECTION_START":{let s={id:bl(),type:"PRESET_ACTION",command:{id:bl(),type:"NAVIGATE",url:i}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}}}function Ky(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"&&em(e.command.type))}}async function Yy(n){let{step:e,tracer:t}=n.sectionParams,{logger:r,controller:o,context:i}=n.fixtures,s=new Date,a=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 yr(n.work,d):await d(),u,m;if(p.status==="FAILED"&&e.autohealingConfig&&!n.work.state.autoHealingDisabled&&Ky(e.autohealingConfig.trigger,p.terminalResult)){let g=await t.startSubSteps(),f=await qy({...n,startingContextSnapshot:l,startingUrl:a,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:s,finishedAt:new Date,proposedStep:u,healingAttempts:m};return sn({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:s,controller:a,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",v,x=0;for(x;x<r.length;x++){let b=r[x],T,C=un(b);if(b.skipped)continue;if(g.fastForwardingToStep&&m){let he=JSON.stringify(p);if(b.id===m.fromStepId&&he===JSON.stringify(m.parentStepIdChain))g.fastForwardingToStep=!1;else if(!Yg(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 ${x+1}/${r.length} in ${t}: ${C}`);let O=await o.startStep({logger:i,step:b}),H=jL(b),B=s.toRedactedDisplayCopy(),M=a.browser.url(),U=a.executeAbortController.signal,L=Qi(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 Y,z;switch(b.type){case"PRESET_ACTION":{Y="Preset action",z=await br(b,async()=>await yl({...n,presetParams:{tracer:O,step:b}}),U),"proposedStep"in z&&z.proposedStep&&(T=z.proposedStep,z.proposedStep=void 0);break}case"AI_ACTION":{Y="AI action",z=await br(b,()=>Hy({...n,aiStepParams:{step:b,tracer:O},executeStepList:Mn}),U);break}case"AI_ACTION_DYNAMIC":{Y="AI action",z=await br(b,()=>$y({...n,aiStepParams:{step:b,tracer:O},executeStepList:Mn}),U);break}case"RESOLVED_MODULE":{Y=`Module (${b.name})`,z=await br(b,async()=>{let he=await ky({orgId:u,step:b,context:s,logger:i,flagStore:a.flagStore,codeEvalTools:l,signal:U});return ap({...n,executeStepList:Mn,moduleParams:{step:b,resolvedInputs:he,tracer:O}})},U);break}case"CONDITIONAL":{Y="Conditional step",z=await br(b,()=>By({...n,conditionalParams:{step:b,tracer:O},executeStepList:Mn}),U);break}case"IFRAME":{Y="Frame step",z=await br(b,()=>Vy({...n,frameParams:{step:b,tracer:O},executeStepList:Mn}),U);break}case"SECTION":{Y="Section";let he=await br(b,()=>Yy({...n,sectionParams:{step:b,tracer:O},executeStepList:Mn}),U);"proposedStep"in he&&he.proposedStep&&(T=he.proposedStep,he.proposedStep=void 0),z=he;break}default:return(Ie=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(b)}z.beforeUrl=z.beforeUrl??M,z.beforeTestContext=B,b.envKey&&s.setVariable(b.envKey,z.data);let J=a.browser.url();s.setCurrentUrl(J),z.afterUrl=z.afterUrl??J,z.afterTestContext=s.toRedactedDisplayCopy(),e.push(z),await $L({startedAt:A,stepTypeName:Y,result:z,callbacks:n.callbacks,analytics:N,globalWorkRef:n.work,tracer:O});let Q;if(z.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let he=await Wy({...n,executeStepList:Mn,failureRecoveryParams:{failedStep:H,nextSteps:r.slice(x+1),results:e,tracer:O}});he&&he.status==="SUCCESS"&&(Q=he.proposedSteps,e.push(...he.results))}if(Q?f.push(...Q):T?f.push(T):f.push(b),g.fastForwardingToStep&&m&&m.fromStepId===b.id&&JSON.stringify(p)===JSON.stringify(m.parentStepIdChain)&&(g.fastForwardingToStep=!1),z.status!=="SUCCESS"&&!Q||a.closed){S=z.status,v=z;break}else if(h&&b.id===h.toStepId&&JSON.stringify(p)===JSON.stringify(h.parentStepIdChain)){a.setClosed();break}}return{status:S,results:e,terminalResult:v,proposedSteps:f}}async function $L({startedAt:n,stepTypeName:e,result:t,analytics:r,tracer:o}){let i=e.toLowerCase(),s=e.charAt(0).toUpperCase()+e.slice(1),a=new Date,l="";switch(t.status){case"SUCCESS":l=t.message??`${s} executed successfully.`,r.track({type:"execution:step_success",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime()});break;case"FAILED":l=t.message??`${s} failed.`,r.track({type:"execution:step_fail",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime(),fail_reason:t.message??`${s} failed.`});break;case"CANCELLED":l=t.message??`${s} cancelled.`,r.track({type:"execution:step_cancel",step_type:t.type,command_type:"command"in t?t.command.type:void 0,duration_ms:a.getTime()-n.getTime()});break;default:throw new Error(`Unexpected ${i} status: ${t.status}`)}await o.finish({step:t,message:l,output:ca.parse(t)})}import{randomUUID as Jy}from"crypto";async function Xy({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:Jy(),type:"PRESET_ACTION",status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:r.message,startedAt:t,finishedAt:new Date,results:[],command:{id:Jy(),type:"NAVIGATE",url:n.baseUrl}};return{status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var wl=async n=>{let{orgId:e,runId:t,runAttemptId:r,testMetadata:o,steps:i,beforeSteps:s,afterSteps:a}=n.inputs;n.fixtures.logger=n.fixtures.logger.child({orgId:e,runId:t,runAttemptId:r,testId:o?.id}),n.fixtures.analytics=n.fixtures.analytics.child({run_id:t,test_id:o?.id,test_name:o?.name});let{logger:l,controller:c}=n.fixtures,{onTestComplete:d,onTestSuccess:p}=n.callbacks.test,u=Ry(l);if(n.options.reinitializeBrowser){let h=await Xy({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 GL(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:s,afterSteps:a})}catch(h){l.warn({err:h},"Error running test success handler, continuing...")}}},GL=async n=>{let{tracer:e}=n.testParams,{runId:t,runAttemptId:r,testMetadata:o,fromStep:i,toStep:s,steps:a,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",v=a,x=[],b=f||i!==void 0||s!==void 0||void 0,T={results:x,state:{failureRecoveryDisabled:b,autoHealingDisabled:b},asyncTasks:[]},C=!1;i?.fromStepId&&i.fromStepId===s?.toStepId?(S="filtered step",T.fastForwardingToStep=!0):i?.fromStepId?(S="partial steps list from step",T.fastForwardingToStep=!0):s?S="partial steps list until step":(S="entire test",C=!0);let A;if(C&&l&&l.length>0){let{status:L,results:Y}=await Zy(l,"beforeSteps",n);if(L!=="PASSED")return g&&Qy({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:T,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:L}),T.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({beforeResults:Y,results:[]}))),{status:L,beforeResults:Y,results:[]}}p.debug({stepsToExecute:v,fromStep:i,toStep:s},`Starting step execution for ${S}`);let N=await e.startStepList(),{status:O,terminalResult:H,proposedSteps:B}=await Mn({...n,work:T,listParams:{steps:v,containerName:S,results:x,tracer:N}}),M;if(C&&c&&c.length>0){p.debug("Starting step execution for after step list");try{let{results:L}=await Zy(c,"afterSteps",n);M=L}catch(L){p.error({err:L},"Failed to execute after steps list, continuing...")}}if(g&&Qy({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:T,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:O}),await Promise.allSettled(T.asyncTasks),T.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({results:x,beforeResults:A,afterResults:M}))),O==="FAILED")return{status:"FAILED",results:x,beforeResults:A,afterResults:M,failedStepResult:H};if(O==="CANCELLED")return{status:"CANCELLED",results:x,beforeResults:A,afterResults:M};let U;if(B&&T.state.healingDetails&&o){let L=iy(3);await n.callbacks.test.onProposedTestSteps?.({name:L,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:B,details:T.state.healingDetails,purpose:"AUTO_HEALING"}),U={orgId:n.inputs.orgId,name:L}}return{proposedTest:U,status:"PASSED",results:x,beforeResults:A,afterResults:M}};async function Zy(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}},s={...t.callbacks,test:{...t.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0,onProposedTestSteps:void 0}},{status:a,results:l}=await Mn({...t,work:i,callbacks:s,listParams:{steps:n,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let c;return a==="SUCCESS"?c="PASSED":a==="CANCELLED"?c="CANCELLED":c="FAILED",{status:c,results:l}}function Qy({tracer:n,debugDataStorage:e,work:t,controller:r,storage:o,logger:i,context:s,runId:a,runAttemptId:l,status:c}){let d=r.browser.retrieveAndClearDebugData(),p=rf(d.logsPerPage),u=rd(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 _y({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await D(r.browser.html(),{milliseconds:2e3});s.setVariable(Uy,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,a,l,p):Promise.resolve(null),l?e.storeNetworkLogsForRunAttempt(i,a,l,u):Promise.resolve(null))}async function vl({settings:n,customHeaders:e,envVariables:t,envName:r,baseUrl:o,logger:i,localTools:s,orgId:a,flagStore:l}){let c=ga.parse(n);e&&(c.extraHeaders={...c.extraHeaders,...e});let d=new Lt({baseUrl:o,envName:r,variablesFromEnvironment:t,currentUrl:o});await ui({obj:c,context:d,bannedKeys:[],allowList:nh,localTools:s,logger:i,orgId:a,flagStore:l});try{return ga.parse(c)}catch(p){throw new R("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${p.message}`)}}import{cloneDeep as ek}from"lodash-es";var eb={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) {
@@ -3786,59 +3786,60 @@ function registerAllMomenticListeners() {
3786
3786
 
3787
3787
  // src/html/index.ts
3788
3788
  registerAllMomenticListeners();
3789
- `};import{execSync as hM}from"child_process";import{randomUUID as Jb}from"crypto";import{existsSync as Ml,mkdirSync as gM,readFileSync as fM,writeFileSync as SM}from"fs";import{Jimp as Xb}from"jimp";import yM from"js-beautify";import{cloneDeep as bM}from"lodash-es";var Vy={"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(Vy);var qy=Vy;var Ky={"application/andrew-inset":["ez"],"application/appinstaller":["appinstaller"],"application/applixware":["aw"],"application/appx":["appx"],"application/appxbundle":["appxbundle"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/automationml-aml+xml":["aml"],"application/automationml-amlx+zip":["amlx"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cpl+xml":["cpl"],"application/cu-seeme":["cu"],"application/cwl":["cwl"],"application/dash+xml":["mpd"],"application/dash-patch+xml":["mpp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdf":["fdf"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["*js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/media-policy-dataset+xml":["mpf"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["*mp4","*mpg4","mp4s","m4p"],"application/msix":["msix"],"application/msixbundle":["msixbundle"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-keys":["asc"],"application/pgp-signature":["sig","*asc"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/sql":["sql"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/watcherinfo+xml":["wif"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xfdf":["xfdf"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/aac":["adts","aac"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avci":["avci"],"image/avcs":["avcs"],"image/avif":["avif"],"image/bmp":["bmp","dib"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/dpx":["dpx"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm","jpgm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/jt":["jt"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/prc":["prc"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/u3d":["u3d"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/javascript":["js","mjs"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["md","markdown"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/wgsl":["wgsl"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","*jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};Object.freeze(Ky);var Yy=Ky;var on=function(r,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?r!==e||!n:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(r):n?n.value:e.get(r)},pi,La,to,ip=class{constructor(...e){pi.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[n,o]of Object.entries(e)){n=n.toLowerCase(),o=o.map(s=>s.toLowerCase()),on(this,to,"f").has(n)||on(this,to,"f").set(n,new Set);let i=on(this,to,"f").get(n),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(n,s),a=!1,l)continue;let c=on(this,pi,"f").get(s);if(c&&c!=n&&!t)throw new Error(`"${n} -> ${s}" conflicts with "${c} -> ${s}". Pass \`force=true\` to override this definition.`);on(this,pi,"f").set(s,n)}}return this}getType(e){if(typeof e!="string")return null;let t=e.replace(/^.*[/\\]/,"").toLowerCase(),n=t.replace(/^.*\./,"").toLowerCase(),o=t.length<e.length;return!(n.length<t.length-1)&&o?null:on(this,pi,"f").get(n)??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,pi,"f"),extensions:on(this,La,"f")}}};pi=new WeakMap,La=new WeakMap,to=new WeakMap;var ap=ip;var Jy=new ap(Yy,qy)._freeze();import{homedir as Mp,hostname as wM,platform as vM}from"os";import{basename as xM,extname as TM,join as hi,resolve as EM}from"path";import{chromium as Qb,devices as CM}from"playwright";import{addExtra as RM}from"playwright-extra";import AM from"puppeteer-extra-plugin-recaptcha";import{v4 as IM}from"uuid";import{rmSync as Fb}from"fs";import{basename as HO,join as jO}from"path";import{errors as $O}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 jL=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),$L=new Set(["a","e","i","o","u","y"]);function Xy(r){if(r.length>75)return!1;if(r[0]?.match(/[0-9a-zA-Z]/)===null)return!0;if(r.length>10){let u=Math.floor(r.length/8);if((r.match(/[-_:A-Z/ ]/g)??[]).length<u)return!0}if((r.match(/[^0-9a-zA-Z-_.]/g)??[]).length/r.length>.2)return!0;let t=(r.match(/[0-9]/g)??[]).length;if(t/r.length>.3)return!0;let n=(r.toLowerCase().match(/[aeiou]/gi)??[]).length;if((r.toLowerCase().match(/[bcdfghjklmnpqrstvwxyz]/gi)??[]).length/n>5)return!0;let i=0,a=0;for(let u of r.toLowerCase())jL.has(u)?(a++,a>i&&(i=a)):a=0;if(i>4)return!0;let s=0,l=0;for(let u of r.toLowerCase())u>="a"&&u<="z"&&!$L.has(u)?(l++,l>s&&(s=l)):l=0;if(s>4)return!0;let c=(r.match(/[A-Z]/g)??[]).length,d=(r.match(/[a-z]/g)??[]).length,p=Math.ceil(r.length*.3);return!!(d&&t&&Math.abs(d-t)<p||d&&c&&Math.abs(d-c)<p)}function Zy(r,e,t){if(r.length<t)return r;let n=r.indexOf(e);if(n===-1)return r;let o=Math.max(0,n-t/3),i=Math.min(n+t/3,r.length),a=r.indexOf(`
3790
- `,o);a>0&&a<n&&(o=a);let s=i,l=0;for(;l<1e3&&s>n&&r[s]!==`
3791
- `;)l++,s--;return s>n&&r[s]===`
3792
- `&&(i=s),r.slice(o,i)}import{randomUUID as QL}from"crypto";import{cloneDeep as pp}from"lodash-es";import{randomUUID as YL}from"crypto";var Qy=new Set(["about:blank","chrome-error://chromewebdata/"]);var Nt="data-momentic-id";var sp=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],lp=1e4,Oa=500;function br(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as GL}from"crypto";var WL="v1";function vl(r,e){if(r.tagName.toLowerCase()==="svg"&&!qL(r))try{let t=eb(r,e),n=VL(JSON.stringify(t));return{version:WL,json:t,hash:n}}catch{return}}function VL(r){return GL("md5").update(r).digest("hex")}function eb(r,e){let t=r.tagName.toLowerCase(),n=KL(r);if(t==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:n,children:[]};for(let i of r.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=eb(a,e);s&&o.children.push(s)}}return o}function qL(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function KL(r){let e={},t=r.attributes;for(let n of Object.keys(t))Yn.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var no={r:147,g:196,b:125,a:.55},rb={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 ob({snapshot:r,devicePixelRatio:e,logger:t}){let n=r.strings,o=r.documents,i={},a={},s={roots:[],backendIdToNode:i,frameIndexToIframeNode:a};return o.forEach((l,c)=>{let d=JL({allDocuments:o,stringConstants:n,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:a,logger:t});s.roots.push(d)}),s}function JL({allDocuments:r,stringConstants:e,devicePixelRatio:t,frameIndex:n,frameIndexToIframeNode:o,backendIdToNode:i,logger:a}){let s=r[n],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??[],v=u.nodeType??[],x=u.pseudoType??{index:[],value:[]},b=u.inputChecked??{index:[]},T=e[s.frameId];for(let C=0;C<h.length;C++){let A=h[C],N=v[C],L=g[C]??[],$=f[C]!==void 0&&f[C]>=0?f[C]:void 0,U=$!==void 0?h[$]:void 0,M=U!==void 0?i[U]:void 0,z=x.index.indexOf(C),O=z!==-1?e[x.value[z]]:void 0,Y=c[C],B;Y?B=p[Y]??[]:B=[];let J=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!J){a.warn({backendNodeId:A,frameId:T,frameIndex:n,nodeBounds:B},"DOM node has no tag name");continue}let Q={backendNodeId:A,psuedoType:O,nodeType:N,frameIndex:n,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]=Q;let Me=r[Te]?.frameId;Q.ownedFrameId=Me!==void 0?e[Me]:void 0}for(let Te of Object.keys(Q.bounds)){let Me=Te;Q.bounds[Me]!==null&&(Q.bounds[Me]/=t)}let re=Y!==void 0?d[Y]??[]:[];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];Q.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||(Q.attributes[ln]=Un)}b.index.includes(C)&&(Q.attributes.checked="true"),i[Q.backendNodeId]=Q}return i[h[0]]}function dp(r,e){if(r.mPathSelector)return r.mPathSelector;let t=r.parent,n;if(!t)n=r.tagName;else if(r.tagName==="body")n="body";else{let i=t.childrenBackendIds.filter(l=>e.backendIdToNode[l]?.nodeType===1&&!e.backendIdToNode[l]?.psuedoType).indexOf(r.backendNodeId),a=` > ${r.tagName}:nth-child(${i+1})`;n=`${dp(t,e)}${a}`}return r.mPathSelector=n,n}function tb({originalNode:r,candidate:e,logKey:t,logger:n}){if(!e.bounds)return n.debug({candidate:e},"Filtering out click candidate since it has no bounding box"),!1;let o=r.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:n,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:r},"Filtering out click candidate since it has a significantly different area"),!1):(zr({logger:n,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e},"Filtering out click candidate since it does not intersect with the original node"),!1)}function Tl(r,e,t){let n=Object.values(e.backendIdToNode),o,i=YL();for(let c of n)if(c.attributes?.[Nt]===r){o=c;break}if(!o)return[];let a=[],s=e.backendIdToNode[o.parentBackendNodeId??-1];for(;s&&(s?.momenticIgnored||!tb({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&&tb({originalNode:o,candidate:p,logKey:i,logger:t})?a.push(p):p&&l.push(p)}}return a}function nb(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var XL=["html","#document","#document-fragment"];function ib({node:r,domGraph:e}){let t=[],n=r,o=nb(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=nb(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,XL.includes(n.tagName)){i();continue}if(n.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===n.backendNodeId){t.push(`${n.tagName}:nth-child(${c})`),l=!0;break}else u?.nodeType===1&&!u.psuedoType&&c++}if(!l)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function ab(r,e){let t=r.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(n.length&&(t=t.locator(n.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function sb(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:2e3});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:2e3}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:2e3})).attributes,i=br(o,Nt);if(!i)throw new Error(`Could not find attribute ${Nt} for object ${e}`);return i}function lb(r){let e=[];for(let t=0;t<r.domGraph.roots.length;t++){let n=r.domGraph.roots[t],o=ZL({root:n,domGraph:r.domGraph,existingHashes:r.existingHashes,flagStore:r.flagStore,logger:r.logger});e=e.concat(o)}return e}function ZL(r){let{root:e,domGraph:t,existingHashes:n}=r,o=[],i=[e];for(;i.length;){let a=i.pop();if(a.nodeType===1&&a.tagName.toLowerCase()==="svg"){let s=vl(a,t);s&&!n[s.hash]&&o.push(s)}for(let s of a.childrenBackendIds){let l=t.backendIdToNode[s];l&&i.push(l)}}return o}var eO=["focusable","keyshortcuts","controls","live","relevant","orientation"],tO=["selected","readonly","modal","required","invalid"],nO=["id","name","role","content"],cb=["absolute","fixed","sticky"],rO=["path"],oO=["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"],ub=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],mb=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],iO=["menulistpopup","statictext","inlinetextbox"],aO=80,db=100,El=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],sO=["cite"],lO={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"]},cO={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},pb={indentLevel:0},up=class r{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&&!Xy(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),mO(this.properties,e.domNode)}gO(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&&rO.includes(this.domNode.tagName))return!1;if(oO.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(t=>mb.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=>Sb(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=pb){let t=Object.assign({},pb,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:l}=t,c=pp(this.properties),d=" ".repeat(n),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)||sO.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${d}${m}
3793
- `;let S=`${d}<${u}`;!a&&!f&&(S+=` id="${this.id}"`);let v=s??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(v=!0),p&&p!=="generic"&&p!==u&&!(lO[p]??[]).includes(u)&&(S+=` role=${JSON.stringify(p)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!v&&(S+=` content=${JSON.stringify(this.content)}`);let x=Date.now();if(Object.keys(c).length>0&&!i){if(Date.now()-x>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(!eO.includes(T)){{if(tO.includes(T)&&(!C||C==="false"))return;if(T==="value"&&v&&(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&&!cO[T])return}typeof C=="string"?S+=` ${T}="${ze(C,db,!0)}"`:typeof C=="boolean"?C?S+=` ${T}`:S+=` ${T}={false}`:typeof C<"u"&&(S+=` ${T}={${ze(JSON.stringify(C),db,!0)}}`)}})}if(u==="::before"||u==="::after"){let T="";for(let C of this.children)T+=C.serialize({...e,indentLevel:n,neighbors:0});return T}let b=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||b)S+=` />
3794
- `;else{let T="";for(let A of this.children)T+=A.serialize({...e,indentLevel:n+2,neighbors:0});let C=T.trim();C.length<=aO&&!C.includes(`
3789
+ `};import{execSync as yM}from"child_process";import{randomUUID as iw}from"crypto";import{existsSync as kl,mkdirSync as bM,readFileSync as wM,writeFileSync as vM}from"fs";import{Jimp as sw}from"jimp";import xM from"js-beautify";import{cloneDeep as TM}from"lodash-es";var tb={"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(tb);var nb=tb;var rb={"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(rb);var ob=rb;var an=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)},mi,Os,no,cp=class{constructor(...e){mi.set(this,new Map),Os.set(this,new Map),no.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(a=>a.toLowerCase()),an(this,no,"f").has(r)||an(this,no,"f").set(r,new Set);let i=an(this,no,"f").get(r),s=!0;for(let a of o){let l=a.startsWith("*");if(a=l?a.slice(1):a,i?.add(a),s&&an(this,Os,"f").set(r,a),s=!1,l)continue;let c=an(this,mi,"f").get(a);if(c&&c!=r&&!t)throw new Error(`"${r} -> ${a}" conflicts with "${c} -> ${a}". Pass \`force=true\` to override this definition.`);an(this,mi,"f").set(a,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:an(this,mi,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&an(this,Os,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:an(this,no,"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 an(this,no,"f").values())Object.freeze(e);return this}_getTestState(){return{types:an(this,mi,"f"),extensions:an(this,Os,"f")}}};mi=new WeakMap,Os=new WeakMap,no=new WeakMap;var dp=cp;var ib=new dp(ob,nb)._freeze();import{homedir as Dp,hostname as EM,platform as CM}from"os";import{basename as RM,extname as AM,join as fi,resolve as IM}from"path";import{chromium as lw,devices as PM}from"playwright";import{addExtra as LM}from"playwright-extra";import OM from"puppeteer-extra-plugin-recaptcha";import{v4 as MM}from"uuid";import{rmSync as Vb}from"fs";import{basename as WO,join as VO}from"path";import{errors as qO}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 VL=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),qL=new Set(["a","e","i","o","u","y"]);function sb(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,s=0;for(let u of n.toLowerCase())VL.has(u)?(s++,s>i&&(i=s)):s=0;if(i>4)return!0;let a=0,l=0;for(let u of n.toLowerCase())u>="a"&&u<="z"&&!qL.has(u)?(l++,l>a&&(a=l)):l=0;if(a>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 ab(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),s=n.indexOf(`
3790
+ `,o);s>0&&s<r&&(o=s);let a=i,l=0;for(;l<1e3&&a>r&&n[a]!==`
3791
+ `;)l++,a--;return a>r&&n[a]===`
3792
+ `&&(i=a),n.slice(o,i)}import{randomUUID as rO}from"crypto";import{cloneDeep as gp}from"lodash-es";import{randomUUID as QL}from"crypto";var lb=new Set(["about:blank","chrome-error://chromewebdata/"]);var Ft="data-momentic-id";var pp=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],up=1e4,Ms=500;function wr(n,e){let t=n.findIndex(r=>r===e);if(!(t===-1||!n[t+1]))return n[t+1]}import{createHash as KL}from"crypto";var YL="v1";function xl(n,e){if(n.tagName.toLowerCase()==="svg"&&!XL(n))try{let t=cb(n,e),r=JL(JSON.stringify(t));return{version:YL,json:t,hash:r}}catch{return}}function JL(n){return KL("md5").update(n).digest("hex")}function cb(n,e){let t=n.tagName.toLowerCase(),r=ZL(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 s=e.backendIdToNode[i];if(s&&s.nodeType===1){let a=cb(s,e);a&&o.children.push(a)}}return o}function XL(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function ZL(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 ro={r:147,g:196,b:125,a:.55},ub={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:ro,paddingColor:ro,borderColor:ro,marginColor:ro,eventTargetColor:ro,shapeColor:ro,shapeMarginColor:ro,showInfo:!0,showAccessibilityInfo:!0},Tl=["display","opacity","visibility","height","position"];function mb({snapshot:n,devicePixelRatio:e,logger:t}){let r=n.strings,o=n.documents,i={},s={},a={roots:[],backendIdToNode:i,frameIndexToIframeNode:s};return o.forEach((l,c)=>{let d=eO({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:s,logger:t});a.roots.push(d)}),a}function eO({allDocuments:n,stringConstants:e,devicePixelRatio:t,frameIndex:r,frameIndexToIframeNode:o,backendIdToNode:i,logger:s}){let a=n[r],l=a.layout,c={};l.nodeIndex.forEach((C,A)=>{c[C]=A});let d=l.styles,p=l.bounds??[],u=a.nodes,m=u.contentDocumentIndex??{index:[],value:[]},h=u.backendNodeId??[],g=u.attributes??[],f=u.parentIndex??[],S=u.nodeName??[],v=u.nodeType??[],x=u.pseudoType??{index:[],value:[]},b=u.inputChecked??{index:[]},T=e[a.frameId];for(let C=0;C<h.length;C++){let A=h[C],N=v[C],O=g[C]??[],H=f[C]!==void 0&&f[C]>=0?f[C]:void 0,B=H!==void 0?h[H]:void 0,M=B!==void 0?i[B]:void 0,U=x.index.indexOf(C),L=U!==-1?e[x.value[U]]:void 0,Y=c[C],z;Y?z=p[Y]??[]:z=[];let J=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!J){s.warn({backendNodeId:A,frameId:T,frameIndex:r,nodeBounds:z},"DOM node has no tag name");continue}let Q={backendNodeId:A,psuedoType:L,nodeType:N,frameIndex:r,parentFrameId:T,ownedFrameId:void 0,bounds:{x:z[0]??null,y:z[1]??null,width:z[2]??null,height:z[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:B??null,tagName:J,parent:M??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};M&&M.childrenBackendIds.push(A);let Et=m.index.indexOf(C);if(Et!==-1){let Ie=m.value[Et];o[Ie]=Q;let Se=n[Ie]?.frameId;Q.ownedFrameId=Se!==void 0?e[Se]:void 0}for(let Ie of Object.keys(Q.bounds)){let Se=Ie;Q.bounds[Se]!==null&&(Q.bounds[Se]/=t)}let he=Y!==void 0?d[Y]??[]:[];for(let Ie=0;Ie<he.length&&!(Ie>=Tl.length);Ie++){let Se=he[Ie];if(Se===void 0||isNaN(Se))continue;let Bt=e[Se];if(Bt===void 0)continue;let Ct=Tl[Ie];Q.computedStyles[Ct]=Bt}for(let Ie=0;Ie<O.length;Ie+=2){let Se=O[Ie],Bt=O[Ie+1];if(!Se||!Bt)continue;let Ct=e[Se],Un=e[Bt];!Ct||!Un||(Q.attributes[Ct]=Un)}b.index.includes(C)&&(Q.attributes.checked="true"),i[Q.backendNodeId]=Q}return i[h[0]]}function hp(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),s=` > ${n.tagName}:nth-child(${i+1})`;r=`${hp(t,e)}${s}`}return n.mPathSelector=r,r}function db({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,s=o.width??0,a=o.height??0,l=i+s,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(s-u)<200||Math.abs(a-m)<200?!0:(Hr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(Hr({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 El(n,e,t){let r=Object.values(e.backendIdToNode),o,i=QL();for(let c of r)if(c.attributes?.[Ft]===n){o=c;break}if(!o)return[];let s=[],a=e.backendIdToNode[o.parentBackendNodeId??-1];for(;a&&(a?.momenticIgnored||!db({originalNode:o,candidate:a,logKey:i,logger:t}));)a=e.backendIdToNode[a.parentBackendNodeId??-1];a&&s.push(a);let l=[o];for(;l.length;){let c=l.shift();for(let d of c.childrenBackendIds??[]){let p=e.backendIdToNode[d];p&&!p.momenticIgnored&&db({originalNode:o,candidate:p,logKey:i,logger:t})?s.push(p):p&&l.push(p)}}return s}function pb(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var tO=["html","#document","#document-fragment"];function hb({node:n,domGraph:e}){let t=[],r=n,o=pb(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=pb(o,e),!o&&r.frameIndex!==0)throw new Error("No parent node but not in main frame")},s=0;for(;o&&s<1e6;){if(s++,tO.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 gb(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 s=r.join(" > ");r=[],o<e.length-1?t=t.frameLocator(s):t=t.locator(s)}}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 fb(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=wr(o,Ft);if(!i)throw new Error(`Could not find attribute ${Ft} for object ${e}`);return i}function Sb(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=nO({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function nO(n){let{root:e,domGraph:t,existingHashes:r}=n,o=[],i=[e];for(;i.length;){let s=i.pop();if(s.nodeType===1&&s.tagName.toLowerCase()==="svg"){let a=xl(s,t);a&&!r[a.hash]&&o.push(a)}for(let a of s.childrenBackendIds){let l=t.backendIdToNode[a];l&&i.push(l)}}return o}var oO=["focusable","keyshortcuts","controls","live","relevant","orientation"],iO=["selected","readonly","modal","required","invalid"],sO=["id","name","role","content"],yb=["absolute","fixed","sticky"],aO=["path"],lO=["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"],vb=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],xb=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],cO=["menulistpopup","statictext","inlinetextbox"],dO=80,bb=100,Cl=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],pO=["cite"],uO={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"]},mO={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},wb={indentLevel:0},fp=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&&!sb(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),SO(this.properties,e.domNode)}bO(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&&aO.includes(this.domNode.tagName))return!1;if(lO.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(t=>xb.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=>Rb(t))?!0:this.children.every(t=>t.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(t=>t.role==="StaticText")?!0:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(t=>t.startsWith("data"))}serialize(e=wb){let t=Object.assign({},wb,e),{indentLevel:r,noChildren:o,noProperties:i,noId:s,noContent:a,condensedMode:l}=t,c=gp(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=Cl.includes(this.role)||pO.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${d}${m}
3793
+ `;let S=`${d}<${u}`;!s&&!f&&(S+=` id="${this.id}"`);let v=a??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(v=!0),p&&p!=="generic"&&p!==u&&!(uO[p]??[]).includes(u)&&(S+=` role=${JSON.stringify(p)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!v&&(S+=` content=${JSON.stringify(this.content)}`);let x=Date.now();if(Object.keys(c).length>0&&!i){if(Date.now()-x>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(!oO.includes(T)){{if(iO.includes(T)&&(!C||C==="false"))return;if(T==="value"&&v&&(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&&!mO[T])return}typeof C=="string"?S+=` ${T}="${He(C,bb,!0)}"`:typeof C=="boolean"?C?S+=` ${T}`:S+=` ${T}={false}`:typeof C<"u"&&(S+=` ${T}={${He(JSON.stringify(C),bb,!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+=` />
3794
+ `;else{let T="";for(let A of this.children)T+=A.serialize({...e,indentLevel:r+2,neighbors:0});let C=T.trim();C.length<=dO&&!C.includes(`
3795
3795
  `)?S+=`>${C}</${u}>
3796
3796
  `:S+=`>
3797
3797
  ${T}${d}</${u}>
3798
3798
  `}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let T=this.parent.children.findIndex(N=>N.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||""}
3799
3799
  ${S}
3800
- ${A||""}`}return S}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:pp(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=pp(this.properties),e}},mp=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,l=i.shallowClone(),c=i.children,d=!1,p=[];for(let u of c){let m=n(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=n(t);return new r(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function dO(r){return r.name?.value?`"${r.name.value}"`:r.role?.value&&r.role.value!=="none"&&r.role.value!=="generic"?`"${r.role.value}"`:`"${r.nodeId}"`}function pO(r,e,t,n){return r.bounds.x===null||r.bounds.y===null||r.bounds.height===null||r.bounds.width===null||r.bounds.width===0||r.bounds.height===0?!0:r.bounds.x+r.bounds.width<e.leftBound||r.bounds.x>e.rightBound?(zr({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):r.bounds.y+r.bounds.height<e.upperBound||r.bounds.y>e.lowerBound?(zr({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):r.computedStyles.display==="none"?(t.debug({domNode:r},"Filtering out node since it has display none"),!1):!0}async function hb({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,showZeroOpacityElements:s,filterByViewport:l,viewportDetails:c,useMPaths:d,cdpClient:p,logger:u,callId:m}){if(!e&&r.parentId)throw new Error(`Got no parent for accessibility node ${r.nodeId}: ${JSON.stringify(r)}`);let h=(M,z={})=>{},g=r.backendDOMNodeId,f=iO.includes((r.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:r,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&&r.backendDOMNodeId&&!pO(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 v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",x=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",b=new up({domNode:S,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:x,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(M=>ub.includes(M.name)||mb.includes(M.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+dO(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:n.type==="root"?void 0:n}),T=n,C=a[t],A=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let M=n.childFrames.find(Y=>Y.frameId===S.ownedFrameId),z=o[M?.frameId??""]?.root,O=a[M?.frameId??""];if(M&&z&&O){r.childIds&&r.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let Y=z;r.childIds=Y.childIds,T=M,C=O,A=M.frameId}}let N=S?.childrenBackendIds?.length??0,L=r.childIds?.length??0;if(N>L){let M=r.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=(r.childIds?.findIndex(St=>C.get(parseInt(St))?.backendDOMNodeId===O)??0)+1;continue}let Y=i.backendIdToNode[O];if(!Y||Y?.tagName.toLowerCase()!=="svg")continue;let B=Math.floor(-1*Math.random()*1e7),J={nodeId:B.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:O,frameId:A,role:{type:"string",value:"graphics-symbol"}};C.set(B,J),r.childIds||(r.childIds=[]),r.childIds.splice(z,0,B.toString()),z++}}for(let M of r.childIds??[]){if(!M)continue;let z=C.get(parseInt(M));if(!z)continue;let O=await hb({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 $=[];for(let M=b.children.length-1;M>=0;M--){let z=b.children[M];if(z.role!=="StaticText"){$.push(z);continue}if(M===0||b.children[M-1].role!=="StaticText"){$.push(z);continue}b.children[M-1].name+=z.name}if(b.children=$.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()&&r.parentId)return S&&(S.momenticIgnored=!0),b.children;for(let M of b.children)M.parent=b;return hO(b),S&&d&&dp(S,i),[b]}function gb({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:l,startId:c=1}){r.id=c,c+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:El.includes(r.role);let d=r.backendNodeId,p=d!==void 0?i.backendIdToNode[d]:void 0;if(a&&p&&p.mPathSelector&&(s[p.mPathSelector]=r),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&&(r.properties["data-momentic-description"]=h)}for(let u of r.children)c=gb({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:c,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:l});return c}async function fb({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,viewportDetails:s,useMPaths:l,frameContext:c,iconKnowledgeBase:d}){let p=t??"root",u=r[p]?.root;if(!u)throw new Error("A11y tree has no root");let m=QL(),h=b=>{let T=b.allNodes.filter(A=>!A.ignoredReasons?.find(L=>ub.includes(L.name))),C=new Map;return T.forEach(A=>{C.set(parseInt(A.nodeId),A)}),C},g={};Object.entries(r).forEach(([b,T])=>{g[b]=h(T)});let f=await hb({node:u,domGraph:e,parent:null,inputNodeMap:g,axGraph:r,frameId:p,frameContext:c,cdpClient:o,logger:n,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={},v={},x={};return gb({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:v,selectorToNodeMap:x,domGraph:e,logger:n,callId:m,useMPaths:l,iconKnowledgeBase:d}),new mp(f[0],S,v,x)}function uO(r,e,t){if(r==="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 n=e.split(" "),o=[];for(let i of n)if(Sb(i)){o.push(i);continue}return o.length?o.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let n=parseInt(e);if(!isNaN(n))return n}catch{}return r==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function mO(r,e){if(!e)return;Object.entries(e.attributes).forEach(([i,a])=>{if(Yn.relevantElementAttributes.includes(i)&&!nO.includes(i)&&!r[i]&&!i.startsWith("aria")){let s=uO(i,a,e);s!==null&&(r[i]=s)}});let t,n=[];if(e.computedStyles.position&&cb.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of cb)if(e.attributes.style.includes(`position: ${i}`)){t=i;break}}t&&n.push(`position: ${t}`);let o;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(o="opacity: 0"),o&&n.push(o),n.length>0&&(r.style=n.join("; "))}function hO(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(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 r.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 gO(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function Sb(r){if(Yn.bannedClassSubstrings.some(e=>r.includes(e)))return!1;if(Yn.alwaysInterestingClassNames.includes(r))return!0;for(let e of Yn.alwaysInterestingClassPrefixes)if(r.startsWith(e))return!0;return!1}var Cl=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,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 r(s,e,t,n,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:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await D(this.cdpInitializingPromise,{milliseconds:n});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:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await D(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new R("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await 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(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};import{mkdirSync as fO,rmSync as yb,statSync as SO}from"fs";import*as fp from"node:fs";import yO from"nodejs-file-downloader";import{tmpdir as bO}from"os";import wr,{basename as wO,dirname as vO}from"path";var Sp="file://",gp=wr.join(bO(),"momentic","downloads"),hp=1e4,xO=50*1024*1024;async function bb(r){let{uri:e}=r;return e.startsWith(Sp)?EO(r):e.startsWith("http")?RO(r):CO(r)}function TO(r,e){let t=wr.join(gp,r,e.slice(Sp.length)),n=wr.join(gp,r),o=t.startsWith(n);if(!fp.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 EO({uri:r,orgId:e}){let t=TO(e,r);return{filePath:t,cleanup:()=>{yb(vO(t),{recursive:!0,force:!0})}}}async function CO({uri:r}){let e=wr.resolve(r);if(!fp.existsSync(e))throw new R("UserConfigurationError",`The referenced file (${r}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function RO({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=wO(n.href),i=bp(o),a=wr.extname(i);if(kh.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=yp(t),l=new yO({url:r,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:hp}),{downloadStatus:c,filePath:d}=await D(l.download(),{milliseconds:hp,message:`Download timed out after ${hp}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=SO(d).size;if(u>xO)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(()=>yb(s,{recursive:!0,force:!0}),10*60*1e3)}}}function wb(r,e){return`${Sp}${r}/${e}`}function yp(r){let e=Math.random().toString(36).substring(4),t=wr.join(gp,r,e);return fO(t,{recursive:!0}),t}function bp(r){let e=wr.extname(r),t=wr.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function bn(r,e){try{return await r.evaluate(n=>window.serializeElementOnlyWithText?.(n,{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 vb(r,e){let t=r.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]}}),[n,o]=await D(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function xb(r,e,t){if(e){t.debug("Importing indexedDB data");try{let n=r.evaluate(async o=>{let i=window;for(let[a,s]of Object.entries(o))await i.importObjectToIdb?.(a,s)},e);await D(n,{milliseconds:3e3})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function Tb(r,e){try{let t=r.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(n=>{n.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await D(t,{milliseconds:3e3})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function Eb(r,e,t,n,o){try{await AO(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function AO(r,e,t,n){let o=n.text();o.length>Oa&&(o=o.slice(0,Oa)+"...(TRUNCATED)");let i=[];for(let a of n.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{}wp(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function wp(r,e,t,n){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let a=0;a<t;a++)i[a]===void 0&&(i[a]=[])}i[t].length>lp&&(i[t]=i[t].slice(Math.floor(lp/2)),i[t]?.push({url:r.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...n,tabIndex:t,timestamp:o})}async function an({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await aa({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import{randomUUID as IO}from"crypto";var PO="[redacted due to size]",LO=1e4;async function Pb(r,e,t){let n=new Date().toISOString();e.harPages||(e.harPages={}),e.harPages[r]={id:r,startedDateTime:n,title:void 0,pageTimings:{}}}async function Lb(r,e,t,n){try{await OO(r,e,t)}catch(o){o.message.includes("browser has been closed")||n.warn({err:o,pageId:r},"Error handling new network request, skipping...")}}function ro(r){return r<0?0:r}function Cb(r){return{timings:{blocked:ro(r.domainLookupStart),dns:ro(r.domainLookupEnd-r.domainLookupStart),connect:ro(r.connectEnd-r.connectStart),send:ro(r.responseStart-r.requestStart),wait:0,receive:ro(r.responseEnd-r.responseStart),ssl:ro(r.connectEnd-r.secureConnectionStart)},total:ro(r.responseEnd)}}async function OO(r,e,t){let n=IO(),o=t.timing(),i=new URL(t.url()),a=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),s={...await Ib(t),url:i.toString(),method:t.method(),queryString:a,postData:await kO(t)},l={pageref:r,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:s,timings:Cb(o).timings};Rb(e,l,n);let c=await t.response();if(c){await c.finished();let h={};try{h=await NO(c)}catch{}let g={...await Ib(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}=Cb(p);l.time=m,l.timings=u,Rb(e,l,n)}function Rb(r,e,t){r.harEntries||(r.harEntries={}),r.harEntries[t]=e}function Ab(r){try{return new Date(r).toISOString()}catch{return}}function MO(r){let e={name:"",value:""},t=!0;for(let n of r.split(/; */)){let o=n.indexOf("="),i=o!==-1?n.substring(0,o).trim():n.trim(),a=o!==-1?n.substring(o+1,n.length).trim():"";if(t){t=!1,e.name=kn(i),e.value=kn(a);continue}i==="Domain"&&(e.domain=kn(a)),i==="Expires"&&(e.expires=Ab(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=Ab(Date.now()+ +a*1e3)),i==="Path"&&(e.path=kn(a)),i==="Secure"&&(e.secure=!0)}return e}async function Ib(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(MO)??[];return{headers:Object.entries(e).map(([n,o])=>({name:kn(n),value:kn(o)})),cookies:t}}async function kO(r){let e=r.postData();if(!e)return;let t=await r.headerValue("content-type"),n={mimeType:t??"application/octet-stream",text:kn(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,a]of o.entries())n.params.push({name:kn(i),value:a?kn(a):void 0})}return n}async function NO(r){return{mimeType:await r.headerValue("content-type")??void 0,text:kn(await r.text()),encoding:await r.headerValue("content-encoding")??void 0}}function kn(r){return r.length>LO?PO:r}function Ob(){return async r=>{let{fragment:e,code:t,context:n}=r,{env:o}=n||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function je({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await D(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}function vp(){return window.lastCursorPos}import{errors as _O}from"playwright-core";async function oo({func:r,action:e,logger:t,callbacks:n,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),s;for(;Date.now()-a<o;)try{return await r(i)}catch(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([r(i),n.getBrowserState({skipWaitForPageLoad:!0,skipWait:!0})]);return d}else if(c instanceof _O.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await DO(c,i.locator,n,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 DO(r,e,t,n){return r.message.includes("attempt #")?FO(r,e,t,n):UO(r)}async function FO(r,e,t,n){let o=r.message.split(/- retrying \w+ action, attempt #\d+/).filter(l=>l.length>0);if(!o.length)return n.warn({err:r},"Failed to parse Playwright error message for translation, returning raw message"),r;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
3801
- `,";").replace(/\s+/g," ");let a="",s=await bn(e,n);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:r}});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,n);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}
3802
- ${l}`,{errOptions:{cause:r}})}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:r}})}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}`):r}function UO(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new 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:r}});return r}async function Mb(r){try{return await BO(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function BO({locator:r,logger:e}){let[t,n]=await r.evaluate(l=>[l.id,l.tagName.toLowerCase()],{timeout:1e3}),o=await bn(r,e),i=await r.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(n==="input"&&t)try{let l=r.page().locator(`label[for=${JSON.stringify(t)}]`);return await l.waitFor({state:"visible",timeout:1e3}),{locator:l,relativePoint:void 0}}catch{}let a=await r.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=r.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 Nb=["date","datetime-local","month","time","week"],kb={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 _b(r){try{await D(zO(r),{milliseconds:3e3})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function zO({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await je({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:1e3,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!kb[i])return;kb[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.debug("Transforming datetime input to use sequential key presses")}async function Rl({locator:r,callbacks:e,logger:t,timeoutMs:n=1e3}){try{await xp(e,n);let o=r.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:n});return await D(o,{milliseconds:n}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function xp(r,e=1e3){let t=await r.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:r.waitForPageLoad,codePath:"removing element highlights"})}async function Ep(r){let e=r.flagStore.isBooleanFlagEnabled("visual_actions");return oo({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>Tp({...r,targetingResult:t,useVisualClick:e})})}async function GO(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await WO(r,e)}catch(n){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:n,originalError:r},"Error handling click error, rethrowing original error"),r):n}}async function WO(r,e){let{logger:t,redirectionAttempts:n=0,browserCallbacks:o,actionSource:i}=e,a=e.targetingResult.locator,s=o.state.getDomGraph();if(r.message.includes("label")&&r.message.includes("for=")&&r.message.includes("intercepts pointer events")){let l=await a.getAttribute("id",{timeout:1e3});if(!l)throw r;let c=a.page().locator(`[for=${JSON.stringify(l)}]`);return await c.waitFor({state:"visible",timeout:1e3}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),Tp({...e,targetingResult:{locator:c},redirectionAttempts:n+1})}else if(i==="click"&&s&&r.message.includes("intercepts pointer events")){t.warn({err:r},"Attempting locator redirection due to covering error");let l=await JO(a,s,t);if(l)return Tp({...e,targetingResult:{locator:l},redirectionAttempts:n+1});throw t.error({err:r},"No updated locator could be found to fix covering error, rethrowing"),r}else throw t.error({err:r},"Click error does not match any known recoverable patterns, rethrowing"),r}async function VO(r){let{browserCallbacks:e,logger:t,targetingResult:n,position:o,options:i}=r,a=await e.state.getRoot(),s=a&&a!==n.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 YO({frameCoordinates:l,logger:t,targetingResult:n,position:o,options:i});t.debug({frameCoordinates:l,position:o,targetingResultHints:n.hints,options:i,clickLocation:{clickX:d,clickY:p,reason:u},duration:Date.now()-c},"Visual click")}async function qO(r){let{actionSource:e,targetingResult:t,options:n,logger:o}=r,i=r.targetingResult.locator,a=n?.relativePosition??r.position;if(e==="click"&&!a){let l=await Mb({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=n?.force||t.hints?.force||!1;try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:3e3,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:3e3,position:a,delay:n?.delayMs??25,force:s})}catch(l){let c=l;if(ZO(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..."),GO(c,{...r,targetingResult:{...i,locator:i}})}}async function Tp(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,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 $O.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:n,logger:t,timeoutMs:1e3})}catch(l){t.warn({err:l},"Error highlighting locator in click, continuing...")}if(i?await VO(r):await qO(r),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 XO(l,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function KO(r,e){if(e.hints?.clickableXY){let i=(r?.x??0)+e.hints.clickableXY.x,a=(r?.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 n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point of the bounding box"]}async function YO({frameCoordinates:r,logger:e,options:t,targetingResult:n,position:o}){let i,a,s;if(o){let p=await n.locator.boundingBox({timeout:3e3});i=(r?.x??0)+(p?.x??0)+o.x,a=(r?.y??0)+(p?.y??0)+o.y,s="predefined position"}else{let[p,u]=await KO(r,n);i=p.x,a=p.y,s=u}let l=n.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 JO(r,e,t){let n=await r.evaluate(s=>s.getAttribute("data-momentic-id"));if(!n)return;let o=Tl(n,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[Nt]??"");if(isNaN(i))return;r=r.page().locator(`[data-momentic-id="${i}"]`);let a=await bn(r,t);return t.warn({candidateMomenticId:i,serializedHtml:a},"Trying new locator based on parent-direction after covering error"),r}async function XO(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=bp(r.suggestedFilename()),i=e();await r.saveAs(jO(i,o)),Fb(n,{force:!0}),setTimeout(()=>{Fb(i,{recursive:!0,force:!0})},5*60*1e3);let a=wb(HO(i),o);return t.debug({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function ZO(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as QO}from"os";var eM={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 tM(){let r=QO();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function Ub(r){return JSON.stringify(r.split("+").sort())}function Al(r){let e=tM(),t=Ub(r);for(let n of Object.values(eM))if(Object.values(n).some(o=>Ub(o)===t))return n[e];return process.platform==="darwin"?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function Cp({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:l}){if(!t&&!o)return;let c=n==="left"?-1:1,d=i==="up"?-1:1;if(r)await je({root:r,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}),[v,x,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&&v===m&&x===h&&b===g)break;u=S,m=v,h=x,g=b,await ne(500)}}catch(f){l.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Rp(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await ne(500)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}var ui="<empty>";function nM(r){return r.includes("doubleclick.net")||r.includes("googletagmanager.com")||r.includes("googlesyndication.com")||r.includes("s.amazon-adsystem.com")||r.includes("smartadserver.com")||r.includes("omnitagjs.com")||r.includes("x.adroll.com")}function zb(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||nM(r.url)}async function rM(r,e){let t=await r.send({timeout:3e3,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:3e3,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:3e3,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function mi({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:3e3,method:"Page.getFrameTree",params:{}}),r.send({timeout:3e3,method:"DOM.getDocument",params:{depth:0}})]),c=(i.frameTree.childFrames??[]).map(async(p,u)=>{if(zb(p.frame))return null;try{return await Hb({cdpClient:r,rawFrameTree:p,indices:[u],parent:n,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),d=await Promise.all(c);return n.childFrames=d.filter(p=>p!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function Hb({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await rM(r,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:n,domNode:s},m=(e.childFrames??[]).map(async(h,g)=>{if(zb(h.frame))return null;try{return await Hb({cdpClient:r,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 oM(r){try{return await r.owner().count()===1}catch{return!1}}async function iM(r){try{return await r.count()===1}catch{return!1}}async function Nn(r,e){let t=[],n=r;for(;n.parent.type==="frame";)t.push(n.parent),n=n.parent;t.reverse();let o=e,i=[];for(let 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 oM(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[...r.locationData.attributeSelectors,ui]){let d=o.locator(c===ui?"iframe":`iframe[${c}]`);if(await iM(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 '${r.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 '${r.url}'`);return await s.dispose(),{frame:l,mPathSelectorTokens:i}}function Bb(r,e){let t=[...r],n=[];for(;t.length;){let o=t.shift();e(o)&&n.push(o),t.push(...o.childFrames)}return n}async function jb({page:r,frameTree:e,cache:t}){let n,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 n=l[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Nn(n,r)).frame,handle:n,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=Bb(o,c=>!!c.src&&s.test(c.src));if(l.length===1)return n=l[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Nn(n,r)).frame,handle:n,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=Bb(o,c=>!!c.url&&s.test(c.url));if(l.length===1)return n=l[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Nn(n,r)).frame,handle:n,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(n=a[t.indices[t.indices.length-1]],n)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Nn(n,r)).frame,handle:n,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 Il(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function Ap(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function $b(r){let e=Ap(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function Gb(r){return r.type==="auto"?{type:"auto",frameId:r.handle.frameId,url:r.handle.url,src:r.handle.src??"",mPathSelectorTokens:r.mPathSelectorTokens.join(" > ")}:{type:"url",url:r.url}}async function Wb({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await aM({frameElementHandle:n,logger:e,signal:t})}catch(o){e.warn({err:o},"Failed to scroll iframe into view, continuing...")}finally{await n?.dispose()}}async function aM({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();if(!n){e.warn("Active frame element has null bounding box, skipping scroll");return}await Vr({promiseGenerator:async()=>r.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))}},n),timeoutMs:2e3,codePath:"scrollIframeIntoView",signal:t}),e.info({bb:n},"Successfully scrolled iframe into view")}async function Vb({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:l}=r.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!l)return;let c=n.parentFrame()?n.url():void 0,p=n.page().frames().map(h=>h.url());i.debug({frameUrl:c,...r},"Passive click event captured on element");let u,m;if(c)try{let h=await n.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({...r,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 sM from"js-beautify";var lM=["Dead"],Pl=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,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=n}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:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),l=s,c;switch(e.frameConfig?e.frameBoundingBox?c={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):c=n.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,...n.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,...n.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,...n.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=sM.html(p,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),p=Zy(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:n.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:n}=e;if(lM.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(n){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)},n=()=>{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"?(n(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&n())}};var Ll=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:n,allowPartialAccessibilityTree:o,logger:i,cdpClient:a,pageGetter:s,flagStore:l,abortSignalGetter:c,enricher:d,iconKnowledgeBase:p}){this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.showZeroOpacityElements=n,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(),n=Ap(e),{frame:o,mPathSelectorTokens:i}=await Nn(e,t),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),n=await mi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await jb({page:t,frameTree:n,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(Il(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Il(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await Wb({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await mi({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[D(n.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(Nn(l,n).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}),n=Array.from(t.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:n??this.logger})}async getA11yTree(e){let t={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,l=null;if(this.frameConfig?.type==="url"){if(a=await an({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??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:()=>mi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),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:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let c=await an({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),d=await an({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:l,childFrames:s.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:p}=await an({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:d,domGraph:c,startingFrameId:l,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase}),codePath:"a11yProcess",logObject:t,signal:o,logger:n});return Object.values(t).some(u=>u>750)&&n.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 n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=ib({node:o,domGraph:this.domGraph});return ab(e,i)}else return this.getLocatorFromBackendId(t,n.backendNodeId)}async getLocatorFromBackendId(e,t){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:2e3});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await sb(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute"),i}return e.locator(`[${Nt}="${o}"]`)}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,l=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await mi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.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:Il(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),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(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(p)){a.push({handle:s,matchType:"regex",...await Nn(s,o)});break}}else if(n.trim()===p.trim()){a.push({handle:s,matchType:"url",...await Nn(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 '${n}'. Please use a more specific selector.`):new R("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s}){let l=await fb({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,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:n,logger:o}){if(this.flagStore.isBooleanFlagEnabled("visual_actions"))return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||n)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 Nn(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 n=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){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let n=t.hostname.split("."),o=n.length>2?n.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return t?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let t=e.attributes??[];if(br(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=br(t,"style");if(n?.includes("display: none")||n?.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:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[];try{await this.pageGetter().waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(m){i.warn({err:m},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let 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(n),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:n}){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:n,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:n,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:n,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:n}){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),n.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 ob({snapshot:o,devicePixelRatio:e,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=$b(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function Ip(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}function qb(r){return async(e,t)=>{let n=await t.allHeaders();for(let{key:o,value:i,matcher:a}of r)(!a||a.test(t.url()))&&(n[o]=i);await e.continue({headers:n})}}var Lp=hi(Mp(),"momentic","chromium"),PM=hi(Mp(),"video"),kl=process.env.TWO_CAPTCHA_KEY,Op=RM(Qb);Op.use(AM({provider:{id:"2captcha",token:kl},visualFeedback:!0}));var Dn=class r{static USER_AGENT=CM["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:n,browser:o,context:i,page:a,baseUrl:s,logger:l,mockedServices:c,userBrowserSettings:d,viewport:p,properties:u,clientCallbacks:m,iconKnowledgeBase:h}){if(kg(d),this.mockedServices=c,this.storage=e,this.flagStore=t,this.enricher=n,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:Wy.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("**/*",qb(this.customHeaders));let n=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,n]),this.properties.systemDevicePixelRatio||(process.env.MOMENTIC_LOCAL_DEV==="1"&&vM()==="darwin"&&hM("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 Ll({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,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init({baseUrl:e,logger:t,storage:n,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||Oo,locale:l?.locale||Po,timezoneId:l?.timezoneId||Lo,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??r.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,v,x,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("~")?hi(Mp(),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 $ of T){let U=hi($,"manifest.json");if(!Ml(U))throw new R("UserConfigurationError",`Chrome extension path ${U} does not exist.`)}let A=hi(Lp,`momentic-session-${Date.now()}`);if(!Ml(A))try{gM(A,{recursive:!0})}catch($){throw new R("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Lp} folder: ${$}`)}let N=[...f],L=T.map($=>EM($)).join(",");N.push(`--disable-extensions-except=${L}`),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}`),v=await Qb.launchPersistentContext(hi(Lp,`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)"),x=v.pages()[0]}else if(c){S=await Op.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");v=A,x=N}else{S=await Op.launch({...h,args:f});let A={...g,baseURL:e,recordVideo:d?{dir:PM}:void 0};v=await S.newContext(A),t.debug({contextArgs:A,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:s,flags:o.getAllFlags()},"Browser initialization context args (standard)"),x=await v.newPage()}let C=new r({browser:S,context:v,page:x,baseUrl:e,logger:t,storage:n,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 Rp(this.context,{getTitles:!0}),t=this.page.url();this.clientCallbacks?.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let n=Jb(),o=`${e}-${n}`,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 n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[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 n=e.video();n&&this.videos.push(n)}try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Jb(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);e.on("console",a=>{Eb(e,o,this.debugData,a,this.logger)}),e.on("request",a=>{Lb(t,this.debugData,a,this.logger),this.recordRequest(a)});let i=async()=>{await Pb(t,this.debugData,e),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,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}),n=lb({domGraph:t,flagStore:this.flagStore,logger:this.logger,existingHashes:this.iconKnowledgeBase});if(n.forEach(s=>{this.iconKnowledgeBase[s.hash]=s}),!n.length)return;let o=Ue(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:wM()};for(let s of["runId","testId"])o[s]&&(i[s]=o[s]);let a={metadata:i,newSvgs:n};this.clientCallbacks.onSvgsCollected(a)}handleFrameNavigationEvent(e){let t=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)}-${n}`;if(!t||t==="about:blank"||!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 n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame()},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(xp(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,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<8e3;){a++,n?.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=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),t.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of t)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:t=1,stabilizeBeforeScreenshot:n=!1}=e,o=Date.now(),i=this.page.url();n&&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"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??2e3}),l=Buffer.from(s.data,"base64"),c=await Xb.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")),n&&SM(n,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 Xb.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:n=this.pageLoadTimeout}){Nf(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:n,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(Qy.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={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElement(e){try{return await je({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;return n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n}:void 0},arg:void 0,timeout: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={},n=!1){let o=await this.getActivePageOrFrame();await _b({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let a=Date.now();for(;Date.now()-a<this.smartWaitingTimeout&&(!i||i.tag==="body");)await 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??$u}),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 n=>{let o=n.scrollTop;n.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:2e3})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return 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),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:1e3}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await Tb(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 n=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}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.debug(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await xb(this.page,o,this.logger),this.logger.debug(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await vb(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new R("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Rp(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:n,forceSaveNewCssSelectors:o,logger:i=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),n)try{let a=await this.fetchHtmlAttributes({locator:n,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,n,i)}catch(a){i.debug({err:a},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes(e,t,n){if(!t)return;await this.scrollIntoView(t);let o=await t.boundingBox({timeout:1e3});if(!o||!o.width||!o.height){n.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||!sp.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:n=>window.evaluateHybridSelector(n),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:n=>window.evaluateCssSelectors(n),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:n,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:v}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,d=v,l=v.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:n,targetUpdateTime:new Date().toISOString(),frameCache:c},h,g=!1;o||(d&&(i.debug({frameConfigSource:p,frameConfig:Gb(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,n={}){let{skipFetchTree:o=!1,targetName:i,logger:a=this.logger,signal:s=this.abortSignal}=n;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:n}){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:n})},a=async()=>{if(t.generatedSelectors)return this.resolveTargetWithCssSelectors({root:e,target:t,logger:n})},[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),n.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:
3800
+ ${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:gp(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=gp(this.properties),e}},Sp=class n{constructor(e,t,r,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=r;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function r(i,s=!1){let a=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,a||d);m&&(p.push(m),m.parent=l,d=!0)}if(l.children=p,a||d)return l;if(Cl.includes(i.role)&&s)return l}let o=r(t);return new n(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function hO(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 gO(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?(Hr({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?(Hr({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 Tb({node:n,parent:e,frameId:t,frameContext:r,axGraph:o,domGraph:i,inputNodeMap:s,showZeroOpacityElements:a,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,U={})=>{},g=n.backendDOMNodeId,f=cO.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&&!gO(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&&!a&&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 Hr({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 v=n.name?.value?typeof n.name.value=="string"?n.name.value:`${n.name.value}`:"",x=n.value?.value?typeof n.value.value=="string"?n.value.value:`${n.value.value}`:"",b=new fp({domNode:S,id:parseInt(n.nodeId),role:n.role?.value||"",name:v,nameSources:n.name?.sources,content:x,properties:n.properties,children:[],ignoredReasons:n.ignoredReasons?.filter(M=>vb.includes(M.name)||xb.includes(M.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+hO(n),backendNodeID:n.backendDOMNodeId,ignoredByCDP:n.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:r.type==="root"?void 0:r}),T=r,C=s[t],A=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let M=r.childFrames.find(Y=>Y.frameId===S.ownedFrameId),U=o[M?.frameId??""]?.root,L=s[M?.frameId??""];if(M&&U&&L){n.childIds&&n.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let Y=U;n.childIds=Y.childIds,T=M,C=L,A=M.frameId}}let N=S?.childrenBackendIds?.length??0,O=n.childIds?.length??0;if(N>O){let M=n.childIds?.map(L=>C.get(parseInt(L))).filter(Boolean).map(L=>L?.backendDOMNodeId).filter(L=>L!==void 0)??[],U=0;for(let L of S?.childrenBackendIds??[]){if(M.includes(L)){U=(n.childIds?.findIndex(Et=>C.get(parseInt(Et))?.backendDOMNodeId===L)??0)+1;continue}let Y=i.backendIdToNode[L];if(!Y||Y?.tagName.toLowerCase()!=="svg")continue;let z=Math.floor(-1*Math.random()*1e7),J={nodeId:z.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:L,frameId:A,role:{type:"string",value:"graphics-symbol"}};C.set(z,J),n.childIds||(n.childIds=[]),n.childIds.splice(U,0,z.toString()),U++}}for(let M of n.childIds??[]){if(!M)continue;let U=C.get(parseInt(M));if(!U)continue;let L=await Tb({node:U,parent:b,domGraph:i,axGraph:o,frameId:A,frameContext:T,inputNodeMap:s,cdpClient:p,logger:u,callId:m,filterByViewport:l,showZeroOpacityElements:a,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 M=b.name,U=b.children[0]?.name;(M===U||!U)&&(b.children=[])}let H=[];for(let M=b.children.length-1;M>=0;M--){let U=b.children[M];if(U.role!=="StaticText"){H.push(U);continue}if(M===0||b.children[M-1].role!=="StaticText"){H.push(U);continue}b.children[M-1].name+=U.name}if(b.children=H.reverse(),b.role==="generic"&&b.children.length===1){let M=b.children[0];if(b.name&&!Cl.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 yO(b),S&&d&&hp(S,i),[b]}function Eb({node:n,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,domGraph:i,useMPaths:s,selectorToNodeMap:a,iconKnowledgeBase:l,startId:c=1}){n.id=c,c+=1,e[n.id]=n,n.dataMomenticId?t[n.dataMomenticId]=n:Cl.includes(n.role);let d=n.backendNodeId,p=d!==void 0?i.backendIdToNode[d]:void 0;if(s&&p&&p.mPathSelector&&(a[p.mPathSelector]=n),l&&p&&p.tagName?.toLowerCase()==="svg"){let u=xl(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=Eb({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:s,domGraph:i,selectorToNodeMap:a,iconKnowledgeBase:l});return c}async function Cb({rawA11yGraph:n,domGraph:e,startingFrameId:t,logger:r,cdpClient:o,filterByViewport:i,showZeroOpacityElements:s,viewportDetails:a,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=rO(),h=b=>{let T=b.allNodes.filter(A=>!A.ignoredReasons?.find(O=>vb.includes(O.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 Tb({node:u,domGraph:e,parent:null,inputNodeMap:g,axGraph:n,frameId:p,frameContext:c,cdpClient:o,logger:r,callId:m,showZeroOpacityElements:s,filterByViewport:i,viewportDetails:a,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={},v={},x={};return Eb({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:v,selectorToNodeMap:x,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:d}),new Sp(f[0],S,v,x)}function fO(n,e,t){if(n==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(i=>i.length<50&&!Yn.bannedClassSubstrings.some(s=>i.includes(s))).slice(0,3).join(" ");let r=e.split(" "),o=[];for(let i of r)if(Rb(i)){o.push(i);continue}return o.length?o.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let r=parseInt(e);if(!isNaN(r))return r}catch{}return n==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function SO(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,s])=>{if(Yn.relevantElementAttributes.includes(i)&&!sO.includes(i)&&!n[i]&&!i.startsWith("aria")){let a=fO(i,s,e);a!==null&&(n[i]=a)}});let t,r=[];if(e.computedStyles.position&&yb.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of yb)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 yO(n){let e=n.properties.class;if(typeof e=="string"&&e.includes("cm-content")){n.children.forEach((i,s)=>{i.properties["cm-line-number"]=`${s+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){n.children.forEach((i,s)=>{i.properties["block-number"]=`${s+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=[],s=n.children.find(l=>l.tagName==="thead");if(s){let l=s.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(He(d.name,100,!1))}),i?.length!==c.length&&(i=void 0)}}let a=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=>He(h.name,100,!1)),i.length===m.length)continue;i=void 0}}a+=1,d.properties["row-index"]||(d.properties["row-index"]=a);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 bO(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function Rb(n){if(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 Rl=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(),s=r(),a,l;for(let d=0;d<2;d++)try{a=await D(i.newCDPSession(s),{milliseconds:o*d,fallback:()=>{throw new R("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${s.url()})`)}});break}catch(p){await ne(500),l=p}if(!a)throw l;let c=new n(a,e,t,r,o);try{await D(c.registerHandlers(a),{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(s=>i.message.includes(s))&&!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 wO,rmSync as Ab,statSync as vO}from"fs";import*as wp from"node:fs";import xO from"nodejs-file-downloader";import{tmpdir as TO}from"os";import vr,{basename as EO,dirname as CO}from"path";var vp="file://",bp=vr.join(TO(),"momentic","downloads"),yp=1e4,RO=50*1024*1024;async function Ib(n){let{uri:e}=n;return e.startsWith(vp)?IO(n):e.startsWith("http")?LO(n):PO(n)}function AO(n,e){let t=vr.join(bp,n,e.slice(vp.length)),r=vr.join(bp,n),o=t.startsWith(r);if(!wp.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 IO({uri:n,orgId:e}){let t=AO(e,n);return{filePath:t,cleanup:()=>{Ab(CO(t),{recursive:!0,force:!0})}}}async function PO({uri:n}){let e=vr.resolve(n);if(!wp.existsSync(e))throw new R("UserConfigurationError",`The referenced file (${n}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function LO({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=EO(r.href),i=Tp(o),s=vr.extname(i);if(Hh.includes(s))throw new Error(`Downloading files with extension ${s} is not allowed.`);let a=xp(t),l=new xO({url:n,fileName:i,directory:a,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:yp}),{downloadStatus:c,filePath:d}=await D(l.download(),{milliseconds:yp,message:`Download timed out after ${yp}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=vO(d).size;if(u>RO)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(()=>Ab(a,{recursive:!0,force:!0}),10*60*1e3)}}}function Pb(n,e){return`${vp}${n}/${e}`}function xp(n){let e=Math.random().toString(36).substring(4),t=vr.join(bp,n,e);return wO(t,{recursive:!0}),t}function Tp(n){let e=vr.extname(n),t=vr.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 Lb(n,e){let t=n.evaluate(async()=>{let i=window,s={};try{let a=await indexedDB.databases();for(let l of a){if(!l.name)continue;let c=await i.exportIdbToObject?.(l.name,l.version);c&&(s[l.name]=c)}return[s,void 0]}catch(a){return[void 0,a.message]}}),[r,o]=await D(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),r}async function Ob(n,e,t){if(e){t.debug("Importing indexedDB data");try{let r=n.evaluate(async o=>{let i=window;for(let[s,a]of Object.entries(o))await i.importObjectToIdb?.(s,a)},e);await D(r,{milliseconds:3e3})}catch(r){t.warn({err:r},"Failed to import indexedDB data")}}}async function Mb(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 kb(n,e,t,r,o){try{await OO(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function OO(n,e,t,r){let o=r.text();o.length>Ms&&(o=o.slice(0,Ms)+"...(TRUNCATED)");let i=[];for(let s of r.args())try{let a=await s.jsonValue(),l=JSON.stringify(a);l.length>Ms?i.push(l.slice(0,Ms)+"...(TRUNCATED)"):(typeof a!="object"||Object.keys(a).length>0)&&i.push(a)}catch{}Ep(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function Ep(n,e,t,r){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let s=0;s<t;s++)i[s]===void 0&&(i[s]=[])}i[t].length>up&&(i[t]=i[t].slice(Math.floor(up/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 ln({fn:n,codePath:e,logObject:t,signal:r,logger:o}){r?.throwIfAborted();let i=Date.now(),s=await as({promiseGenerator:n,signal:r,codePath:e,logger:o}),a=Date.now();return t[e]=a-i,s}import{randomUUID as MO}from"crypto";var kO="[redacted due to size]",NO=1e4;async function Ub(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 Bb(n,e,t,r){try{await _O(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 oo(n){return n<0?0:n}function Nb(n){return{timings:{blocked:oo(n.domainLookupStart),dns:oo(n.domainLookupEnd-n.domainLookupStart),connect:oo(n.connectEnd-n.connectStart),send:oo(n.responseStart-n.requestStart),wait:0,receive:oo(n.responseEnd-n.responseStart),ssl:oo(n.connectEnd-n.secureConnectionStart)},total:oo(n.responseEnd)}}async function _O(n,e,t){let r=MO(),o=t.timing(),i=new URL(t.url()),s=[...i.searchParams.entries()].map(([h,g])=>({name:h,value:g})),a={...await Fb(t),url:i.toString(),method:t.method(),queryString:s,postData:await FO(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:a,timings:Nb(o).timings};_b(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await UO(c)}catch{}let g={...await Fb(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}=Nb(p);l.time=m,l.timings=u,_b(e,l,r)}function _b(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function Db(n){try{return new Date(n).toISOString()}catch{return}}function DO(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(),s=o!==-1?r.substring(o+1,r.length).trim():"";if(t){t=!1,e.name=kn(i),e.value=kn(s);continue}i==="Domain"&&(e.domain=kn(s)),i==="Expires"&&(e.expires=Db(s)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=Db(Date.now()+ +s*1e3)),i==="Path"&&(e.path=kn(s)),i==="Secure"&&(e.secure=!0)}return e}async function Fb(n){let e=await n.allHeaders(),t=e.cookie?.split(";").map(DO)??[];return{headers:Object.entries(e).map(([r,o])=>({name:kn(r),value:kn(o)})),cookies:t}}async function FO(n){let e=n.postData();if(!e)return;let t=await n.headerValue("content-type"),r={mimeType:t??"application/octet-stream",text:kn(e),params:[]};if(t==="application/x-www-form-urlencoded"){let o=new URLSearchParams(e.toString());for(let[i,s]of o.entries())r.params.push({name:kn(i),value:s?kn(s):void 0})}return r}async function UO(n){return{mimeType:await n.headerValue("content-type")??void 0,text:kn(await n.text()),encoding:await n.headerValue("content-encoding")??void 0}}function kn(n){return n.length>NO?kO:n}function zb(){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 Cp(){return window.lastCursorPos}import{errors as BO}from"playwright-core";async function io({func:n,action:e,logger:t,callbacks:r,retryTimeoutMs:o,targetingResult:i}){let s=Date.now(),a;for(;Date.now()-s<o;)try{return await n(i)}catch(l){let c=l;if(ts(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 BO.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),a=await zO(c,i.locator,r,t);else throw c}throw a instanceof R?a:new R("ActionFailureError",`Failed to interact with targeted element. Error: ${a.message}`,{errOptions:{cause:a}})}async function zO(n,e,t,r){return n.message.includes("attempt #")?HO(n,e,t,r):jO(n)}async function HO(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(`
3801
+ `,";").replace(/\s+/g," ");let s="",a=await bn(e,r);if(a&&(s=`Target element HTML: ${He(a,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. ${s}`,{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: ${He(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. ${s}
3802
+ ${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. ${s}`,{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. ${s}`):n}function jO(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 Hb(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 s=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(s.type==="error")throw new Error(s.error);let a=n.page().locator(s.selector);return await a.waitFor({state:"visible",timeout:1e3}),e.info({parentElementResult:s,originalElementDisplayString:o},`Redirected click to parent element with selector: ${s.selector}`),{locator:a,relativePoint:s.relativePoint}}var $b=["date","datetime-local","month","time","week"],jb={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 Gb(n){try{await D(GO(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function GO({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(!jb[i])return;jb[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 Al({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await Rp(e,r);let o=n.evaluate(i=>{let s=window;s.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)},s.removeHighlightTimers=s.removeHighlightTimers||[],s.removeHighlightFunctions=s.removeHighlightFunctions||{};let a=0;for(;!s.momenticIsEligible(i)&&a<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,a++}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)}`;s[d]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",l,c),i.getAttribute("style")||i.removeAttribute("style")},s.removeHighlightTimers.push(setTimeout(()=>{s[d](),s.removeHighlightFunctions?.[d]&&delete s.removeHighlightFunctions[d]},5e3)),s.removeHighlightFunctions[d]=s[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 Rp(n,e=1e3){let t=await n.state.getRoot();await $e({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let s=i.pop();clearTimeout(s)}Object.values(o.removeHighlightFunctions??{}).forEach(s=>{s()})},timeout:e,arg:void 0,waitForPageLoad:n.waitForPageLoad,codePath:"removing element highlights"})}async function Ip(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return io({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>Ap({...n,targetingResult:t,useVisualClick:e})})}async function KO(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await YO(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 YO(n,e){let{logger:t,redirectionAttempts:r=0,browserCallbacks:o,actionSource:i}=e,s=e.targetingResult.locator,a=o.state.getDomGraph();if(n.message.includes("label")&&n.message.includes("for=")&&n.message.includes("intercepts pointer events")){let l=await s.getAttribute("id",{timeout:1e3});if(!l)throw n;let c=s.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"),Ap({...e,targetingResult:{locator:c},redirectionAttempts:r+1})}else if(i==="click"&&a&&n.message.includes("intercepts pointer events")){t.warn({err:n},"Attempting locator redirection due to covering error");let l=await eM(s,a,t);if(l)return Ap({...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,s=await e.state.getRoot(),a=s&&s!==r.locator.page()&&"frameElement"in s?await s.frameElement():null,l;try{l=a?await qr({promiseGenerator:async()=>a.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 a?.dispose()}let c=Date.now(),{clickX:d,clickY:p,reason:u}=await QO({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 XO(n){let{actionSource:e,targetingResult:t,options:r,logger:o}=n,i=n.targetingResult.locator,s=r?.relativePosition??n.position;if(e==="click"&&!s){let l=await Hb({locator:i,logger:o});l&&(i=l.locator,s=l.relativePoint??s)}let a=r?.force||t.hints?.force||!1;try{r?.doubleClick?await i.dblclick({button:r.rightClick?"right":"left",timeout:3e3,position:s,delay:r?.delayMs??25,force:a}):await i.click({button:r?.rightClick?"right":"left",timeout:3e3,position:s,delay:r?.delayMs??25,force:a})}catch(l){let c=l;if(nM(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..."),KO(c,{...n,targetingResult:{...i,locator:i}})}}async function Ap(n){let{options:e,logger:t,browserCallbacks:r,controllerCallbacks:o,useVisualClick:i,targetingResult:s}=n,a;e?.waitForDownload&&(a=(async()=>{let l=e.downloadTimeoutMs??3e4;try{return await s.locator.page().waitForEvent("download",{timeout:l})}catch(c){return c instanceof qO.TimeoutError?new R("ActionFailureError",`Download did not complete in ${l}ms`):new R("ActionFailureError",`Download failed: ${c.message}`)}})());try{await Al({locator:s.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 XO(n),e?.waitForDownload)if(a){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(a,{milliseconds:e.downloadTimeoutMs??3e4});if(l instanceof Error)throw l;return{downloadedFile:await tM(l,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function ZO(n,e){if(e.hints?.clickableXY){let i=(n?.x??0)+e.hints.clickableXY.x,s=(n?.y??0)+e.hints.clickableXY.y;return[{x:i,y:s},"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 QO({frameCoordinates:n,logger:e,options:t,targetingResult:r,position:o}){let i,s,a;if(o){let p=await r.locator.boundingBox({timeout:3e3});i=(n?.x??0)+(p?.x??0)+o.x,s=(n?.y??0)+(p?.y??0)+o.y,a="predefined position"}else{let[p,u]=await ZO(n,r);i=p.x,s=p.y,a=u}let l=r.locator.page(),c=t?.rightClick?"right":"left",d=t?.delayMs??25;return t?.doubleClick?await l.mouse.dblclick(i,s,{button:c,delay:d}):await l.mouse.click(i,s,{button:c,delay:d}),{clickX:i,clickY:s,reason:a}}async function eM(n,e,t){let r=await n.evaluate(a=>a.getAttribute("data-momentic-id"));if(!r)return;let o=El(r,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[Ft]??"");if(isNaN(i))return;n=n.page().locator(`[data-momentic-id="${i}"]`);let s=await bn(n,t);return t.warn({candidateMomenticId:i,serializedHtml:s},"Trying new locator based on parent-direction after covering error"),n}async function tM(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=Tp(n.suggestedFilename()),i=e();await n.saveAs(VO(i,o)),Vb(r,{force:!0}),setTimeout(()=>{Vb(i,{recursive:!0,force:!0})},5*60*1e3);let s=Pb(WO(i),o);return t.debug({uri:s,downloadFolder:i},"Saved download to isolated folder"),s}function nM(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as rM}from"os";var oM={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 iM(){let n=rM();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function qb(n){return JSON.stringify(n.split("+").sort())}function Il(n){let e=iM(),t=qb(n);for(let r of Object.values(oM))if(Object.values(r).some(o=>qb(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function Pp({frame:n,page:e,deltaX:t,directionX:r,deltaY:o,directionY:i,signal:s,callbacks:a,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:a.waitForPageLoad,timeout:2e3,codePath:"scrolling page"});else{let p=e.viewportSize()||Jt,u=await $e({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:a.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:a.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;){s?.throwIfAborted();let S=await D(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[v,x,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&&v===m&&x===h&&b===g)break;u=S,m=v,h=x,g=b,await ne(500)}}catch(f){l.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Lp(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 s="";try{s=e?.getTitles?await i.title():""}catch{s="Unknown page"}return{title:s,url:i.url()}}))}catch(i){r=i,await ne(500)}throw new Error(`Failed to get tab titles after all retries: ${r?.message}`)}var hi="<empty>";function sM(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 Yb(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||sM(n.url)}async function aM(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],s=(await n.send({timeout:3e3,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return s.nodeId=o,s}async function gi({cdpClient:n,page:e,logger:t}){let r={type:"root",childFrames:[],page:e},o=[],[i,s]=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(Yb(p.frame))return null;try{return await Jb({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 Jb({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o,logger:i}){let s=e.frame.id,a=await aM(n,s),l=a.attributes??[],c=null,d=[];for(let h of["src","name","id","title","srcdoc","sandbox"]){let g=wr(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:s,locationData:{indices:t,attributeSelectors:d},src:c,childFrames:[],parent:r,domNode:a},m=(e.childFrames??[]).map(async(h,g)=>{if(Yb(h.frame))return null;try{return await Jb({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 lM(n){try{return await n.owner().count()===1}catch{return!1}}async function cM(n){try{return await n.count()===1}catch{return!1}}async function Nn(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,hi]){let u=o.frameLocator(p===hi?"iframe":`iframe[${p}]`);if(await lM(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 s;for(let c of[...n.locationData.attributeSelectors,hi]){let d=o.locator(c===hi?"iframe":`iframe[${c}]`);if(await cM(d)){s=d,i.push(c);break}}if(!s)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 a=await s.evaluateHandle(c=>c,{timeout:1e3}),l=await a.asElement().contentFrame();if(!l)throw new R("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${n.url}'`);return await a.dispose(),{frame:l,mPathSelectorTokens:i}}function Kb(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 Xb({page:n,frameTree:e,cache:t}){let r,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let a=o;for(let d=0;d<t.mPathSelectorTokens.length-1;d++){let p=t.mPathSelectorTokens[d];p===hi?a=a.length===1?a[0].childFrames:[]:a=a.filter(u=>u.locationData.attributeSelectors.includes(p)).map(u=>u.childFrames).flat()}let l=[],c=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(c===hi?l=a:l=a.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 Nn(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 a=new RegExp(t.frameSrcRegex),l=Kb(o,c=>!!c.src&&a.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 Nn(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 a=new RegExp(t.frameUrlRegex),l=Kb(o,c=>!!c.url&&a.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 Nn(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 s=o;for(let a=0;a<t.indices.length-1;a++)s=s[t.indices[a]]?.childFrames??[];if(r=s[t.indices[t.indices.length-1]],r)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Nn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${s.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 Pl(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function Op(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function Zb(n){let e=Op(n),t=n.src??"",r=n.url??"",o=[],i=[],s=[...e.childFrames];for(;s.length;){let a=s.shift();a.src&&o.push(a.src),a.url&&i.push(a.url),s.push(...a.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:r}}function Qb(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 ew({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await dM({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 dM({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 qr({promiseGenerator:async()=>n.evaluate(async(i,{x:s,y:a})=>{window.scrollTo(window.scrollX+s,window.scrollY+a);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 tw({event:n,transformer:e,enricher:t,frame:r,lastScreenshotForRecording:o,logger:i}){let{warnings:s,error:a,properties:l}=n.target;if(a){i.error({error:a,warnings:s},"Error while capturing passive click");return}if(s.length&&i.warn({warnings:s},"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 pM from"js-beautify";var uM=["Dead"],Ll=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:r,testId:o,orgId:i,logger:s}){this.signal=e,this.logger=s,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(a,l)=>{this.recordedSteps.set(l,{step:a}),t.onStepRecorded(a,l)},onActionReceived:(a,l)=>{this.recordedSteps.set(l,{step:a}),t.onActionReceived?.(a,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,s,a=r.properties.attributes.nodeOnlySerializedHtml.trim(),l=a,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);s={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);s={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);s={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?.(s,d);let p=e.target.browserState;try{p=pM.html(p,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),p=ab(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,...Be(this.logger)}})).phrase}catch(g){this.logger.error({err:g},"Error generating reverse mapping description"),u=a}let m=this.recordedSteps.get(d)?.step??s,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(uM.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 s,a=this.nextStepOffset-1,l=this.recordedSteps.get(a),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}`}},s=a}else if(d?.type==="CLICK"&&i.command.type==="TYPE")c.command={...i.command,target:d.target,cache:d.cache},i=l.step,s=a;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)}},s=a}}s===void 0&&(s=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,s)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let s=this.nextStepOffset-1,a=this.recordedSteps.get(s)?.step.command,l;a?.type==="SCROLL_DOWN"&&a.deltaY?(i+=a.deltaY,l=s):a?.type==="SCROLL_UP"&&a.deltaY?(i-=a.deltaY,l=s):(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 s=this.nextStepOffset-1,a=this.recordedSteps.get(s)?.step.command,l;a?.type==="SCROLL_RIGHT"&&a.deltaX?(i+=a.deltaX,l=s):a?.type==="SCROLL_LEFT"&&a.deltaX?(i-=a.deltaX,l=s):(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 Ol=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:s,pageGetter:a,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=s,this.pageGetter=a,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=Op(e),{frame:o,mPathSelectorTokens:i}=await Nn(e,t),s={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,s),{cache:s,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:r,cache:s}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),r=await gi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await Xb({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(Pl(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:Pl(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await ew({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await gi({cdpClient:this.cdpClient,page:r,logger:this.logger}),i=[D(r.evaluate(e,t),{milliseconds:2e3})],s=Array.from(o.childFrames);for(;s.length>0;){let l=s.shift(),c=l.url;c==="about:blank"||c.startsWith("chrome-error://")||(s.push(...l.childFrames),i.push(Nn(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 gi({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(),s,a,l=null;if(this.frameConfig?.type==="url"){if(s=await ln({fn:()=>this.resolveActiveFrameConfig({logger:r,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:r})??void 0,!s)throw new R("ActionFailureError","Got null frame details despite active frame config");a=s.handle,l=a.frameId}else this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")?(a=await ln({fn:()=>gi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:r}),l=null):(a={type:"root",page:i,childFrames:[]},l=null);await ln({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:a.childFrames,frameFilter:s?.frame,logger:r}),codePath:"addIdsToElement",logObject:t,signal:o,logger:r});let c=await ln({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:r}),codePath:"domFetch",logObject:t,signal:o,logger:r}),d=await ln({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:l,childFrames:a.childFrames,logTimings:t,logger:r,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:r}),{tree:p}=await ln({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:d,domGraph:c,startingFrameId:l,frameContext:a,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:zr,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=hb({node:o,domGraph:this.domGraph});return gb(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 fb(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(`[${Ft}="${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 s=r.slice(i).join(" > ");if(this.selectorToNodeMap[s]){o=s;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,s,a,l=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await gi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:r}),s=await this.getMatchingFrameByUrlWithCdp(i,e),r.debug({frameId:s.handle.frameId,url:s.handle.url,src:s.handle.src,locationData:s.handle.locationData},`Found matching frame using ${s.matchType}`);break}catch(c){if(a=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(s)return{source:"url",frame:s.frame,handle:s.handle,frameIdentifierStringified:Pl(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw a}async getMatchingFrameByUrlWithCdp(e,t){let r=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),s=[];for(;i.length>0;){let a=i.shift(),l=a.domNode;i.push(...a.childFrames);let c=wr(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)){s.push({handle:a,matchType:"regex",...await Nn(a,o)});break}}else if(r.trim()===p.trim()){s.push({handle:a,matchType:"url",...await Nn(a,o)});break}}}if(s.length===1){let a=s[0];return this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")||(a.handle.childFrames=[]),a}else throw s.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:s,iconKnowledgeBase:a}){let l=await Cb({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:r,logger:s,cdpClient:this.cdpClient,showZeroOpacityElements:this.showZeroOpacityElements,filterByViewport:e.filterByViewport,viewportDetails:void 0,iconKnowledgeBase:a,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 s=Array.from(t),a=[];for(;s.length>0;){let l=s.shift();s.push(...l.childFrames);let c=async()=>{try{let{frame:d}=await Nn(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...")}};a.push(c())}await Promise.all(a)}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(wr(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let r=wr(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 s of i.computedStyle){if(s.name==="display"&&s.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(s.name==="visibility"&&s.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(s.name==="opacity"&&s.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:s=this.abortSignalGetter()}){let a=[];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 ln({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,signal:s,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:a});if(!g)continue}catch(g){if(g.message.includes("Could not compute box model"))continue;a.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 ln({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,signal:s,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),a.length>0&&this.logger.warn({warnings:a},"Got warnings when fetching the raw a11y graph"),d}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:r}){let o;if(this.allowPartialAccessibilityTree)o=(await ln({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 s=(await ln({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 ln({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:s},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:Tl},timeout:3e3}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await ne(500,t),r.debug({err:s},"Error fetching DOM tree"),i++}if(!o||!o.documents.length)throw new R("InternalWebAgentError","Got empty DOM snapshot with no documents");return mb({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=Zb(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 Mp(n){let e=[],t="";for(let r of n)r==="+"&&t?(e.push(t),t=""):t+=r;return e.push(t),e}function nw(n){return async(e,t)=>{let r=await t.allHeaders();for(let{key:o,value:i,matcher:s}of n)(!s||s.test(t.url()))&&(r[o]=i);await e.continue({headers:r})}}var Np=fi(Dp(),"momentic","chromium"),kM=fi(Dp(),"video"),Nl=process.env.TWO_CAPTCHA_KEY,_p=LM(lw);_p.use(OM({provider:{id:"2captcha",token:Nl},visualFeedback:!0}));var Dn=class n{static USER_AGENT=PM["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:s,baseUrl:a,logger:l,mockedServices:c,userBrowserSettings:d,viewport:p,properties:u,clientCallbacks:m,iconKnowledgeBase:h}){if(jg(d),this.mockedServices=c,this.storage=e,this.flagStore=t,this.enricher=r,this.browser=o,this.context=i,this.page=s,this.baseUrl=a,this.logger=l,this.userControlledBrowserSettings=d,this.viewport=p||Jt,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:eb.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("**/*",nw(this.customHeaders));let r=Promise.all(Object.entries(this.mockedServices).map(([s,a])=>this.context.route(s,l=>a.handle(l)))),o=s=>this.handleNewPageEvent(s);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"&&CM()==="darwin"&&yM("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 Rl.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),await this.initializeScreencast(),this.stateManager=new Ol({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:s,userBrowserSettings:a,contextArgs:l,browserbaseConnectUrl:c,recordVideo:d,iconKnowledgeBase:p,callbacks:u}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let m;switch(a.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||ko,locale:l?.locale||Oo,timezoneId:l?.timezoneId||Mo,colorScheme:l?.colorScheme,httpCredentials:a.basicAuthorization?{username:a.basicAuthorization.username??"",password:a.basicAuthorization.password??""}:void 0,javaScriptEnabled:a.disableJavaScript?!1:void 0,userAgent:a.userAgent??n.USER_AGENT,viewport:l?.viewport??Jt},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,v,x,b={systemDevicePixelRatio:l?.deviceScaleFactor,recordVideo:d,isNewHeadless:!1};(a.browserType==="Chromium"||a.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}`),a.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=a.localChromeExtensionPaths?.map(A=>A.startsWith("~")?fi(Dp(),A.slice(1)):A);if(T?.length){if(a.browserType==="Chrome for Testing")throw new R("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let H of T){let B=fi(H,"manifest.json");if(!kl(B))throw new R("UserConfigurationError",`Chrome extension path ${B} does not exist.`)}let A=fi(Np,`momentic-session-${Date.now()}`);if(!kl(A))try{bM(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 ${Np} folder: ${H}`)}let N=[...f],O=T.map(H=>IM(H)).join(",");N.push(`--disable-extensions-except=${O}`),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}`),v=await lw.launchPersistentContext(fi(Np,`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:a,chromeArgs:N,flags:o.getAllFlags()},"Browser initialization context args (persistent)"),x=v.pages()[0]}else if(c){S=await _p.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");v=A,x=N}else{S=await _p.launch({...h,args:f});let A={...g,baseURL:e,recordVideo:d?{dir:kM}:void 0};v=await S.newContext(A),t.debug({contextArgs:A,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:a,flags:o.getAllFlags()},"Browser initialization context args (standard)"),x=await v.newPage()}let C=new n({browser:S,context:v,page:x,baseUrl:e,logger:t,storage:r,flagStore:o,mockedServices:s||{},enricher:i,userBrowserSettings:a,viewport:g.viewport||Jt,properties:b,clientCallbacks:u,iconKnowledgeBase:p});return await C.initialize(),C}async handleAvailableTabsChangeHelper(){try{let e=await Lp(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=iw(),o=`${e}-${r}`,i=Date.now(),s=!1,a=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],s=!0}};this.pageLoadPromises[o]=a().catch(()=>{}),s&&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()||!Kr(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=iw(),r="new-page-load-handler";e.on("close",s=>this.handlePageClosedEvent(s)),e.on("framenavigated",s=>this.handleFrameNavigationEvent(s)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);e.on("console",s=>{kb(e,o,this.debugData,s,this.logger)}),e.on("request",s=>{Bb(t,this.debugData,s,this.logger),this.recordRequest(s)});let i=async()=>{await Ub(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=Sb({domGraph:t,flagStore:this.flagStore,logger:this.logger,existingHashes:this.iconKnowledgeBase});if(r.forEach(a=>{this.iconKnowledgeBase[a.hash]=a}),!r.length)return;let o=Be(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:EM()};for(let a of["runId","testId"])o[a]&&(i[a]=o[a]);let s={metadata:i,newSvgs:r};this.clientCallbacks.onSvgsCollected(s)}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"||!Kr(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(a){this.logger.warn({err:a},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s},"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(Rp(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,s=0;for(;Date.now()-o<8e3;){s++,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(a){if(i++,i>=3){t.warn({err:a},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await ne(500),s%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 s=await this.screenshotHelper({...e,retries:t});if(s.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(s.length===0)throw new Error("Got empty screenshot");return s}catch(s){if(t<=0||s.message.includes("has been closed"))throw s;return this.logger.debug({err:s,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:s=!1}){s&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let a=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??2e3}),l=Buffer.from(a.data,"base64"),c=await sw.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&&vM(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 sw.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}){$f(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,s;for(let l=0;l<3;l++)try{await this.page.goto(e,{timeout:r,waitUntil:"domcontentloaded"}),i=!0;break}catch(c){if(s=c,this.abortSignal?.throwIfAborted(),this.logger.warn({err:c},`Error occurred during navigation${l===0?", retrying...":" (fatal)"}`),await ne(500),s.message.includes("Timeout")&&s.message.includes("exceeded")||s.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:1e3})}if(!i)throw new R("UserInfrastructureError",s?.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 a=this.url();if(lb.has(a))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 Gb({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(r){let s=Date.now();for(;Date.now()-s<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??Xu}),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(s=>setTimeout(s,250));let i=Date.now();for(;Date.now()-i<1e3;){let s=r.scrollTop;if(s===o)break;o=s,await new Promise(a=>setTimeout(a,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 Al({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 s=i.url();try{this.originsVisited.delete(new URL(s).origin)}catch{}await Mb(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.debug(`Closing tab ${o} with URL ${s}`),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 s=await this.setCookie(i);t=t.concat(s)}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 s of i.localStorage)try{await this.cdpClient.send({timeout:1e3,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:s.name,value:s.value}}),r++}catch(a){this.logger.warn({err:a,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 Ob(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 Lb(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(s=>setTimeout(s,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 Lp(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 s=await this.fetchHtmlAttributes({locator:r,logger:i}),a=!1;for(let l of["generatedSelectors","serializedHtml","nodeOnlySerializedHtml","hybridSelector"]){let c=s?.[l];if(c&&!t[l]){a=!0;break}if(c&&JSON.stringify(c)!==JSON.stringify(t[l])){a=!0;break}}s&&(o||a)&&(t.generatedSelectors=s.generatedSelectors,t.serializedHtml=s.serializedHtml,t.nodeOnlySerializedHtml=s.nodeOnlySerializedHtml,t.hybridSelector=s.hybridSelector)}catch(s){i.warn({err:s},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes(t,r,i)}catch(s){i.debug({err:s},"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:s=0,width:a=0,height:l=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-a)<1&&Math.abs(e.boundingBox.height-l)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-s)<1||!pp.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 Br("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 Br("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 s=this.stateManager.a11yIdToNodeMap[e];if(!s)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 a=this.stateManager.frameConfig,l,c,d,p;if(this.flagStore.isBooleanFlagEnabled("auto_expand_iframes")&&!a&&s.parentFrame){let f=s.parentFrame,{cache:S,config:v}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,d=v,l=v.frame,p="auto iframe"}else s.parentFrame&&a?(d=a,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:s}),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:Qb(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:s,target:m,locator:u,logger:i,forceSaveNewCssSelectors:!0}));try{return{resolution:{locator:u,a11yNode:s,displayString:s.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:s=this.logger,signal:a=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,a)}if(!m)throw u}let l=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(l,s,a);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?s:zr,signal:a});break}catch(m){if(m instanceof Br)break;a?.throwIfAborted(),u&&s.debug({err:m},`Could not resolve target through CSS selectors only (x${d})`),await ne(500,a)}}return p||(p=await this.resolveTargetHelper({root:l,target:t,primaryOnly:!1,skipFetchTree:o,logger:s,signal:a}),t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=Be(s),s.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 Br("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})},s=async()=>{if(t.generatedSelectors)return this.resolveTargetWithCssSelectors({root:e,target:t,logger:r})},[a,l]=await Promise.allSettled([i(),s()]),c,d=[];if(a.status==="fulfilled"&&o==="prefer"&&a.value?.result){c=a.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:
3803
3803
  ${l.value?.logs.join(`
3804
- `)}`,[]);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||n.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"?n.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)?n.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&&n.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...")):n.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:n,forceSaveNewCssSelectors:g}),{a11yNode:m,displayString:p.serializedElement,locator:u,decisions:d}}async resolveTargetHelper({root:e,target:t,primaryOnly:n,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]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:d?.message,selectors:bM(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)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:n,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(n),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 ${n} 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 '${n}' 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:n,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(n&&o&&(!l||!c)){this.logger.debug({oldX:n,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)-(n??0))>200||Math.abs((c??0)-(o??0))>200){this.logger.debug({newX:l,newY:c,oldX:n,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:n,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.";n.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})`;n.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(`[${Nt}="${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}),n.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:n,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"),n.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&&sp.includes(l))try{let c=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,skipSaveToCache:a});return{...c,decisions:[...n,...c.decisions],pageState:void 0}}catch(c){i?.throwIfAborted(),n.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:n,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=IM(),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:n,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,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:1e3})??"",i=Nb.some(a=>a===o.toLowerCase());return await Ep({targetingResult:t,options:{force:n.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,n)}async click(e,t,n={}){return Ep({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),flagStore:this.flagStore})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),kf(s,t,n)){a=!0;break}await ne(500,this.abortSignal)}if(!a)throw new R("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${fd(t)} in ${o}ms.
3805
- 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,n={}){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=n.steps??5;await this.page.mouse.move(i,a,{steps:s}),await ne(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,2e3):500),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(vp);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:n}),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 n=await t.locator.boundingBox({timeout:1e3});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await oo({func:t=>t.locator.focus({timeout: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 n=document.activeElement;n&&n.nodeType===1&&n.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,n=!1){await this.highlight(e.locator),await oo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new 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:n,timeout:3e3})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=Al(e);o!==e&&(this.logger.debug({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async keyDown(e,t){if(t.convertMeta){let n=Al(e);n!==e&&(this.logger.debug({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Ip(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=Al(e);n!==e&&(this.logger.debug({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Ip(e))await this.page.keyboard.up(n)}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"})}async getBrowserState(e){let{logger:t=this.logger,maxAttempts:n=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<n;){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>=n)throw l;t.debug({err:l,url:this.url()},"Error getting a11y tree, retrying...")}}throw new R("ActionFailureError",`Getting page content failed after ${n} attempts. Error: ${s}`)}async getViewportOffsetDetails(e){let[t,n,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:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=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,n,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,n,o){let i=!1,a=Date.now(),s,l={quality:25,retries:0,stabilizeBeforeScreenshot:!0},c=!1,d=0;for(;Date.now()-a<n;){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:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await this.page.mouse.move(e.x,e.y,{steps:3}),await this.page.mouse.down(),await this.page.mouse.move(t.x,t.y,{steps:3}),await ne(n.hoverSeconds?Math.min(n.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,n,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(vp);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:n}),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}),n=await D(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:2e3});process.platform==="darwin"&&n===1&&(n=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 v=0;v<s.length;v++)if(l[v]===e){p=c.indexOf(v);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/=n,m/=n,h/=n,g/=n;let f=u+h/2,S=m+g/2;return{centerX:f,centerY:S}}async scrollVertical(e){return Cp({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 Cp({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 n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await ne(500)}}throw o}async switchToPageHelper(e,t){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new R("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
3806
- Available pages:${JSON.stringify(n.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 n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,t],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}async solveCaptcha(){await this.getBrowserState({});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}),n=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:kl,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!n.ok){let s=`Captcha solver API returned error response: ${n.statusText}`;throw this.logger.error({text:await n.text()},s),new Error(s)}let{taskId:o}=await n.json(),i=Date.now(),a="";for(;Date.now()-i<6e4;){await ne(2500);let s=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:kl,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&&Vb({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,n=(await this.getOpenPages()).map(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>=n.length;c--){let d=s[c];qr(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:s},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(c)});break}n=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,n){this.logger.debug({isClickToRecord:n},"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},n),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(n=>Array.from(n.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:n}){let o=this.pageLoadTimeout,i=e.url();if(i.includes("chrome-error://")){this.logger.warn({url:i,codePath:n},"Skipping load for chrome-error:// URL");return}try{await Vr({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new 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-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return yM.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:n}=await je({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);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 n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t,n){let o=await this.getActivePageOrFrame();return je({root:o,fn:e,arg:t,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=ar}){let i=Ob(),a={code:e,fragment:t,context:n},{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 n;try{n=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 n}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:n}){if(t<0||t>1||n<0||n>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*n),u=d+c,m=p+l;return this.getDomNodeFromPixelPosition(u,m)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:1e3,params:{highlightConfig:rb,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:1e3,method:"Overlay.hideHighlight",params:{backendNodeId:n?.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 n=await this.getActivePageOrFrame(),o=await this.getDomNodeFromPositionPercentages(n,e);return this.getTargetFromBackendNodeId(n,o.backendNodeId,t)}async getTargetFromBackendNodeId(e,t,n){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[Nt],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(`[${Nt}="${i}"]`);if(n){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?.[Nt]??"");if(isNaN(u))continue;let m=e.locator(`[${Nt}="${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,n){try{return await this.scrollIntoView(e),await D(this.performTargetRedirectionHelper(e,t,n),{milliseconds:3e3})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now(),i=await bn(e,t);if(n===void 0&&(n=await e.boundingBox({timeout:1e3})),!n){t.error(`Attempted to click on element with no bounding box: ${i}`);return}let{x:a,y:s,width:l,height:c}=n,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:v}=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}),x=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:x,force:S,logs:v},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:x,force:S,logs:v},"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:x,force:S,logs:v},"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:x,force:S,logs:v},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:x,force:S,logs:v},"Forcing click on original element"),{locator:e,hints:{force:S}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger}){let n=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 n)throw new Error(n.error);return n.warnings.length?t.warn(n,"Got warnings while generating HTML attributes for target"):t.debug(n,"Generated HTML attributes for target"),n.attributes}async moveMouseFromPositionPercentages(e,t){let n=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:n,y:o,button:"left",clickCount:0}}),{x:n,y:o}}async clickMouseFromPositionPercentages(e,t,n){let o=Math.ceil(this.viewport.width*t),i=Math.ceil(this.viewport.height*n);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,n,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:n,y:o}}),{deltaX:i,deltaY:a}}canSolveCaptchas(){return!!kl}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,wp(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Ml(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 n=t?.trim()||xM(e),o=fM(e),i=TM(e),a=rd[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Ml(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await l.setFiles({name:n,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 this.evaluateFunctionInPage(({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:n,base64Data:s,mimeType:a},"set-file-chooser-handler")}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(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(e)}registerRequestRecorder(e,t,n){this.requestRecorders[e]=o=>{t.test(o.url())&&n(o)}}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,n){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:n})}async recordRequest(e){Object.values(this.requestRecorders).forEach(t=>{try{t(e)}catch(n){this.logger.error({err:n,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 WM from"fetch-cookie";import{cloneDeep as VM}from"lodash-es";import{CookieJar as qM}from"tough-cookie";import{z as _t}from"zod";var Soe=_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()}),yoe=_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(r,e={}){let t=await r.getBrowserState(e),n=t.serialize();return e.logger?.debug({tree:n.length>4e5?n.slice(0,4e5):n,activeFrame:r.getActiveFrameConfig()},"Got a11y tree"),{serializedTree:n,tree:t}}var gi=3.1783027;function LM(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);!(n>=48&&n<=57)&&!(n>=65&&n<=90)&&!(n>=97&&n<=122)&&e++}return e}function Ma(r){return Math.ceil(kp(r)/gi)}function kp(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
3807
- `,""),t=t.replaceAll(" ","");let n=LM(t);return t.length-n+gi*n}if(typeof r>"u")return 0;if(typeof r=="number")return String(r).length;if(Array.isArray(r))return r.forEach(t=>{e+=kp(t)}),e;if(typeof r=="object"){let t=r;return Object.keys(t).forEach(n=>{e+=String(n).length,n==="image_url"?(t[n]??{}).detail==="high"?e+=1105*gi:e+=85*gi:e+=kp(t[n])}),e}if(typeof r=="boolean")return r?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof r}': ${r}`)}var tw={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},nw={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:15e3,maxLineLength:500},ew=/<(\S+) id="(\d+)".*?>/g,OM=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,rw=["h1","h2","section","footer","nav","aside","form","label","dialog"],MM=[...rw,"span","div","h3"],kM=["table","select","form","ul","ol","menu","pre","code","dialog"],NM=["table","form","dialog","nav","section","ul","select"];function Np(r){return r.serializedTree.length>r.maxCharacterLength&&(r.logger.warn({serializedTreeLength:r.serializedTree.length},"Serialized condensed tree is too long to chunk, truncating before chunking"),r.serializedTree=r.serializedTree.slice(0,r.maxCharacterLength)),_M(r)}function _M({serializedTree:r,options:e,logger:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=e,s=[],l=r.split(`
3808
- `),c=0,d=[],p=0,u=[],m=[],h=!1;for(;c<l.length;){h&&(s.push({ids:u,content:d.join(`
3809
- `),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 x=Array.from(g.matchAll(ew)).map(O=>O&&O.length>=3?{tagName:O[1],id:O[2]}:void 0).filter(O=>!!O),T=Array.from(g.matchAll(OM)).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 x)u.push(O.id),m.push(O);for(let O of T){let Y=m[m.length-1];Y&&Y.tagName===O&&m.pop()}let A=m.some(O=>kM.includes(O.tagName)),N=l[c+1]??"",L=Ma(N),U=Array.from(N.matchAll(ew)).map(O=>O&&O.length>2?O[1]:void 0).filter(O=>!!O),M=U.some(O=>rw.includes(O)),z=U.some(O=>MM.includes(O));p+L>=i&&(h=!0),p>=n&&(M&&!A||T.some(O=>NM.includes(O)))&&(h=!0),p>=o&&z&&!A&&(h=!0),c++}return d.length&&s.push({ids:u,content:d.join(`
3810
- `),tokenLength:p}),s.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var _p=4e4,Dp=8e4;async function io(r){let{serializedTree:e,logger:t,flagStore:n,softTokenLimit:o=_p}=r;if(Ma(e)<o)return e;let a=n.isBooleanFlagEnabled("rag_v2"),s;a?s=Np({serializedTree:e,options:nw,logger:t,maxCharacterLength:1e6}):s=Np({serializedTree:e,options:tw,logger:t,maxCharacterLength:3e6});try{return a?await D(DM({...r,chunks:s.chunks}),{milliseconds:2e4}):await D(UM({...r,chunkResult:s}),{milliseconds:15e3})}catch(l){t.warn({err:l},"Error executing page filtering, attempting AI keyword fallback");try{return await FM({...r,chunks:s.chunks})}catch(c){return t.warn({err:c},"Error executing page filtering using keyword matching, using naive truncation"),e.slice(0,Dp*gi)}}}async function DM({chunks:r,generator:e,description:t,type:n,logger:o,signal:i,tree:a,softTokenLimit:s=_p,hardTokenLimit:l=Dp}){let c=await e.rankChunksWithAi({chunks:r,description:t,type:n,softTokenLimit:s,hardTokenLimit:l},{abortSignal:i,logger:o,loggerTags:Ue(o)}),d=[];r.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:n,selectedChunks:c,tree:p},"Pruned a11y tree with AI page filtering"),p}async function FM(r){let{type:e,description:t,generator:n,tree:o,logger:i,hardTokenLimit:a=Dp}=r;if(!t.trim())throw new Error("Empty description passed to page filtering");let s=await n.getExtractedKeywords({goal:t},{logger:r.logger,loggerTags:Ue(r.logger)});for(let l of s.keywords){let c=r.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 UM(r){let{description:e,generator:t,tree:n,logger:o,signal:i,chunkResult:a,softTokenLimit:s=_p}=r,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=n.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`))).serialize();return o.debug({browserState:c},"Pruned a11y tree with RAG"),c}}async function Up(r,e){if(!r.description)throw new R("ActionFailureError","Cannot locate element with empty description");return On({action:async()=>BM(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:e.logger})}async function BM(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a}=r,{ctx:s,orgId:l,logger:c,browser:d,localCodeEvalTools:p,generator:u,abortSignal:m,flagStore:h}=e,g=r.description;n&&(g=await Ht({orgId:l,s:g,context:n,logger:e.logger,localTools:p,signal:e.abortSignal,flagStore:h})),a&&(g=zM(g,a));let{serializedTree:f,tree:S}=await vr(d,{filterByViewport:o,abortSignal:m,skipWait:i,logger:c}),v,x=Date.now(),b;for(;!v&&Date.now()-x<3e3;){m.throwIfAborted();try{v=await d.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(O){b=O}}if(!v)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 N=`data:image/jpeg;base64,${v.toString("base64")}`,L=await u.getElementLocation({browserState:T,goal:g,screenshot:N,source:a},{disableCache:t,abortSignal:m,loggerTags:Ue(c)});c.debug({usedRag:C,result:L},"Got locator result");let $=L.id>0;if(s?.details?.push({type:"AI_LOCATION",matched:$,pageState:T,ragUsed:C,thoughts:L.thoughts}),!$)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:N}}var ow="<select> element:",iw="text input or contenteditable element:",aw="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:",sw="Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:",Fp=[ow,iw,aw,sw];function lw(r,e){if(r===e)return!0;for(let t of Fp){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(Fp.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!Fp.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function zM(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${ow} ${r}`;case"TYPE":return`${iw} ${r}`;case"NEGATED_CHECK":return`${aw}
3811
- ${r}`;case"ELEMENT_CHECK":return`${sw}
3812
- ${r}`;default:return r}}var HM=15;async function Bp({command:r,fixtures:e}){if(!r.assertion.trim())throw new R("ActionFailureError","Assertion command is missing the assertion content");let{browser:t,logger:n}=e,o=r.timeout?r.timeout*1e3:t.smartWaitingTimeout,i=jM(o),a=0,s=Date.now(),l,c,d;try{await On({action:()=>t.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:t,logger:n})}catch(u){n.warn({err:u},"Failed to clear highlights before AI check, continuing...")}let p;for(;a<HM&&(!p||p-s<o);){e.abortSignal.throwIfAborted(),a!==0&&(n.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 cw(t,n,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,dw({command:r,state:m,fixtures:e,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:a}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:n,browser:t});if(!u)continue;l=u;break}catch(u){e.abortSignal.throwIfAborted(),d=u instanceof Error?u:new Error(`${u}`),n.info({err:u},`AI check assert attempt ${a} failed, retrying...`)}finally{a++}}if(!l)try{l=await On({action:async()=>dw({command:r,state:await cw(t,n,e.abortSignal),fixtures:e,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:a}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:n,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 cw(r,e,t){let[n,o]=await Promise.all([vr(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function dw({command:r,state:e,fixtures:t,useConsensus:n,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:r.assertion,flagStore:t.flagStore,tree:u,generator:l,logger:s,signal:c}),g!==p&&(d.ragUsed=!0),d.pageState=g;let f={goal:r.assertion,url:h,browserState:g,screenshot:m.toString("base64"),contextChoice:r.contextChoice},v=await(r.contextChoice==="VISION_ONLY"?(x,b)=>l.getVisualAssertionResult(x,b):(x,b)=>l.getAssertionResult(x,b))(f,{useConsensus:n,attemptNumber:i,disableCache:!!r.disableCache,logger:s,abortSignal:c,loggerTags:Ue(s)});if((v.result||o)&&v.relevantElements&&(d.relevantElementsSerialized=v.relevantElements.map(x=>a.getSerializedFormFromA11yId(x)).filter(x=>!!x),await $M(v.relevantElements,a,s)),!v.result)throw new R("AssertionFailureError",v.thoughts);return{succeedImmediately:!1,thoughts:v.thoughts,urlAfterCommand:h,afterScreenshotOverride:m}}function jM(r){let e;return r>10*60*1e3?e=2*60*1e3:r>60*1e3?e=20*1e3:r>10*1e3?e=2*1e3:e=1e3,e}async function $M(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await 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 GM=3e4;async function pw({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??GM/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([p,u])=>p&&u)),s;if(Uo(r.url)&&(s=r.url),t&&Bo(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new R("ActionFailureError",`Invalid URL: ${r.url}`);let c=await D((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.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(r){try{return new RegExp(r)}catch(e){throw new R("UserConfigurationError",`The provided regex expression was invalid: ${e}`)}}async function uw(r){let e=r.postData();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:r.postDataJSON()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function mw(r){let e=await r.text();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:await r.json()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function hw(r){return{request:{url:r.url(),method:r.method(),headers:await r.allHeaders(),...await uw(r)}}}async function gw(r,e){let t=await e.response();if(t)return r.response={status:t.status(),headers:await t.allHeaders(),...await mw(t)},r}async function fw(r){let e=r.request(),t=r.status(),n=r.headers(),o=await mw(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await uw(e)},response:{status:t,headers:n,...o},status:t,headers:n,...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:n,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=n,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:n,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:n,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:n,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:n,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 Up(e,this.getControllerFixtures())}async locateElementWithSelector(e,t){return On({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,flagStore:this.flagStore,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,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:n,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:n,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}),n;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(n=i,this.flagStore.isBooleanFlagEnabled("visual_actions")&&nd(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 n instanceof R?n:new R("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s="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 n({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:n,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)&&!lc(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&&!lw(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&&zu(f);if(!f){let v=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 x=await Up({description:o.elementDescriptor,disableCache:l,iframeUrl:a.iframeUrl,source:u},this.getControllerFixtures(t));x.frameConfig&&this.browser.setActiveFrameConfig(x.frameConfig);let b=a.disableGlobalLocatorRedirect?{locator:x.resolution.locator}:await this.attemptLocatorRedirect(x.resolution.locator,m),T=await i(b),C;if(p){n.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()-v.getTime()}),x.target.targetSource="AI_HEALED",x.target.targetUpdateTime=new Date().toUTCString(),x.target.targetUpdateLoggerTags=Ue(m);let A=x.resolution.pageState;if(A)try{C=await this.getReverseMappedDescription({browserState:A,targetId:x.target.id,disableCache:!0,screenshot:x.screenshot})}catch(N){m.warn({err:N},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:T,elementInteractedDisplayString:x.resolution.displayString,newTarget:{cache:x.target,thoughts:x.thoughts,description:C}}}try{let v=new Date,x=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(x.locator);let b=a.disableGlobalLocatorRedirect?{locator:x.locator}:await this.attemptLocatorRedirect(x.locator,m),T=await i(b);if(S){let C=x.decisions.filter(A=>A.matched);if(C.length!==1)m.warn({decisions:x.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let A=C[0].type;n.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()-v.getTime()})}}return{result:T,elementInteractedDisplayString:x.displayString,newTarget:{cache:f}}}catch(v){this.throwIfClosed();let x=Oh(v)&&!nd(v)&&!ea(v);if(v instanceof R&&!x)throw v;if(h>0&&o)return m.debug({err:v,cache:f},"Failed to execute action with cached target, retrying with AI"),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:s,target:o,cache:void 0,action:i,options:{...a,retriesWithAI:h,targetHealingInProgress:!0}});throw new R("ActionFailureError",v.message,{errOptions:{cause:v}})}}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,n,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(n,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,n,o,i);return this.flagStore.isBooleanFlagEnabled("visual_actions")&&Wu(n)?await this.browser.waitForDOMStability({timeout:2e3}):!this.flagStore.isBooleanFlagEnabled("visual_actions")&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:1e3}),this.options?.autoFollowNewTabs&&await Ay({beforeUrl:s,command:n,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(n,l)}}restoreCommandTemplateReplacements(e,t){sy(e,t)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>yp(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,n,o,i){switch(i=i||"disableCache"in n&&!!n.disableCache,n.type){case"SUCCESS":let a=n.condition;return a?.assertion.trim()?Bp({command:a,fixtures:this.getControllerFixtures(e)}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new R("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new R("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Bp({command:{...n,type:"AI_ASSERTION"},fixtures:this.getControllerFixtures(e)})}case"AI_EXTRACT":{if(!n.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:n.goal,browserState:m,returnSchema:n.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(!Uo(n.url)&&!Bo(n.url,this.browser.baseUrl))throw new R("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let s=await this.browser.solveCaptcha();s&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,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:!!n.useSelector,iframeUrl:n.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(n.target&&xn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:S=>this.browser.hover(S),options:{disableGlobalLocatorRedirect:!0,disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl}});m=f,h.push(g)}switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??this.browser.getViewport().height));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??this.browser.getViewport().height);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??this.browser.getViewport().width));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??this.browser.getViewport().width);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:h}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new R("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new R("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=n.delay*1e3;await ne(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(xn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),h={disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl},{elementInteractedDisplayString:g,newTarget:f,result:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:x=>this.browser.click(x,this.createCallbacksForBrowser(this.orgId),n),options:h});f.cache&&(n.cache={target:f.cache});let v={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return Hs(m,v.urlAfterCommand)&&(v.succeedImmediately=!0,v.succeedImmediatelyReason="URL changed"),v}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(xn(n.fromTarget)&&xn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(xn(n.fromTarget)||xn(n.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:n,targetNames:["from target","to target"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h[0],newTargets:m}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),h=parseInt(n.deltaY),g=n.steps??5;if(isNaN(m)||isNaN(h))throw new R("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&xn(n.target)){await this.browser.mouseDragUsingVisualCoordinates(m,h,g,n.target.pixels,{force:n.force});break}let f,S,v=[];if(n.target?.elementDescriptor){let{newTarget:x,elementInteractedDisplayString:b,result:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async C=>C.locator,options:{useSelector:!!n.useSelector,iframeUrl:n.iframeUrl,disableCache:i}});f=T,S=b,v.push(x)}return await this.browser.mouseDrag(m,h,g,f,{force:n.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:v}}case"SELECT_OPTION":{if(!rr(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,h=n.choice,{newTarget:g,elementInteractedDisplayString:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,h,n.force),options:{disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl,source:Or(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,newTargets:[g]}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let c=await this.browser.setCookie(n.value);this.logger.debug({results:c},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),this.logger.debug({result:m},"Executed JavaScript in browser")):m=await Kn({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.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(n.target&&xn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),h,g=[],f=VM(n.target);if(f){let{elementInteractedDisplayString:v,newTarget:x}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:b=>this.browser.typeIntoTarget(n.value,b,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter}),options:{disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl,disableGlobalLocatorRedirect:!0,source:Or(n)}});g.push(x),h=v}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.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(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:g=>this.browser.hover(g),options:{disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"FOCUS":{if(!rr(n.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:n,target:n.target,cache:n.cache?.target,action:g=>this.browser.focus(g),options:{disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,newTargets:[h]}}case"BLUR":{if(n.target&&!rr(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{newTarget:m,elementInteractedDisplayString:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:g=>this.browser.blur(g),options:{disableCache:i,useSelector:!!n.useSelector,iframeUrl:n.iframeUrl}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,newTargets:[m]}}case"PRESS":let d=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let p={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return Hs(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let m=new qM,h=WM(fetch,m),g;try{g=new URL(n.url).hostname}catch{}return{data:{...await ml({command:n,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 pw({command:n,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return vy({ctx:e,tracer:t,command:n,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(n.fileSource.type==="URL"?(h=n.fileSource.url,m=await bb({uri:n.fileSource.url,logger:this.logger,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(h=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.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:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await Kn({orgId:this.orgId,code:n.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=(n.timeout??En)*1e3,h=await by({command:n,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:n.assertion,browser:this.browser,logger:this.logger,timeout:n.timeout,signal:this.executeAbortController.signal,flagStore:this.flagStore}),frameConfig:n.iframeUrl?{type:"url",url:n.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 ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=Nl(n.pattern),h=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=h.then(async g=>await fw(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[n.key];if(!m)throw new R("ActionFailureError",`No listener registered with key: ${n.key}`);let h=n.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(n.pattern);return this.recordedRequests[n.key]=[],this.browser.registerRequestRecorder(n.key,m,async h=>{try{let g=await hw(h);this.recordedRequests[n.key]?.push(g),await gw(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[n.key];if(!m)throw new R("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:m,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.urlPattern&&(m=Nl(n.urlPattern)),this.browser.setHeader(n.name,n.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"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new Pl({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Ue(this.logger)})}};var KM=4;async function Sw({socket:r,logger:e,analytics:t,storage:n,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:a,devicePixelRatio:s,generatorFactory:l,enricherFactory:c,browserbase:d,authorization:p,flagStoreFactory:u,settingsFactory:m}){let h=r.id,g=r.handshake.query.testId;if(!g)throw new Error("Socket connection request is missing testId");let f=await n.getOrgId({type:"e2e",testId:g});e=e.child({testId:g,orgId:f,sessionId:h});let S=await l(f,e),v=await c(f,e),x=await u(f),b=await m(f,e),{testMetadata:T,baseUrl:C,envName:A,browserConfig:N,environmentVariables:L,localCodeEvalTools:$}=await ao({testId:g,orgId:f,logger:e,storage:n,authorization:p,flagStore:x,settings:b}),U=Z.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=r.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:M,event:"connect",args:r.handshake.query},"Websocket event (connect)"),M&&Z.getCurrentConnectionsByIp(M)>=KM)throw e.error({clientIp:M,sessions:Z.getCurrentSessionsByIp(),...r.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");Z.reserveCapacityByIp(M);try{await YM({socket:r,baseUrl:C,envName:A,testMetadata:T,orgId:f,sessionId:h,logger:e,analytics:t,environmentVariables:L,clientIp:M,devicePixelRatio:s,storage:n,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:a,localCodeEvalTools:$,generator:S,enricher:v,browserbase:d,browserConfig:N,flagStore:x})}catch(z){throw e.warn({err:z},"Error setting up socket session, possibly due to client closing the connection"),Z.releaseCapacityByIp(M),z}return{type:"e2e",sessionId:h,testId:g,orgId:f}}async function YM({socket:r,baseUrl:e,envName:t,devicePixelRatio:n,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:v,flagStore:x}){let b={viewport:o.advanced?.viewport??Vt,locale:o.advanced?.locale??Po,timezoneId:o.advanced?.timezone??Lo,geolocation:o.advanced?.geolocation??Oo,colorScheme:o.advanced?.colorScheme};n&&(b.deviceScaleFactor=n);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:x});s=s.child({orgId:i,sessionId:a,testId:T});let N=!1,L=x.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,s):null,$=await Dn.init({baseUrl:e,userBrowserSettings:A,enricher:v,storage:c,flagStore:x,mockedServices:C,logger:s,contextArgs:b,iconKnowledgeBase:L,callbacks:{onTabsChange:(Y,B)=>{r.emit("tabs",{tabs:Y,activeTab:B})},onScreencastFrame:(Y,B)=>{let J=r;N&&(J=r.compress(!0)),J.emit("screenshot",{buffer:Y},()=>{B()})},onSvgsCollected:Y=>{r.emit("newIconDetected",{numIcons:Y.newSvgs.length}),c.saveNewIcons(i,Y,s)}}});await $.navigate({url:e,initialNavigation:!0});let U=new fi({browser:$,generator:h,logger:s,analytics:l,flagStore:x,orgId:i,options:{scratchPadId:void 0,slowMoMs:A.slowMoMs,autoFollowNewTabs:A.autoFollowNewTabs},storage:c,localCodeEvalTools:m,uploadedFileStorage:d,visualDiffScreenshotStorage:p}),M=ZS(r,a,s),z=async()=>{M.timers.forEach(Y=>clearInterval(Y))},O=new It({baseUrl:e,currentUrl:U.browser.url(),variablesFromEnvironment:g,envName:t});if(!r.connected)throw await $.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");r.emit("session",{url:e,userAgent:Dn.USER_AGENT,viewport:U.browser.getViewport(),sessionId:a}),Z.registerSession({controller:U,context:O,sessionId:a,cleanup:z,clientIp:S})}async function ao({testId:r,orgId:e,logger:t,storage:n,authorization:o,flagStore:i,settings:a}){let s=await n.fetchTestMetadata(r,e,t);if(!s)throw new Error(`Test metadata could not found for test ${r}`);let l;o?.type==="API_KEY"&&(l=new gr({httpClient:new kt({...o,logger:t}),fakerSeed:void 0}));let c=s.envs?.find(g=>g.default),d;c&&(d=await n.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 zp=class{parentTracer=null;socket;step;constructor({step:e,socket:t,parentTracer:n}){this.socket=t,this.parentTracer=n,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 _l({parentStep:this.step,socket:this.socket,parentTracer:this})}},_l=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:n}){this.parentTracer=n,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain()}),new zp({step:e.step,parentTracer:this,socket:this.socket})}},Dl=class{constructor(e,t,n,o,i){this.socket=e;this.storage=t;this.orgId=n;this.testId=o;this.stepsBeforeRun=i}trackStatus(){}attachConsoleLogs(){}attachNetworkLogs(){}async finish(){this.socket.emit("finished")}async startStepList(){return new _l({parentStep:null,parentTracer:null,socket:this.socket})}};var Hp={currentlyExecutingRequests:{}},XM=r=>async(e,t)=>{let{testId:n,orgId:o}=r.metadata,i=await r.flagStoreFactory(o),a=await r.settingsFactory(o,r.logger),s,l=await ao({testId:n,orgId:o,logger:r.logger,storage:r.storage,authorization:r.authorization,flagStore:i,settings:a}),c=`${n}|${l.baseUrl}`;try{let d=Hp.currentlyExecutingRequests[c]??0;Hp.currentlyExecutingRequests[c]=d+1,s=await ZM({...r,...e,...l,done:t})}finally{r.logger.info({result:s,sessionId:r.metadata.sessionId},"Test execution complete"),Hp.currentlyExecutingRequests[c]--}},ZM=async({socket:r,steps:e,baseUrl:t,testMetadata:n,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:v}=l,x=S,b=Z.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:v,sessionId:S,runId:x}),c.info({steps:e.map(Q=>`${Q.type}${"command"in Q?` - ${Q.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,baseUrl:t,context:C,flags:T.flagStore.getAllFlags()},"Socket execution parameters");let A=u??{},N=async()=>{o&&(await T.browser.reset({newUrl:t}),C.reset({baseUrl:t,currentUrl:T.browser.url(),variablesFromEnvironment:A,envName:p}))},L=await g(v),$=async()=>{try{await L.resolveStepCacheEntries({schemaVersion:n.schemaVersion,organizationId:v,testId:f,steps:e,logger:c})}catch(Q){c.error({err:Q},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await aa({promiseGenerator:async()=>Promise.all([N(),$()]),signal:T.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),T.setOpen()}catch(Q){if(r.emit("finished"),Q.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Q}`)}let U=JM(e),M={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},z={orgId:v,runId:x,testMetadata:n,steps:e,fromStep:a,toStep:i},O={controller:T,context:C,storage:s,debugDataStorage:new Fr,codeEvalTools:m,billingReporter:new Do,logger:c,analytics:d},Y={test:{},step:{onDynamicAIActionStatusUpdateEvent:Q=>{r.emit("dynamicCommandStatusUpdate",Q)},onDynamicAIActionEvaluatingEvent:Q=>{r.emit("dynamicCommandEvaluating",Q)},onDynamicCommandGenerated:Q=>{r.emit("dynamicCommandGenerated",Q)},onDynamicCommandExecuted:Q=>{r.emit("dynamicCommandExecuted",Q)}}},B=new Dl(r,s,v,f,U),J=await bl({fixtures:O,options:M,callbacks:Y,inputs:z,testParams:{tracer:B}});return J?.status==="PASSED"&&await ks({logger:c,cacheStorage:L,orgId:v,testId:f,originalSteps:{steps:U},updatedSteps:{steps:e}}),await B.finish(),h?.(J),J.status};var yw={event:"execute",createHandler:XM};import{cloneDeep as QM}from"lodash-es";var ek=r=>async({command:e},t)=>{let{logger:n,generatorFactory:o,metadata:i}=r,a=QM(e),s=tf(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,n)).getLintStepResult({command:a},{logger:n});t?.({result:c})}catch(l){n.error({event:"lint",err:l},"Failed to lint step"),t?.({result:void 0})}}},bw={event:"lintStep",createHandler:ek};var tk=({metadata:r,logger:e,storage:t})=>{let{sessionId:n}=r;return async(o,i)=>{let{description:a,command:s,testMetadata:l,returnScreenshot:c}=o;e.info({params:o},`Locate handler called - ${a}`);let d=Z.getSession(n);if(!d)throw new Error("No active session found");let{controller:p,context:u}=d;p.setOpen();let m=Mo.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:v}=await p.screenshotWithDimensions({clearHighlights:!0,locator:g}),x=await t.uploadScreenshot(f);h.screenshot={data:x,width:S,height:v},e.info({width:S,height:v},"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...")}}},ww={event:"locate",createHandler:tk};var nk=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async({event:n,percentX:o,percentY:i})=>{let a=Z.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(n,o,i)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},vw={event:"mouseClickEvent",createHandler:nk};var rk=({metadata:r,generatorFactory:e,logger:t,socket:n})=>{let{sessionId:o,orgId:i,testId:a}=r;return async({stepId:s,parentStepIdChain:l,attribute:c})=>{let d=Z.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"||(n.emit("targetRecordingUpdate",{type:f,stepId:s,parentStepIdChain:l,command:S.command,attribute:c}),m.abort(),h=!0)};setTimeout(()=>{h||(m.abort(),n.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}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:s,parentStepIdChain:l,attribute:c})}},xw={event:"recordTargetClick",createHandler:rk};var ok=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async({key:n})=>{let o=Z.getSession(t);if(!o)throw new Error("No active session found");if(n==="Dead")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(),await i.browser.keyDown(n,{})}catch(a){if(a.message.includes("has been closed")){e.debug({sessionId:t,err:a},"Browser is closed, ignoring key down socket event error");return}throw a}}},Tw={event:"keyDownEvent",createHandler:ok};var ik=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async({key:n})=>{let o=Z.getSession(t);if(!o)throw new Error("No active session found");if(n==="Dead")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(),await i.browser.keyUp(n,{})}catch(a){if(a.message.includes("has been closed")){e.debug({sessionId:t,err:a},"Browser is closed, ignoring key up socket event error");return}throw a}}},Ew={event:"keyUpEvent",createHandler:ik};var ak=({metadata:r,logger:e})=>{let{sessionId:t}=r,n,o=0,i=(l,c)=>{let d=async()=>{n=void 0};clearTimeout(n),n=setTimeout(d,Math.min(1e3,250*(o+1)))},a,s=0;return async l=>{let c=Z.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")}}},Cw={event:"mouseMoveEvent",createHandler:ak};var sk=({metadata:r,generatorFactory:e,socket:t,logger:n})=>{let{sessionId:o,orgId:i,testId:a}=r;return async({stepId:s})=>{let l=Z.getSession(o);if(!l)throw new Error("No active session found");let{controller:c,browserBehavior:d}=l,p=await e(i,n);n.info("Starting cloud recording");let u=new AbortController,m=await c.startRecordMode({params:{generator:p,logger:n,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}}},Rw={event:"recordingStart",createHandler:sk};var lk=({metadata:r,logger:e})=>{let{sessionId:t}=r;return async()=>{let n=Z.getSession(t);if(!n)throw new Error("No active session found");e.info("Stopping cloud recording"),await n.controller.stopRecordMode(),n.browserBehavior.recordingState=void 0,n.browserBehavior.showOverlay=!1}},Aw={event:"recordingStop",createHandler:lk};var ck=({socket:r,metadata:e,logger:t,storage:n,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:n,authorization:o,flagStore:u,settings:m}),g=Z.getSession(d);if(!g){r.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()},Iw={event:"refresh",createHandler:ck};var dk=({socket:r,metadata:e,logger:t,storage:n,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:n,authorization:o,flagStore:d,settings:p}),g=Z.getSession(l);if(!g){r.emit("error",{message:"No session to reset"});return}let{controller:f,context:S}=g;await f.browser.reset({newUrl:u});let v=f.browser.baseUrl;S.reset({baseUrl:v,currentUrl:f.browser.url(),variablesFromEnvironment:h,envName:m});let x=f.browser.getViewport(),b=Dn.USER_AGENT;t.info({baseUrl:u,viewport:x},`Session reset for test ${s} at ${v}`),r.emit("session",{url:v,userAgent:b,viewport:x,sessionId:l})},Pw={event:"reset",createHandler:dk};var pk=({metadata:r})=>{let{sessionId:e}=r;return async({url:t})=>{let n=Z.getSession(e);if(!n)throw new Error("No active session found");await n.controller.browser.switchToPage({type:"SUBSTRING",substring:t})}},Lw={event:"switchTab",createHandler:pk};async function Ow(r){let{socket:e}=r;return e.handshake.query.type==="api-test"?dy(r):Sw(r)}var Mw=[gy,yw,ww,Pw,Iw,uy,Lw,bw,xw,Rw,Aw,Cw,vw,Tw,Ew,py,QS,hy,my];var kw=r=>{let{logger:e}=r,t=new uk(r.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return t.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await Ow({...r,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}Mw.forEach(i=>mk(i,{socket:n,metadata:o,...r,logger:e}))}),t},mk=(r,e)=>{let t=r.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(r.event)||e.logger.debug({...e.metadata,event:r.event,args:o},`Websocket event (${r.event})`);let i=a=>{e.logger.error({event:r.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(r.event,n)};import{Router as Tk}from"express";import Wp from"fs";import yk from"path";import _w,{multistream as hk}from"pino";import gk from"pino-pretty";var Nw=["lastScreenshotBuffer"];var jp=new Map,fk=!0,$p=class r{consoleLogger;ddClientToken;hostname;bindingAttributes;disableConsoleLogs;site="https://http-intake.logs.us5.datadoghq.com/api/v2/logs";constructor({bindings:e,clientToken:t,hostname:n,disableConsoleLogs:o}){this.ddClientToken=t,this.hostname=n,this.disableConsoleLogs=o,this.bindingAttributes={...e,env:"production"};let i={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=fk?_w(i):_w(i,hk([{stream:gk({colorize:!0})}]))}child(e){return new r({clientToken:this.ddClientToken,bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs})}flush(e){this.disableConsoleLogs||this.consoleLogger.flush(e)}log(e,t,n,...o){if(t&&n===void 0&&(n=`${t}`,t={}),this.disableConsoleLogs||this.consoleLogger[e](e==="error"?t:{testId:t.testId,runId:t.runId},n,...o),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error){let a={};for(let s of Object.getOwnPropertyNames(t.err))Nw.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:n||"",...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:n,args:o,err:a},"Failed to log to Datadog")}})()}debug(e,t,...n){this.log("debug",e,t,...n)}info(e,t,...n){this.log("info",e,t,...n)}warn(e,t,...n){this.log("warn",e,t,...n)}error(e,t,...n){this.log("error",e,t,...n)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){this.consoleLogger.level=e}enableConsoleLogs(){this.disableConsoleLogs=!1}},Fl=({app:r,clientToken:e,hostname:t,disableConsoleLogs:n})=>{if(!process.env.DD_CLIENT_TOKEN&&!process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN&&!e)throw new Error("Missing DD_CLIENT_TOKEN");return jp.has(r)||jp.set(r,new $p({bindings:{app:r},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:n})),jp.get(r)};import{hostname as Sk}from"os";var $e=Fl({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:Sk(),disableConsoleLogs:!0}),Dw=r=>{$e.addBinding("version",r)};var bk=new cl(30,60*1e3),Kp="https://api.momentic.ai",Yp,Gp,Fw=r=>{Kp=r},Ul=()=>Kp,Uw=(r,e)=>{Yp=r,Gp?.abort(),Gp=new AbortController;let t=Gp.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=yk.resolve(r.rootDir,o.envFile);try{if(Wp.lstatSync(i).isSymbolicLink())return;Wp.existsSync(i)&&n.push(i)}catch(a){$e.warn({err:a},`Failed to check if env file ${i} exists`)}});try{wk({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){$e.error({err:o},"Failed to start config file watchers")}},ie=()=>Yp,Si,Vp,qp,Bw=async r=>{if(Si)return Si;let e=new lt({baseUrl:Kp,apiKey:r,logger:$e});try{let t=await e.getAuthInfo();return Si=t.orgId,Vp=t.userId,qp=r,Si}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},xr=()=>{if(!Si)throw new Error("Your organization ID is invalid.");return Si},Bl=()=>{if(!Vp)throw new Error("Your user ID is invalid.");return Vp},zw=()=>{if(!qp)throw new Error("Your API key is invalid.");return qp};function wk({filesToWatch:r,revalidator:e,signal:t,project:n}){r.forEach(o=>{Wp.watch(o,{signal:t,persistent:!1,recursive:!1},(i,a)=>{a&&(bk.increment("setLocalProject")&&y.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Yp=e(n.configFilePath))})})}var zl=class extends ii{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async getOrgId(t){return this.orgId}async fetchTestMetadata(t,n,o){let i=ie(),s=we(i,o).tests[t];if(s)return $s(s.relativePath,i)}async fetchApiTestMetadata(t,n,o){throw new Error("API tests are not available in the desktop app")}async fetchEnvironment(t,n,o){let i=ie();return ca(n,i,Br)}async fetchIconKnowledgeBase(t,n){try{return await this.client.fetchIconKnowledgeBase(t,n)}catch(o){return n.error({err:o},"Failed to fetch icon knowledge base"),null}}async fetchCloudOrgSettings(t,n){}};function ce(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}import{Router as vk}from"express";import Hw from"fs";import xk from"path";var ka=vk();async function Jp(r){return(await js(r,$e)).map(n=>{let o=r.modules[n.moduleId];if(!o){y.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}ka.get("/",ce(async(r,e)=>{let t=ie(),n=we(t,y),o=await Jp(n);e.status(200).json(o)}));ka.post("/",ce(async(r,e)=>{let t;try{t=zh.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{_o(t.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=ie(),o=we(n,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=xk.join(n.rootDir,t.folderPath??"");if(!Hw.existsSync(i)||!Hw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await Ff({...t,folder:i,project:n});e.status(201).json(a)}));ka.get("/:moduleId",ce(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=we(ie(),y),n=t.modules[r.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await bd(n,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));ka.patch("/:moduleId/metadata",ce(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Hh.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=ie(),o=we(n,y);Df({moduleId:r.params.moduleId,content:t,momenticFiles:o,logger:y,project:n}),e.status(201).json({message:"ok"})}));var jw=ka;var $w=Tk();$w.get("/",ce(async(r,e)=>{let t=ie(),n=we(t,y),o=new Set;n?.tests&&Object.values(n.tests).forEach(c=>{c.labels?.forEach(d=>o.add(d))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await Jp(n),l={labels:i,tests:a,modules:s};e.status(200).json(l)}));var Gw=$w;import{Router as Ek}from"express";var Xp=Ek();Xp.get("/",ce((r,e)=>{let t=jf(ie(),$e);e.status(200).json(t)}));Xp.get("/names",ce((r,e)=>{let n=ie().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var Ww=Xp;import{Router as Ck}from"express";import gt from"fs";import rt from"path";var _a=Ck();function Na(r){let e=ie(),t=rt.dirname(e.configFilePath);return rt.join(t,...r)}function Rk(r){let e=ie(),t=rt.dirname(e.configFilePath),n=rt.relative(t,r);return n?n.split(rt.sep):[]}function Ak(r,e){let t=gt.statSync(r),n=Rk(r);return od.parse({name:e,absolutePath:r,relativePath:n.join(rt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}_a.post("/",ce(async(r,e,t)=>{let n;try{n=Gh.parse(r.body).pathSegments}catch(l){e.status(400).json({error:`Failed to parse folder read body: ${l}`});return}let o=Na(n);if(!gt.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(rt.sep)}`});return}if(!gt.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(rt.sep)}`});return}let a=gt.readdirSync(o).map(l=>{let c=rt.join(o,l);return Ak(c,l)}),s={absolutePath:o,pathSegments:n,contents:a};e.status(200).json(s)}));_a.put("/",ce(async(r,e,t)=>{let n;try{n=Wh.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Na(n);if(gt.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(rt.sep)}`,pathSegments:n});return}gt.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(rt.sep)}`,pathSegments:n};e.status(201).json(i)}));_a.patch("/",ce(async(r,e,t)=>{let n,o;try{let c=Vh.parse(r.body);n=c.pathSegments,o=c.newPathSegments}catch(c){e.status(400).json({error:`Failed to parse folder update body: ${c}`});return}let i=Na(n),a=Na(o);if(!gt.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.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 ${n.join(rt.sep)} to ${o.join(rt.sep)}`,pathSegments:o};e.status(200).json(l)}));_a.delete("/",ce(async(r,e,t)=>{let n,o=!0;try{let l=qh.parse(r.body);n=l.pathSegments,o=l.recursive??!0}catch(l){e.status(400).json({error:`Failed to parse folder delete body: ${l}`});return}let i=Na(n);if(!gt.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(rt.sep)}`,pathSegments:n});return}if(!gt.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.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: ${n.join("/")}`});return}gt.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Vw=_a;import{Router as Ik}from"express";var qw=Ik();qw.get("/",ce((r,e)=>{e.status(200).json({userId:Bl(),orgId:xr()})}));var Kw=qw;import{Router as Pk}from"express";var Yw=Pk();Yw.get("/",ce((r,e)=>{let t=ie(),n=we(t,y),o=new Set;n?.tests&&Object.values(n.tests).forEach(a=>{a.labels?.forEach(s=>o.add(s))});let i=Array.from(o).sort();e.status(200).json(i)}));var Jw=Yw;import{Router as Lk}from"express";var Hl=Lk();Hl.get("/",ce((r,e)=>{let t=qd().map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(t)}));Hl.get("/current",ce((r,e)=>{let t=ie(),n={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(n)}));Hl.post("/set",ce((r,e)=>{let t;try{t=$h.parse(r.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=nn({configFilePath:t.configFilePath});Uw(n,o=>nn({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var Xw=Hl;import{Router as Ok}from"express";var Zw=Ok();Zw.get("/",ce((r,e)=>{let n={ai:ie().config.ai};e.status(200).json(n)}));var Qw=Zw;import{Router as Nk}from"express";import ev from"fs";import so from"path";import{v4 as tv}from"uuid";import _k from"yaml";import{randomUUID as Mk}from"node:crypto";import{PostHog as kk}from"posthog-node";var yi=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},bi=class r{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new kk("phc_oy1FexHsc0S3axxOMXCm46yZsW35zROAoV4SOzpDSXH",{host:"https://us.i.posthog.com",...t})}async shutdown(){await this.client.shutdown()}identify(e){return this.bindings={...this.bindings,...e},this}child(e){return new r({...this.bindings,...e},this.options)}track(e,t){if(!hh(this.bindings))return console.error(`Cannot track ${e.type} event without required bindings.`,this.bindings),this;let{type:n,...o}=e;return this.client.capture({distinctId:Mk(),event:n,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var wi=new bi({platform:"local_app"},{flushAt:1,flushInterval:0});var Tr=Nk();Tr.get("/",ce((r,e)=>{let t=ie(),n=we(t,y),o=Object.values(n.tests);e.status(200).json(o)}));Tr.post("/",ce(async(r,e)=>{let t;try{t=Uh.parse(r.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}try{_o(t.name)}catch(p){e.status(400).json({error:p.message});return}let o={id:tv(),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 Bf({test:o,name:t.name,folder:l}),d={...o,relativeFilePath:so.relative(i.rootDir,c)};wi.track({type:"test_editor:test_create"}),e.status(201).json(d)}));Tr.get("/:testPath",ce(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n=ie(),o=we(n,y),i;try{i=await la(so.join(n.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:n})}),Wn({relativeTestPath:t,steps:a,schemaVersion:_e,project:n})}catch(a){$e.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Tr.patch("/:testPath/metadata",ce(async(r,e)=>{if(!r.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Fh.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:wd(r.params.testPath,t,ie()).newRelativeTestPath};e.status(200).json(o)}));Tr.patch("/:testPath",ce(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=Dh.parse(r.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:n.stepLists,cacheCreationParams:{testId:a.id,orgId:xr()}}),d=new lt({apiKey:zw(),baseUrl:Ul(),logger:$e}),p=await ri($e,d,o);await ci({client:d,gitMetadata:p}).saveStepCacheEntries(c,a.id,$e),l.forEach(m=>{Yr({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),Wn({relativeTestPath:t,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Tr.patch("/:testPath/environments",ce(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=jh.parse(r.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}wd(t,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},ie()),e.status(201).json({message:"ok"})}));Tr.post("/:testPath/duplicate",ce(async(r,e)=>{let{testPath:t}=r.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=Bh.parse(r.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{_o(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=ie(),i=so.join(o.rootDir,t);if(!ev.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=tv(),c=Xt.parse({...s,name:n.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,`${n.name}.${Mt.TEST}`),h=_k.stringify(p);ev.writeFileSync(m,h,"utf-8");let g={relativeFilePath:so.relative(o.rootDir,m)};wi.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var nv=Tr;var Da=class{async prepareGoldenScreenshotForComparison(e,t,n){return await new ti(ie(),!1).prepareGoldenScreenshotForComparison(e,t,n)}};async function av(r){let{momenticServerUrl:e,apiKey:t,serverPort:n,staticDir:o,devicePixelRatio:i,version:a,logger:s=$e,alwaysSaveCache:l,noCache:c}=r;Dw(a),e&&Fw(e),await Bw(t);let d=xr(),p=Bl();wi.identify({user_id:p,org_id:d}),s.debug({params:r,orgId:d,userId:p},"Desktop server init and api key check done");let u=jk(o,n,s),m=`http://localhost:${n}`;y.info(`Desktop server is running at ${m}`),await new Promise(T=>{try{u.listen(n,()=>{s.info(`Desktop server is running at ${m}`),T()})}catch(C){C.message.includes("EADDRINUSE")?sv(n):y.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Ul(),apiKey:t,logger:s},f=async()=>{let T=ie();return new si(T.config.ai?.agentConfig,g)},S=async()=>new li(g,await f()),v=new lt(g),x=new zl(v,xr()),b=new Da;kw({baseServer:u,generatorFactory:f,enricherFactory:S,cacheStorageFactory:async()=>{let T=ie(),C=await ri(s,v,T);return ci({client:v,gitMetadata:C,alwaysSaveCache:l,noCache:c})},flagStoreFactory:async T=>{let C=ie();return new ni(C.config)},settingsFactory:async()=>{let T=ie();return{ai:{},browser:{},...T.config}},storage:x,logger:s,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:b,analytics:wi})}var iv="25mb";function jk(r,e,t){let n=ov();n.use(Dk()),n.use(rv.json({limit:iv})),n.use(rv.urlencoded({extended:!1,limit:iv}));let o=Bk();if(o.use("/tests",nv),o.use("/modules",jw),o.use("/environments",Ww),o.use("/projects",Xw),o.use("/labels",Jw),o.use("/folders",Vw),o.use("/settings",Qw),o.use("/identify",Kw),o.use("/entities",Gw),n.use("/api",o),n.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()}),n.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}
3813
- ${a.stack}`),l.status(500).send("Internal Server Error")}),r){let a=ov.static(r,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(s,l)=>{l.sendFile(Hk.join(r,"index.html"))})}let i=zk.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(sv(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}Uk.setMaxListeners(50);process.on("warning",r=>{$e.warn({err:r},`Node warning received on desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{$e.error({err:r},"Uncaught exception leading to exit on desktop-server"),y.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",(r,e)=>{$e.error({reason:`${r}`,promise:`${e}`,stack:r?.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: ${r}`)});function sv(r){y.error(Fk`Port ${r} is already in use by another process. Please close the other process and try again.
3804
+ `)}`,[]);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&&(a.status==="rejected"?r.warn({err:a.reason,cssResult:"value"in l?l.value:void 0,hybridMode:o},"Hybrid selector resolution rejected, continuing..."):a.value?.result?"value"in l&&l.value?.result&&a.value.result.serializedElement!==l.value.result.serializedElement&&(this.flagStore.isBooleanFlagEnabled("visual_actions")&&JSON.stringify(l.value.result.mPath)!==JSON.stringify(a.value.result.mPath)?r.warn({hybridResult:a.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!==a.value.result.dataMomenticId&&r.warn({hybridResult:a.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:a.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:s,skipSaveToCache:a}){let l=[],c;o||(c=(await this.getBrowserState({logger:i,abortSignal:s,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:TM(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:s,skipSaveToCache:a});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:s=this.smartWaitingTimeout}=e,a=await this.getActivePageOrFrame(),l=Date.now(),c=0,d,p=[];for(;Date.now()-l<s;){i?.throwIfAborted(),c++;let u=a.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:s}=e.target.boundingBox,a=await t.locator.boundingBox({timeout:1e3});if(!a){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}=a;if(Math.abs(d-i)>50||Math.abs(p-s)>50){this.logger.debug({newW:d,oldW:i,newH:p,oldH:s,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:s}){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 $e({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(`[${Ft}="${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"),s||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 a=t.screenshotUrl,l=t.role??"";if(a&&pp.includes(l))try{let c=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:a,signal:i,skipSaveToCache:s});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:a}),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 s;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(t)).arrayBuffer(),d=MM(),p=await this.enricher.runTemplateMatching({id:d,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.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 s="Rejecting target from screenshot due to no bounding box",new Error(s);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=$b.some(s=>s===o.toLowerCase());return await Ip({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 Ip({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(),s=!1,a=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),a=this.url(),jf(a,t,r)){s=!0;break}await ne(500,this.abortSignal)}if(!s)throw new R("ActionFailureError",`The active page URL ${r?.negated?"still does":"does not"} ${wd(t)} in ${o}ms.
3805
+ Current tab: ${a}`);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,s=o.y+o.height/2,a=r.steps??5;await this.page.mouse.move(i,s,{steps:a}),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(Cp);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 io({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 io({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 io({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 io({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=Il(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 keyDown(e,t){if(t.convertMeta){let r=Il(e);r!==e&&(this.logger.debug({keyString:e,convertedKey:r},"Converted platform dependent keys"),e=r)}for(let r of Mp(e))await this.page.keyboard.down(r)}async keyUp(e,t){if(t.convertMeta){let r=Il(e);r!==e&&(this.logger.debug({keyString:e,convertedKey:r},"Converted platform dependent keys"),e=r)}for(let r of Mp(e))await this.page.keyboard.up(r)}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 s=0,a;for(;s<r;){s++;try{return await D(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:i,logger:t,filterByViewport:e.filterByViewport}),{milliseconds:this.pageLoadTimeout*s,signal:i,message:"Getting browser state took too long"})}catch(l){if(i?.throwIfAborted(),a=l instanceof Error?l.message:`${l}`,s>=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: ${a}`)}async getViewportOffsetDetails(e){let[t,r,o,i,s]=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??s}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:r=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},s=u=>{i.value=Date.now()},a=()=>s("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",a);let l=()=>s("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>l);let c=()=>s("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",c);let d=()=>s("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",d);let p=()=>s("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",p);try{await this.waitForDOMStabilityHelper(i,t,r,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",a),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,s=Date.now(),a,l={quality:25,retries:0,stabilizeBeforeScreenshot:!0},c=!1,d=0;for(;Date.now()-s<r;){if(o?.throwIfAborted(),await ne(500,this.abortSignal),a)try{let u=await this.screenshot(l);if(!u.equals(a)){a=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{a=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()-s,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(Cp);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,s=o.nodes,a=s.nodeName||[],l=s.backendNodeId||[],c=i.nodeIndex,d=i.bounds,p=-1;for(let v=0;v<a.length;v++)if(l[v]===e){p=c.indexOf(v);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 Pp({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 Pp({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(s){this.logger.warn({err:s},"Error switching to page, retrying..."),o=s,await ne(500)}}throw o}async switchToPageHelper(e,t){let r=this.context.pages().map((i,s)=>({page:i,url:i.url(),index:s})),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(s=>s.url))}`);o=r[i]}else{let i=r.filter(s=>e.type==="SUBSTRING"?s.url.includes(e.substring):s.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(s=>s.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
3806
+ Available pages:${JSON.stringify(r.map(i=>i.url))}`);if(!Kr(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=Ta(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,s])=>{i&&localStorage.setItem(i,s||"")},[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 a of Object.values(this.stateManager.a11yIdToNodeMap))if(a.role==="image"&&a.name.toLowerCase().includes("captcha")){if(!a.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,a.backendNodeId);break}if(!e){let a=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!a.captchas||!a.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:Nl,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!r.ok){let a=`Captcha solver API returned error response: ${r.statusText}`;throw this.logger.error({text:await r.text()},a),new Error(a)}let{taskId:o}=await r.json(),i=Date.now(),s="";for(;Date.now()-i<6e4;){await ne(2500);let a=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Nl,taskId:o})});if(!a.ok){let c=`Captcha solution API returned error response: ${a.statusText}`;throw this.logger.error({text:await a.text()},c),new Error(c)}let l=await a.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"){s=l.solution.text;break}}if(!s)throw new Error("Captcha solution timed out");return s}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&&tw({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(a=>a.url),o=0,i=!1,s=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let a;try{a=(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=a.length-1;c>=r.length;c--){let d=a[c];Kr(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:r,currentUrl:l,newOpenPages:a},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(c)});break}r=a};t=setInterval(async()=>{if(!i){i=!0;try{await s()}catch(a){this.logger.error({err:a},"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 qr({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(s){let a=s;if(a.name==="AbortError")throw new R("UserInfrastructureError",`The page with URL ${He(i,50)} did not load within the configured timeout (${o}ms): ${a}`);if(!a.message.includes("detached"))throw a}try{await qr({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${r}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(s){this.logger.warn({err:s,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 xM.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=ar}){let i=zb(),s={code:e,fragment:t,context:r},{result:a}=await D(this.page.evaluate(i,s),{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 a}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:s,leftBound:a}=await this.getViewportOffsetDetails(e),l=Math.round(s),c=Math.round(a),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:ub,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[Ft],s=parseInt(i??"");if(!i||isNaN(s))throw new Error("No data-momentic-id was found on the DOM node");let a=e.locator(`[${Ft}="${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:a,forceSaveNewCssSelectors:!0}),this.logger.debug({target:u},"Tied backend id to existing a11y node"),{target:u,locator:a}}let d=El(`${i}`,this.stateManager.domGraph,this.logger);for(let p of d){let u=parseInt(p.attributes?.[Ft]??"");if(isNaN(u))continue;let m=e.locator(`[${Ft}="${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:a,logger:this.logger}),c={id:-1,dataMomenticId:s,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:c},"Tied backend id to html node"),{target:c,locator:a}}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:s,y:a,width:l,height:c}=r,d=this.getViewport();if(s<0||a<0||s+l>d.width||a+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:v}=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}),x=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:x,force:S,logs:v},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:x,force:S,logs:v},"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:x,force:S,logs:v},"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:x,force:S,logs:v},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:x,force:S,logs:v},"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 s=window;return s.generateHtmlCacheAttributes?s.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),s=Math.ceil(this.viewport.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:i,deltaY:s,x:r,y:o}}),{deltaX:i,deltaY:s}}canSolveCaptchas(){return!!Nl}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,Ep(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!kl(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()||RM(e),o=wM(e),i=AM(e),s=sd[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!kl(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:ib.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 a=o.toString("base64");await this.evaluateFunctionInPage(({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:a,mimeType:s},"set-file-chooser-handler")}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 YM from"fetch-cookie";import{cloneDeep as JM}from"lodash-es";import{CookieJar as XM}from"tough-cookie";import{z as Ut}from"zod";var xoe=Ut.object({doubleClick:Ut.boolean().optional(),rightClick:Ut.boolean().optional(),force:Ut.boolean().optional(),waitForDownload:Ut.boolean().optional(),delayMs:Ut.number().optional(),downloadTimeoutMs:Ut.number().optional(),relativePosition:Ut.object({x:Ut.number(),y:Ut.number()}).optional()}),Toe=Ut.object({repeat:Ut.number().optional(),convertMeta:Ut.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Ut.number().optional()});async function xr(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 Si=3.1783027;function NM(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 ks(n){return Math.ceil(Fp(n)/Si)}function Fp(n){let e=0;if(typeof n=="string"){let t=n;t=t.replaceAll(`
3807
+ `,""),t=t.replaceAll(" ","");let r=NM(t);return t.length-r+Si*r}if(typeof n>"u")return 0;if(typeof n=="number")return String(n).length;if(Array.isArray(n))return n.forEach(t=>{e+=Fp(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*Si:e+=85*Si:e+=Fp(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 dw={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},pw={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:15e3,maxLineLength:500},cw=/<(\S+) id="(\d+)".*?>/g,_M=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,uw=["h1","h2","section","footer","nav","aside","form","label","dialog"],DM=[...uw,"span","div","h3"],FM=["table","select","form","ul","ol","menu","pre","code","dialog"],UM=["table","form","dialog","nav","section","ul","select"];function Up(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)),BM(n)}function BM({serializedTree:n,options:e,logger:t}){let{minChunkTokenCount:r,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:s}=e,a=[],l=n.split(`
3808
+ `),c=0,d=[],p=0,u=[],m=[],h=!1;for(;c<l.length;){h&&(a.push({ids:u,content:d.join(`
3809
+ `),tokenLength:p}),d=[],p=0,u=m.length?[m[m.length-1].id]:[],h=!1);let g=l[c],f=ks(g);p+=f,g.length>s&&(g=g.slice(0,s));let x=Array.from(g.matchAll(cw)).map(L=>L&&L.length>=3?{tagName:L[1],id:L[2]}:void 0).filter(L=>!!L),T=Array.from(g.matchAll(_M)).map(L=>L&&(L[2]||L[4])).filter(L=>!!L);T.reverse();let C=g.replace(/ id="[0-9]+"/g,"");d.push(C);for(let L of x)u.push(L.id),m.push(L);for(let L of T){let Y=m[m.length-1];Y&&Y.tagName===L&&m.pop()}let A=m.some(L=>FM.includes(L.tagName)),N=l[c+1]??"",O=ks(N),B=Array.from(N.matchAll(cw)).map(L=>L&&L.length>2?L[1]:void 0).filter(L=>!!L),M=B.some(L=>uw.includes(L)),U=B.some(L=>DM.includes(L));p+O>=i&&(h=!0),p>=r&&(M&&!A||T.some(L=>UM.includes(L)))&&(h=!0),p>=o&&U&&!A&&(h=!0),c++}return d.length&&a.push({ids:u,content:d.join(`
3810
+ `),tokenLength:p}),a.forEach((g,f)=>{t.debug({chunk:g},`Chunk for page filtering (index ${f+1}/${a.length})`)}),{chunks:a}}var Bp=4e4,zp=8e4;async function so(n){let{serializedTree:e,logger:t,flagStore:r,softTokenLimit:o=Bp}=n;if(ks(e)<o)return e;let s=r.isBooleanFlagEnabled("rag_v2"),a;s?a=Up({serializedTree:e,options:pw,logger:t,maxCharacterLength:1e6}):a=Up({serializedTree:e,options:dw,logger:t,maxCharacterLength:3e6});try{return s?await D(zM({...n,chunks:a.chunks}),{milliseconds:2e4}):await D(jM({...n,chunkResult:a}),{milliseconds:15e3})}catch(l){t.warn({err:l},"Error executing page filtering, attempting AI keyword fallback");try{return await HM({...n,chunks:a.chunks})}catch(c){return t.warn({err:c},"Error executing page filtering using keyword matching, using naive truncation"),e.slice(0,zp*Si)}}}async function zM({chunks:n,generator:e,description:t,type:r,logger:o,signal:i,tree:s,softTokenLimit:a=Bp,hardTokenLimit:l=zp}){let c=await e.rankChunksWithAi({chunks:n,description:t,type:r,softTokenLimit:a,hardTokenLimit:l},{abortSignal:i,logger:o,loggerTags:Be(o)}),d=[];n.forEach((u,m)=>{c.indices.includes(m)&&(d=d.concat(u.ids))});let p=s.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 HM(n){let{type:e,description:t,generator:r,tree:o,logger:i,hardTokenLimit:s=zp}=n;if(!t.trim())throw new Error("Empty description passed to page filtering");let a=await r.getExtractedKeywords({goal:t},{logger:n.logger,loggerTags:Be(n.logger)});for(let l of a.keywords){let c=n.chunks.filter(m=>m.content.toLowerCase().includes(l.toLowerCase()));if(!c.length||c.reduce((m,h)=>m+h.tokenLength,0)>s&&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 jM(n){let{description:e,generator:t,tree:r,logger:o,signal:i,chunkResult:s,softTokenLimit:a=Bp}=n,l=await t.rankChunksWithRag({description:e,chunks:s.chunks,tokenLimit:a},{abortSignal:i,logger:o,loggerTags:Be(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 jp(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:s}=n,{ctx:a,orgId:l,logger:c,browser:d,localCodeEvalTools:p,generator:u,abortSignal:m,flagStore:h}=e,g=n.description;r&&(g=await Gt({orgId:l,s:g,context:r,logger:e.logger,localTools:p,signal:e.abortSignal,flagStore:h})),s&&(g=GM(g,s));let{serializedTree:f,tree:S}=await xr(d,{filterByViewport:o,abortSignal:m,skipWait:i,logger:c}),v,x=Date.now(),b;for(;!v&&Date.now()-x<3e3;){m.throwIfAborted();try{v=await d.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(L){b=L}}if(!v)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 so({type:"locator",description:g,serializedTree:f,flagStore:e.flagStore,tree:S,logger:c,generator:u}),T!==f&&(C=!0);let N=`data:image/jpeg;base64,${v.toString("base64")}`,O=await u.getElementLocation({browserState:T,goal:g,screenshot:N,source:s},{disableCache:t,abortSignal:m,loggerTags:Be(c)});c.debug({usedRag:C,result:O},"Got locator result");let H=O.id>0;if(a?.details?.push({type:"AI_LOCATION",matched:H,pageState:T,ragUsed:C,thoughts:O.thoughts}),!H)throw new R("ActionFailureError",`Could not find any relevant element: ${O.thoughts}`);let{resolution:B,target:M,frameConfig:U}=await d.createTargetFromA11yId({id:O.id,description:g,targetSource:"AI",logger:c});if(B.a11yNode?.properties?.hidden&&B.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: ${B.displayString}`);return{thoughts:O.thoughts,target:M,resolution:B,frameConfig:U,screenshot:N}}var mw="<select> element:",hw="text input or contenteditable element:",gw="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:",fw="Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:",Hp=[mw,hw,gw,fw];function Sw(n,e){if(n===e)return!0;for(let t of Hp){if(!n.startsWith(t))continue;let r=n.slice(t.length).trim();if(Hp.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===r)||r===e.trim())return!0}return!!Hp.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===n.trim())}function GM(n,e){if(!n||!e)return n;switch(e){case"SELECT_OPTION":return`${mw} ${n}`;case"TYPE":return`${hw} ${n}`;case"NEGATED_CHECK":return`${gw}
3811
+ ${n}`;case"ELEMENT_CHECK":return`${fw}
3812
+ ${n}`;default:return n}}var WM=15;async function $p({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=VM(o),s=0,a=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(;s<WM&&(!p||p-a<o);){e.abortSignal.throwIfAborted(),s!==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 yw(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,bw({command:n,state:m,fixtures:e,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:s}))},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 ${s} failed, retrying...`)}finally{s++}}if(!l)try{l=await On({action:async()=>bw({command:n,state:await yw(t,r,e.abortSignal),fixtures:e,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:s}),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{s++}if(!l){let u=`AI check still failing after ${s} attempts.`;throw d&&(u+=` Latest result: ${d.message}`),new R("AssertionFailureError",u,{lastScreenshotBuffer:c?.screenshotBuff})}return l}async function yw(n,e,t){let[r,o]=await Promise.all([xr(n,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),n.screenshot({retries:1,respectActiveFrame:!0})]);return{...r,screenshotBuff:o}}async function bw({command:n,state:e,fixtures:t,useConsensus:r,highlightElementsOnFailure:o,attemptNumber:i}){let{browser:s,logger:a,generator:l,abortSignal:c}=t,d={type:"ASSERTION"},{serializedTree:p,tree:u}=e,m=e.screenshotBuff,h=s.url(),g=p;g=await so({type:"assertion",serializedTree:p,description:n.assertion,flagStore:t.flagStore,tree:u,generator:l,logger:a,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},v=await(n.contextChoice==="VISION_ONLY"?(x,b)=>l.getVisualAssertionResult(x,b):(x,b)=>l.getAssertionResult(x,b))(f,{useConsensus:r,attemptNumber:i,disableCache:!!n.disableCache,logger:a,abortSignal:c,loggerTags:Be(a)});if((v.result||o)&&v.relevantElements&&(d.relevantElementsSerialized=v.relevantElements.map(x=>s.getSerializedFormFromA11yId(x)).filter(x=>!!x),await qM(v.relevantElements,s,a)),!v.result)throw new R("AssertionFailureError",v.thoughts);return{succeedImmediately:!1,thoughts:v.thoughts,urlAfterCommand:h,afterScreenshotOverride:m}}function VM(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 qM(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 KM=3e4;async function ww({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??KM/1e3,i=new AbortController,s=Object.fromEntries(Object.entries(n.headers||{}).filter(([p,u])=>p&&u)),a;if(zo(n.url)&&(a=n.url),t&&Ho(n.url,t)&&(a=new URL(n.url,t).toString()),!a)throw new R("ActionFailureError",`Invalid URL: ${n.url}`);let c=await D((async()=>{try{return await r(a,{headers:s,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 _l(n){try{return new RegExp(n)}catch(e){throw new R("UserConfigurationError",`The provided regex expression was invalid: ${e}`)}}async function vw(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 xw(n){let e=await n.text();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:await n.json()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function Tw(n){return{request:{url:n.url(),method:n.method(),headers:await n.allHeaders(),...await vw(n)}}}async function Ew(n,e){let t=await e.response();if(t)return n.response={status:t.status(),headers:await t.allHeaders(),...await xw(t)},n}async function Cw(n){let e=n.request(),t=n.status(),r=n.headers(),o=await xw(n);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await vw(e)},response:{status:t,headers:r,...o},status:t,headers:r,...o}}var yi=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:s,orgId:a,localCodeEvalTools:l,uploadedFileStorage:c,visualDiffScreenshotStorage:d,options:p}){this.orgId=a,this.options=p,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=s,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:s,logger:a=this.logger}){let[l,c]=await Promise.all([xr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=await so({type:"ai-action",description:e,serializedTree:l.serializedTree,tree:l.tree,logger:a,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:s};return await this.generator.getMultiturnAiActionEvaluation(u,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...Be(a)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:r,actionHint:o,disableCache:i,logger:s=this.logger,langfuseSessionId:a}){let l=this.browser.url(),[c,d]=await Promise.all([xr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),p=`data:image/jpeg;base64,${d.toString("base64")}`,u=await so({type:"ai-action",description:e,serializedTree:c.serializedTree,tree:c.tree,logger:s,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:{...Be(s)},langfuseSessionId:a})}catch(h){throw new R("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return xr(this.browser,e)}async locateElement(e){return jp(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:s,action:a,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:s[p],action:async h=>h,options:{...l,skipFetchTree:p!==0,targetName:o[p]}});d.push(m)}try{return{result:await a(...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:a,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")&&id(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&ts(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 s=this.logger.child({commandId:i.id}),{targetName:a="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:a,logger:s});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:s,command:a}=e,{disableCache:l,useSelector:c,targetName:d="target",targetHealingInProgress:p,source:u}=s,m=this.logger.child({commandId:a.id}),h=s.retriesWithAI??1,g=!1,f=e.cache;if((!f||l)&&!pc(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&&Ku(f);if(!f){let v=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 x=await jp({description:o.elementDescriptor,disableCache:l,iframeUrl:s.iframeUrl,source:u},this.getControllerFixtures(t));x.frameConfig&&this.browser.setActiveFrameConfig(x.frameConfig);let b=s.disableGlobalLocatorRedirect?{locator:x.resolution.locator}:await this.attemptLocatorRedirect(x.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:a.type,duration_ms:Date.now()-v.getTime()}),x.target.targetSource="AI_HEALED",x.target.targetUpdateTime=new Date().toUTCString(),x.target.targetUpdateLoggerTags=Be(m);let A=x.resolution.pageState;if(A)try{C=await this.getReverseMappedDescription({browserState:A,targetId:x.target.id,disableCache:!0,screenshot:x.screenshot})}catch(N){m.warn({err:N},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:T,elementInteractedDisplayString:x.resolution.displayString,newTarget:{cache:x.target,thoughts:x.thoughts,description:C}}}try{let v=new Date,x=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(x.locator);let b=s.disableGlobalLocatorRedirect?{locator:x.locator}:await this.attemptLocatorRedirect(x.locator,m),T=await i(b);if(S){let C=x.decisions.filter(A=>A.matched);if(C.length!==1)m.warn({decisions:x.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:a.type,duration_ms:Date.now()-v.getTime()})}}return{result:T,elementInteractedDisplayString:x.displayString,newTarget:{cache:f}}}catch(v){this.throwIfClosed();let x=Bh(v)&&!id(v)&&!ts(v);if(v instanceof R&&!x)throw v;if(h>0&&o)return m.debug({err:v,cache:f},"Failed to execute action with cached target, retrying with AI"),this.wrapElementTargetingCommand({ctx:t,tracer:r,command:a,target:o,cache:void 0,action:i,options:{...s,retriesWithAI:h,targetHealingInProgress:!0}});throw new R("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.flagStore.isBooleanFlagEnabled("global_locator_redirect")?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Ls(this.browser,e)}async executePresetCommand(e,t,r,o,i){this.options?.slowMoMs&&await ne(this.options.slowMoMs);let s=await this.browser.getOpenPages(),a=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")&&Qu(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 Dy({beforeUrl:a,command:r,beforePages:s.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){fy(e,t)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>xp(e)}}async resolveCommandTemplateStrings(e,t){return ui({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 s=r.condition;return s?.assertion.trim()?$p({command:s,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 $p({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:Be(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(!zo(r.url)&&!Ho(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 a=await this.browser.solveCaptcha();a&&(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(a,{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:x=>this.browser.click(x,this.createCallbacksForBrowser(this.orgId),r),options:h});f.cache&&(r.cache={target:f.cache});let v={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return ja(m,v.urlAfterCommand)&&(v.succeedImmediately=!0,v.succeedImmediatelyReason="URL changed"),v}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,v=[];if(r.target?.elementDescriptor){let{newTarget:x,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,v.push(x)}return await this.browser.mouseDrag(m,h,g,f,{force:r.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:v}}case"SELECT_OPTION":{if(!or(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:Mr(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:v,newTarget:x}=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:Mr(r)}});g.push(x),h=v}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 ja(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(!or(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&&!or(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 ja(d,p.urlAfterCommand)&&(p.succeedImmediately=!0,p.succeedImmediatelyReason="URL changed"),p;case"KEY_DOWN":return await this.browser.keyDown(r.value,{convertMeta:r.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(r.value,{convertMeta:r.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let m=new XM,h=YM(fetch,m),g;try{g=new URL(r.url).hostname}catch{}return{data:{...await hl({command:r,baseUrl:this.browser.baseUrl,logger:this.logger,fetchImplementation:h}),cookies:Ca(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await ww({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Ly({ctx:e,tracer:t,command:r,disableCache:i,browser:this.browser,logger:this.logger,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(r.fileSource.type==="URL"?(h=r.fileSource.url,m=await Ib({uri:r.fileSource.url,logger:this.logger,orgId:this.orgId})):r.fileSource.type==="USER_FILE"&&(h=r.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(r.fileSource.name,this.orgId)),!m)throw new R("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:r.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!r.storageState.trim())m=void 0;else if(m=await 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=Ea.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 Iy({command:r,tracer:t,timeoutMs:m,targetingWrapper:g=>this.wrapElementTargetingCommand(g),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,newTargets:h.newTarget?[h.newTarget]:[],thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await On({action:async()=>gl({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=_l(r.pattern),h=this.browser.registerRequestListener(m);return this.registeredListeners[r.key]=h.then(async g=>await Cw(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=_l(r.pattern);return this.recordedRequests[r.key]=[],this.browser.registerRequestRecorder(r.key,m,async h=>{try{let g=await Tw(h);this.recordedRequests[r.key]?.push(g),await Ew(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=_l(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:Be(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 Ll({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:Be(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:Be(this.logger)})}};var ZM=4;async function Rw({socket:n,logger:e,analytics:t,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,devicePixelRatio:a,generatorFactory:l,enricherFactory:c,browserbase:d,authorization:p,flagStoreFactory:u,settingsFactory:m,getOrgId:h}){let g=n.id,f=n.handshake.query.testId;if(!f)throw new Error("Socket connection request is missing testId");let S=await h({type:"e2e",testId:f});e=e.child({testId:f,orgId:S,sessionId:g});let v=await l(S,e),x=await c(S,e),b=await u(S),T=await m(S,e),{testMetadata:C,baseUrl:A,envName:N,browserConfig:O,environmentVariables:H,localCodeEvalTools:B}=await ao({testId:f,orgId:S,logger:e,storage:r,authorization:p,flagStore:b,settings:T}),M=Z.getSession(g);if(M)return e.info("Associating connection with existing session (likely reconnect)"),await M.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:g,orgId:S,testId:f};let U=n.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:U,event:"connect",args:n.handshake.query},"Websocket event (connect)"),U&&Z.getCurrentConnectionsByIp(U)>=ZM)throw e.error({clientIp:U,sessions:Z.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.");Z.reserveCapacityByIp(U);try{await QM({socket:n,baseUrl:A,envName:N,testMetadata:C,orgId:S,sessionId:g,logger:e,analytics:t,environmentVariables:H,clientIp:U,devicePixelRatio:a,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,localCodeEvalTools:B,generator:v,enricher:x,browserbase:d,browserConfig:O,flagStore:b})}catch(L){throw e.warn({err:L},"Error setting up socket session, possibly due to client closing the connection"),Z.releaseCapacityByIp(U),L}return{type:"e2e",sessionId:g,testId:f,orgId:S}}async function QM({socket:n,baseUrl:e,envName:t,devicePixelRatio:r,testMetadata:o,orgId:i,sessionId:s,logger:a,analytics:l,storage:c,uploadedFileStorage:d,visualDiffScreenshotStorage:p,serviceMocker:u,localCodeEvalTools:m,generator:h,environmentVariables:g,browserConfig:f,clientIp:S,enricher:v,flagStore:x}){let b={viewport:o.advanced?.viewport??Jt,locale:o.advanced?.locale??Oo,timezoneId:o.advanced?.timezone??Mo,geolocation:o.advanced?.geolocation??ko,colorScheme:o.advanced?.colorScheme};r&&(b.deviceScaleFactor=r);let T=o.id,C=await u?.initializeServicesForTest(i,T),A=await vl({settings:f,orgId:i,baseUrl:e,envName:t,localTools:m,envVariables:g,logger:a,customHeaders:void 0,flagStore:x});a=a.child({orgId:i,sessionId:s,testId:T});let N=!1,O=x.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,a):null,H=await Dn.init({baseUrl:e,userBrowserSettings:A,enricher:v,storage:c,flagStore:x,mockedServices:C,logger:a,contextArgs:b,iconKnowledgeBase:O,callbacks:{onTabsChange:(Y,z)=>{n.emit("tabs",{tabs:Y,activeTab:z})},onScreencastFrame:(Y,z)=>{let J=n;N&&(J=n.compress(!0)),J.emit("screenshot",{buffer:Y},()=>{z()})},onSvgsCollected:Y=>{n.emit("newIconDetected",{numIcons:Y.newSvgs.length}),c.saveNewIcons(i,Y,a)}}});await H.navigate({url:e,initialNavigation:!0});let B=new yi({browser:H,generator:h,logger:a,analytics:l,flagStore:x,orgId:i,options:{scratchPadId:void 0,slowMoMs:A.slowMoMs,autoFollowNewTabs:A.autoFollowNewTabs},storage:c,localCodeEvalTools:m,uploadedFileStorage:d,visualDiffScreenshotStorage:p}),M=ay(n,s,a),U=async()=>{M.timers.forEach(Y=>clearInterval(Y))},L=new Lt({baseUrl:e,currentUrl:B.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:Dn.USER_AGENT,viewport:B.browser.getViewport(),sessionId:s}),Z.registerSession({controller:B,context:L,sessionId:s,cleanup:U,clientIp:S})}async function ao({testId:n,orgId:e,logger:t,storage:r,authorization:o,flagStore:i,settings:s}){let a=await r.fetchTestMetadata(n,e,t);if(!a)throw new Error(`Test metadata could not found for test ${n}`);let l;o?.type==="API_KEY"&&(l=new fr({httpClient:new Dt({...o,logger:t}),fakerSeed:void 0}));let c=a.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={...s.browser,...p,...a.advanced},m=a.baseUrl||d?.variables?.[We];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((a.parameters??[]).map(async g=>{let f=await Gt({orgId:e,s:g.defaultValue,context:Lt.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:a}}var Gp=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 Dl({parentStep:this.step,socket:this.socket,parentTracer:this})}},Dl=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 Gp({step:e.step,parentTracer:this,socket:this.socket})}},Fl=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 Dl({parentStep:null,parentTracer:null,socket:this.socket})}};var Wp={currentlyExecutingRequests:{}},tk=n=>async(e,t)=>{let{testId:r,orgId:o}=n.metadata,i=await n.flagStoreFactory(o),s=await n.settingsFactory(o,n.logger),a,l=await ao({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i,settings:s}),c=`${r}|${l.baseUrl}`;try{let d=Wp.currentlyExecutingRequests[c]??0;Wp.currentlyExecutingRequests[c]=d+1,a=await nk({...n,...e,...l,done:t})}finally{n.logger.info({result:a,sessionId:n.metadata.sessionId},"Test execution complete"),Wp.currentlyExecutingRequests[c]--}},nk=async({socket:n,steps:e,baseUrl:t,testMetadata:r,reInitialize:o,toStep:i,fromStep:s,storage:a,metadata:l,logger:c,analytics:d,envName:p,environmentVariables:u,localCodeEvalTools:m,done:h,cacheStorageFactory:g})=>{let{testId:f,sessionId:S,orgId:v}=l,x=S,b=Z.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:v,sessionId:S,runId:x}),c.info({steps:e.map(Q=>`${Q.type}${"command"in Q?` - ${Q.command.type}`:""}`),toStep:i,fromStep:s,reInitialize:o,envName:p,baseUrl:t,context:C,flags:T.flagStore.getAllFlags()},"Socket execution parameters");let A=u??{},N=async()=>{o&&(await T.browser.reset({newUrl:t}),C.reset({baseUrl:t,currentUrl:T.browser.url(),variablesFromEnvironment:A,envName:p}))},O=await g(v),H=async()=>{try{await O.resolveStepCacheEntries({schemaVersion:r.schemaVersion,organizationId:v,testId:f,steps:e,logger:c})}catch(Q){c.error({err:Q},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await as({promiseGenerator:async()=>Promise.all([N(),H()]),signal:T.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),T.setOpen()}catch(Q){if(n.emit("finished"),Q.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${Q}`)}let B=ek(e),M={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},U={orgId:v,runId:x,testMetadata:r,steps:e,fromStep:s,toStep:i},L={controller:T,context:C,storage:a,debugDataStorage:new Ur,codeEvalTools:m,billingReporter:new Uo,logger:c,analytics:d},Y={test:{},step:{onDynamicAIActionStatusUpdateEvent:Q=>{n.emit("dynamicCommandStatusUpdate",Q)},onDynamicAIActionEvaluatingEvent:Q=>{n.emit("dynamicCommandEvaluating",Q)},onDynamicCommandGenerated:Q=>{n.emit("dynamicCommandGenerated",Q)},onDynamicCommandExecuted:Q=>{n.emit("dynamicCommandExecuted",Q)}}},z=new Fl(n,a,v,f,B),J=await wl({fixtures:L,options:M,callbacks:Y,inputs:U,testParams:{tracer:z}});return J?.status==="PASSED"&&await Na({logger:c,cacheStorage:O,orgId:v,testId:f,originalSteps:{steps:B},updatedSteps:{steps:e}}),await z.finish(),h?.(J),J.status};var Aw={event:"execute",createHandler:tk};import{cloneDeep as rk}from"lodash-es";var ok=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,s=rk(e),a=pf(s);if(a.category!=="NO_DESCRIPTION_PROVIDED"){if(a.category!=="NONE"){t?.({result:a});return}"cache"in s&&(s.cache=void 0,s.id=void 0);try{let c=await(await o(i.orgId,r)).getLintStepResult({command:s},{logger:r});t?.({result:c})}catch(l){r.error({event:"lint",err:l},"Failed to lint step"),t?.({result:void 0})}}},Iw={event:"lintStep",createHandler:ok};var ik=({metadata:n,logger:e,storage:t})=>{let{sessionId:r}=n;return async(o,i)=>{let{description:s,command:a,testMetadata:l,returnScreenshot:c}=o;e.info({params:o},`Locate handler called - ${s}`);let d=Z.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(s){if("useSelector"in a&&a.useSelector)try{let f=await p.locateElementWithSelector(s,"iframeUrl"in a?a.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:s,disableCache:m.disableAICaching??!1,iframeUrl:"iframeUrl"in a?a.iframeUrl:void 0,skipWait:!0,testContext:u,source:Mr(a)});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(a.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:v}=await p.screenshotWithDimensions({clearHighlights:!0,locator:g}),x=await t.uploadScreenshot(f);h.screenshot={data:x,width:S,height:v},e.info({width:S,height:v},"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...")}}},Pw={event:"locate",createHandler:ik};var sk=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({event:r,percentX:o,percentY:i})=>{let s=Z.getSession(t);if(!s)throw new Error("No active session found");let a=s.controller.browser;if(a.closed||a.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await a.clickMouseFromPositionPercentages(r,o,i)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},Lw={event:"mouseClickEvent",createHandler:sk};var ak=({metadata:n,generatorFactory:e,logger:t,socket:r})=>{let{sessionId:o,orgId:i,testId:s}=n;return async({stepId:a,parentStepIdChain:l,attribute:c})=>{let d=Z.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:a,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:a,parentStepIdChain:l,attribute:c}))},1e4),await p.startRecordMode({params:{generator:u,logger:t,testId:s,orgId:i,callbacks:{onActionReceived:f=>g("clickReceived",f),onStepRecorded:f=>g("descriptionGenerated",f)}},abortController:m,isClickToRecord:!0}),r.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:a,parentStepIdChain:l,attribute:c})}},Ow={event:"recordTargetClick",createHandler:ak};var lk=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({key:r})=>{let o=Z.getSession(t);if(!o)throw new Error("No active session found");if(r==="Dead")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(),await i.browser.keyDown(r,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:t,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},Mw={event:"keyDownEvent",createHandler:lk};var ck=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async({key:r})=>{let o=Z.getSession(t);if(!o)throw new Error("No active session found");if(r==="Dead")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(),await i.browser.keyUp(r,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:t,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},kw={event:"keyUpEvent",createHandler:ck};var dk=({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)))},s,a=0;return async l=>{let c=Z.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,s?.x??0,s?.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);a=0,s=m}catch(m){a++,a%5===0&&e.warn({err:m,mouseErrors:a},"Error in socket mouse move handler")}}},Nw={event:"mouseMoveEvent",createHandler:dk};var pk=({metadata:n,generatorFactory:e,socket:t,logger:r})=>{let{sessionId:o,orgId:i,testId:s}=n;return async({stepId:a})=>{let l=Z.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:s,orgId:i,callbacks:{onActionReceived:(h,g)=>{t.emit("stepRecorded",{stepId:a,step:h,offset:g})},onStepRecorded:(h,g)=>{t.emit("stepRecorded",{stepId:a,step:h,offset:g})}}},abortController:u,isClickToRecord:!1});d.recordingState={transformer:m}}},_w={event:"recordingStart",createHandler:pk};var uk=({metadata:n,logger:e})=>{let{sessionId:t}=n;return async()=>{let r=Z.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}},Dw={event:"recordingStop",createHandler:uk};var mk=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i,settingsFactory:s})=>async(a,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 s(p,t),{baseUrl:h}=await ao({testId:c,orgId:p,logger:t,storage:r,authorization:o,flagStore:u,settings:m}),g=Z.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()},Fw={event:"refresh",createHandler:mk};var hk=({socket:n,metadata:e,logger:t,storage:r,authorization:o,flagStoreFactory:i,settingsFactory:s})=>async()=>{let{testId:a,sessionId:l,orgId:c}=e;t.info({testId:a,sessionId:l},"Reset event received");let d=await i(c),p=await s(c,t),{baseUrl:u,envName:m,environmentVariables:h}=await ao({testId:a,orgId:c,logger:t,storage:r,authorization:o,flagStore:d,settings:p}),g=Z.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 v=f.browser.baseUrl;S.reset({baseUrl:v,currentUrl:f.browser.url(),variablesFromEnvironment:h,envName:m});let x=f.browser.getViewport(),b=Dn.USER_AGENT;t.info({baseUrl:u,viewport:x},`Session reset for test ${a} at ${v}`),n.emit("session",{url:v,userAgent:b,viewport:x,sessionId:l})},Uw={event:"reset",createHandler:hk};var gk=({metadata:n})=>{let{sessionId:e}=n;return async({url:t})=>{let r=Z.getSession(e);if(!r)throw new Error("No active session found");await r.controller.browser.switchToPage({type:"SUBSTRING",substring:t})}},Bw={event:"switchTab",createHandler:gk};async function zw(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?by(n):Rw(n)}var Hw=[Ey,Aw,Pw,Uw,Fw,vy,Bw,Iw,Ow,_w,Dw,Nw,Lw,Mw,kw,wy,ly,Ty,xy];var jw=n=>{let{logger:e}=n,t=new fk(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 zw({...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}Hw.forEach(i=>Sk(i,{socket:r,metadata:o,...n,logger:e}))}),t},Sk=(n,e)=>{let t=n.createHandler(e),r=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(n.event)||e.logger.debug({...e.metadata,event:n.event,args:o},`Websocket event (${n.event})`);let i=s=>{e.logger.error({event:n.event,type:"websocket",args:o,err:s instanceof Error?s:new Error(`${s}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:s instanceof Error?s.message:`${s}`})};try{let s=t.apply(void 0,o);s&&typeof s.catch=="function"&&s.catch(i)}catch(s){i(s)}};e.socket.on(n.event,r)};import{Router as Ak}from"express";import Yp from"fs";import xk from"path";import Gw,{multistream as yk}from"pino";import bk from"pino-pretty";var $w=["lastScreenshotBuffer"];var Vp=new Map,wk=!0,qp=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=wk?Gw(i):Gw(i,yk([{stream:bk({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 s={};for(let a of Object.getOwnPropertyNames(t.err))$w.includes(a)||(s[a]=t.err[a]);s.name=t.err.name,t.err=s}let i=Object.assign({},this.bindingAttributes,t&&typeof t=="object"?t:{});o.length>0&&(i.args=o),(async()=>{try{let s=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(!s.ok)throw new Error(`Failed to log to Datadog: ${s.statusText})}`)}catch(s){this.disableConsoleLogs||this.consoleLogger.warn({obj:t,msg:r,args:o,err:s},"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}},Ul=({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 Vp.has(n)||Vp.set(n,new qp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),Vp.get(n)};import{hostname as vk}from"os";var Ge=Ul({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:vk(),disableConsoleLogs:!0}),Ww=n=>{Ge.addBinding("version",n)};var Tk=new dl(30,60*1e3),Zp="https://api.momentic.ai",Qp,Kp,Vw=n=>{Zp=n},Bl=()=>Zp,qw=(n,e)=>{Qp=n,Kp?.abort(),Kp=new AbortController;let t=Kp.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=xk.resolve(n.rootDir,o.envFile);try{if(Yp.lstatSync(i).isSymbolicLink())return;Yp.existsSync(i)&&r.push(i)}catch(s){Ge.warn({err:s},`Failed to check if env file ${i} exists`)}});try{Ek({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){Ge.error({err:o},"Failed to start config file watchers")}},oe=()=>Qp,bi,Jp,Xp,Kw=async n=>{if(bi)return bi;let e=new lt({baseUrl:Zp,apiKey:n,logger:Ge});try{let t=await e.getAuthInfo();return bi=t.orgId,Jp=t.userId,Xp=n,bi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Fn=()=>{if(!bi)throw new Error("Your organization ID is invalid.");return bi},zl=()=>{if(!Jp)throw new Error("Your user ID is invalid.");return Jp},Yw=()=>{if(!Xp)throw new Error("Your API key is invalid.");return Xp};function Ek({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{Yp.watch(o,{signal:t,persistent:!1,recursive:!1},(i,s)=>{s&&(Tk.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 Hl=class extends ai{constructor(t,r){super(t,r);this.client=t;this.orgId=r}async fetchTestMetadata(t,r,o){let i=oe(),a=be(i,o).tests[t];if(a)return Ga(a.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=oe();return ds(r,i,zr)}async fetchIconKnowledgeBase(t,r){try{return await this.client.fetchIconKnowledgeBase(r)}catch(o){return r.error({err:o},"Failed to fetch icon knowledge base"),null}}async fetchCloudOrgSettings(t,r){}};function le(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}import{Router as Ck}from"express";import Jw from"fs";import Rk from"path";var Ns=Ck();async function eu(n){return(await $a(n,Ge)).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)}Ns.get("/",le(async(n,e)=>{let t=oe(),r=be(t,y),o=await eu(r);e.status(200).json(o)}));Ns.post("/",le(async(n,e)=>{let t;try{t=Kh.parse(n.body)}catch(a){e.status(400).json({error:`Invalid request body: ${a}`});return}try{Fo(t.name)}catch(a){e.status(400).json({error:`Invalid module name: ${a}`});return}let r=oe(),o=be(r,y).modules;if(Object.values(o).find(a=>a.name===t.name)){e.status(400).send(`A module with the name "${t.name}" already exists. Please choose a different name.`);return}let i=Rk.join(r.rootDir,t.folderPath??"");if(!Jw.existsSync(i)||!Jw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let s=await Vf({...t,folder:i,project:r});e.status(201).json(s)}));Ns.get("/:moduleId",le(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=be(oe(),y),r=t.modules[n.params.moduleId];if(!r){e.status(404).json({error:"Module not found."});return}try{let o=await Td(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));Ns.patch("/:moduleId/metadata",le(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Yh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=oe(),o=be(r,y);Wf({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var Xw=Ns;var Zw=Ak();Zw.get("/",le(async(n,e)=>{let t=oe(),r=be(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(),s=Object.values(r.tests),a=await eu(r),l={labels:i,tests:s,modules:a};e.status(200).json(l)}));var Qw=Zw;import{Router as Ik}from"express";var tu=Ik();tu.get("/",le((n,e)=>{let t=Xf(oe(),Ge);e.status(200).json(t)}));tu.get("/names",le((n,e)=>{let r=oe().config.environments?.map(o=>o.name)??[];e.status(200).json(r)}));var ev=tu;import{Router as Pk}from"express";import gt from"fs";import ot from"path";var Ds=Pk();function _s(n){let e=oe(),t=ot.dirname(e.configFilePath);return ot.join(t,...n)}function Lk(n){let e=oe(),t=ot.dirname(e.configFilePath),r=ot.relative(t,n);return r?r.split(ot.sep):[]}function Ok(n,e){let t=gt.statSync(n),r=Lk(n);return ad.parse({name:e,absolutePath:n,relativePath:r.join(ot.sep),pathSegments:r,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Ds.post("/",le(async(n,e,t)=>{let r;try{r=Zh.parse(n.body).pathSegments}catch(l){e.status(400).json({error:`Failed to parse folder read body: ${l}`});return}let o=_s(r);if(!gt.existsSync(o)){e.status(404).json({error:`Path not found: ${r.join(ot.sep)}`});return}if(!gt.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${r.join(ot.sep)}`});return}let s=gt.readdirSync(o).map(l=>{let c=ot.join(o,l);return Ok(c,l)}),a={absolutePath:o,pathSegments:r,contents:s};e.status(200).json(a)}));Ds.put("/",le(async(n,e,t)=>{let r;try{r=Qh.parse(n.body).pathSegments}catch(s){e.status(400).json({error:`Failed to parse folder create body: ${s}`});return}let o=_s(r);if(gt.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${r.join(ot.sep)}`,pathSegments:r});return}gt.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${r.join(ot.sep)}`,pathSegments:r};e.status(201).json(i)}));Ds.patch("/",le(async(n,e,t)=>{let r,o;try{let c=eg.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=_s(r),s=_s(o);if(!gt.existsSync(i)){e.status(400).json({error:`Folder not found: ${r.join(ot.sep)}`});return}if(gt.existsSync(s)){e.status(400).json({error:`Destination already exists: ${o.join(ot.sep)}`});return}let a=ot.dirname(s);gt.existsSync(a)||gt.mkdirSync(a,{recursive:!0}),gt.renameSync(i,s);let l={success:!0,message:`Folder moved from ${r.join(ot.sep)} to ${o.join(ot.sep)}`,pathSegments:o};e.status(200).json(l)}));Ds.delete("/",le(async(n,e,t)=>{let r,o=!0;try{let l=tg.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=_s(r);if(!gt.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${r.join(ot.sep)}`,pathSegments:r});return}if(!gt.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${r.join(ot.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 a={success:!0,message:`Folder deleted: ${r.join("/")}`,pathSegments:r};e.status(200).json(a)}));var tv=Ds;import{Router as Mk}from"express";var nv=Mk();nv.get("/",le((n,e)=>{e.status(200).json({userId:zl(),orgId:Fn()})}));var rv=nv;import{Router as kk}from"express";var ov=kk();ov.get("/",le((n,e)=>{let t=oe(),r=be(t,y),o=new Set;r?.tests&&Object.values(r.tests).forEach(s=>{s.labels?.forEach(a=>o.add(a))});let i=Array.from(o).sort();e.status(200).json(i)}));var iv=ov;import{Router as Nk}from"express";var jl=Nk();jl.get("/",le((n,e)=>{let t=Xd().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));jl.get("/current",le((n,e)=>{let t=oe(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));jl.post("/set",le((n,e)=>{let t;try{t=Xh.parse(n.body)}catch(r){e.status(400).json({error:`Invalid request body: ${r}`});return}try{let r=$t({configFilePath:t.configFilePath});qw(r,o=>$t({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var sv=jl;import{Router as _k}from"express";var av=_k();av.get("/",le((n,e)=>{let r={ai:oe().config.ai};e.status(200).json(r)}));var lv=av;import{Router as Uk}from"express";import cv from"fs";import lo from"path";import{v4 as dv}from"uuid";import Bk from"yaml";import{randomUUID as Dk}from"node:crypto";import{PostHog as Fk}from"posthog-node";var wi=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},vi=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new Fk("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(!xh(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:Dk(),event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var xi=new vi({platform:"local_app"},{flushAt:1,flushInterval:0});var Tr=Uk();Tr.get("/",le((n,e)=>{let t=oe(),r=be(t,y),o=Object.values(r.tests);e.status(200).json(o)}));Tr.post("/",le(async(n,e)=>{let t;try{t=Vh.parse(n.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}try{Fo(t.name)}catch(p){e.status(400).json({error:p.message});return}let o={id:dv(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:_e,advanced:{disableAICaching:!1,browserType:t.browserType??"Chromium",viewport:t.viewport??Jt},retries:0,steps:[]};t.environment&&(o.envs=[{name:t.environment,default:!0}]);let i=oe(),s=be(i,y);if(Object.values(s.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=lo.join(i.rootDir,...t.pathSegments||[]),c=await Kf({test:o,name:t.name,folder:l}),d={...o,relativeFilePath:lo.relative(i.rootDir,c)};xi.track({type:"test_editor:test_create"}),e.status(201).json(d)}));Tr.get("/:testPath",le(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r=oe(),o=be(r,y),i;try{i=await cs(lo.join(r.rootDir,t),Ge,o),e.status(200).json(i)}catch(s){e.status(400).send({error:s.message});return}(async()=>{try{let{stepsToSave:s,moduleUpdates:a}=await _t({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});a.forEach(l=>{Jr({content:l,schemaVersion:_e,momenticFiles:o,project:r})}),Wn({relativeTestPath:t,steps:s,schemaVersion:_e,project:r})}catch(s){Ge.error({err:s},"Failed to save migrated test to disk after initial fetch")}})()}));Tr.patch("/:testPath/metadata",le(async(n,e)=>{if(!n.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=Wh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:Ed(n.params.testPath,t,oe()).newRelativeTestPath};e.status(200).json(o)}));Tr.patch("/:testPath",le(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=Gh.parse(n.body)}catch(m){e.status(400).json({error:`Invalid request body: ${m}`});return}let o=oe(),i=be(o,y),s;try{s=Ga(t,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:a,moduleUpdates:l,cachesToSave:c}=await _t({stepLists:r.stepLists,cacheCreationParams:{testId:s.id,orgId:Fn()}}),d=new lt({apiKey:Yw(),baseUrl:Bl(),logger:Ge}),p=await ii(Ge,d,o);await pi({orgId:Fn(),client:d,gitMetadata:p}).saveStepCacheEntries({logger:Ge,testId:s.id,entries:c}),l.forEach(m=>{Jr({content:m,schemaVersion:r.schemaVersion,momenticFiles:i,project:o})}),Wn({relativeTestPath:t,steps:a,schemaVersion:r.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Tr.patch("/:testPath/environments",le(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=Jh.parse(n.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}Ed(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},oe()),e.status(201).json({message:"ok"})}));Tr.post("/:testPath/duplicate",le(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=qh.parse(n.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Fo(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=oe(),i=lo.join(o.rootDir,t);if(!cv.existsSync(i)){e.status(404).json({error:"Test not found."});return}let s=be(o,y),a;try{a=await cs(i,Ge,s)}catch(f){e.status(400).send({error:f.message});return}let l=dv(),c=tn.parse({...a,name:r.name,id:l}),{stepsToSave:d}=await _t({stepLists:{steps:a.steps,beforeSteps:a.beforeSteps,afterSteps:a.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:l,orgId:Fn()}}),p=$n({fileType:Ae.TEST,...c,beforeSteps:d.beforeSteps??void 0,steps:d.steps,afterSteps:d.afterSteps??void 0}),u=lo.dirname(i),m=lo.join(u,`${r.name}.${Nt.TEST}`),h=Bk.stringify(p);cv.writeFileSync(m,h,"utf-8");let g={relativeFilePath:lo.relative(o.rootDir,m)};xi.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var pv=Tr;var Fs=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new ri(oe(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function gv(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:s,logger:a=Ge,alwaysSaveCache:l,noCache:c}=n;Ww(s),e&&Vw(e),await Kw(t);let d=Fn(),p=zl();xi.identify({user_id:p,org_id:d}),a.debug({params:n,orgId:d,userId:p},"Desktop server init and api key check done");let u=Vk(o,r,a),m=`http://localhost:${r}`;y.info(`Desktop server is running at ${m}`),await new Promise(T=>{try{u.listen(r,()=>{a.info(`Desktop server is running at ${m}`),T()})}catch(C){C.message.includes("EADDRINUSE")?fv(r):y.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:Bl(),apiKey:t,logger:a},f=async()=>{let T=oe();return new ci(T.config.ai?.agentConfig,g)},S=async()=>new di(g,await f()),v=new lt(g),x=new Hl(v,Fn()),b=new Fs;jw({baseServer:u,getOrgId:async()=>Fn(),generatorFactory:f,enricherFactory:S,cacheStorageFactory:async T=>{let C=oe(),A=await ii(a,v,C);return pi({orgId:T,client:v,gitMetadata:A,alwaysSaveCache:l,noCache:c})},flagStoreFactory:async T=>{let C=oe();return new oi(C.config)},settingsFactory:async()=>{let T=oe();return{ai:{},browser:{},...T.config}},storage:x,logger:a,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:b,analytics:xi})}var hv="25mb";function Vk(n,e,t){let r=mv();r.use(zk()),r.use(uv.json({limit:hv})),r.use(uv.urlencoded({extended:!1,limit:hv}));let o=$k();if(o.use("/tests",pv),o.use("/modules",Xw),o.use("/environments",ev),o.use("/projects",sv),o.use("/labels",iv),o.use("/folders",tv),o.use("/settings",lv),o.use("/identify",rv),o.use("/entities",Qw),r.use("/api",o),r.use((s,a,l)=>{s.path!=="/healthcheck"&&!s.path.startsWith("/assets")&&t.debug({url:s.url,path:s.path,query:s.query,method:s.method,body:s.body,headers:s.rawHeaders,client:s.ip},"Received desktop-server request"),a.on("close",()=>{a.statusCode>=400&&t.error({url:s.url,method:s.method,statusCode:a.statusCode},"Request completed in error")}),l()}),r.use((s,a,l,c)=>{if(s instanceof Error&&s.message.includes("BadRequestError: request aborted")){l.status(400).send("Client disconnected");return}t.error({stack:s.stack,msg:s.message,err:s,url:a.url,method:a.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: ${s.message}
3813
+ ${s.stack}`),l.status(500).send("Internal Server Error")}),n){let s=mv.static(n,{setHeaders:a=>{a.setHeader("Cache-Control","no-cache")},redirect:!1});r.use(s),r.use("*",(a,l)=>{l.sendFile(Wk.join(n,"index.html"))})}let i=Gk.createServer(r);return i.once("error",s=>{"code"in s&&s.code==="EADDRINUSE"?(fv(e),process.exit(1)):console.error("An unexpected server error occurred:",s.message)}),i}jk.setMaxListeners(50);process.on("warning",n=>{Ge.warn({err:n},`Node warning received on desktop-server: ${n.message}`)});process.on("uncaughtException",n=>{Ge.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)=>{Ge.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 fv(n){y.error(Hk`Port ${n} is already in use by another process. Please close the other process and try again.
3814
3814
  Using Bash on MacOS or Linux:
3815
3815
  lsof -t -i :58888 | xargs kill -9
3816
3816
 
3817
3817
  Using Command Prompt on Windows:
3818
3818
  for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
3819
- `)}import r_ from"events";import ac from"fs";import o_ from"open";import ic from"path";import{fileURLToPath as i_}from"url";import sN from"diff-lines";import{gt as lN}from"semver";import{execSync as $k}from"child_process";import{platform as Gk}from"os";function Zp(){return lv()?(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.
3819
+ `)}import a_ from"events";import cc from"fs";import l_ from"open";import lc from"path";import{fileURLToPath as c_}from"url";import pN from"diff-lines";import{gt as uN}from"semver";import{execSync as qk}from"child_process";import{platform as Kk}from"os";function nu(){return Sv()?(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.
3820
3820
  `),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.
3821
- l.`),1)}function lv(){return Gk()==="darwin"&&$k("system_profiler SPDisplaysDataType").toString().includes("Retina")}function Qp(r){lv()&&r===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 Wk from"@actions/exec";import Vk from"@actions/io";import qk from"quote";import Kk from"string-argv";async function cv(r,e=!0){let t=Kk(r),n=await Vk.which(t[0],!0),o=t.slice(1),i=Wk.exec(qk(n),o,{delay:100});if(e)return i}import{existsSync as Yk,statSync as Jk}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 dv(r){try{return Yk(r)&&Jk(r).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${r} during directory existence check`),!1}}import Xk from"csv-parser";import{createReadStream as Zk}from"fs";function eu(r){return new Promise((e,t)=>{let n=[];Zk(r).pipe(Xk()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>t(o))})}import jl from"semver";import{z as $l}from"zod";var wn="2.4.4",Qk="https://registry.npmjs.org/momentic",eN=$l.object({versions:$l.record($l.string(),$l.unknown()).optional()});async function pv(r){try{await tN(r)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function tN(r){if(!wn){r.warn("Unable to check CLI version because CLI_VERSION is not set");return}let e;for(let n=0;n<2;n++)try{let o=await D(fetch(Qk),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=eN.parse(i).versions;break}catch(o){r.warn({err:o},"Failed to fetch npm registry data")}if(!e){r.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let n of Object.keys(e))jl.valid(n)&&(!t||jl.gt(n,t))&&jl.gt(n,wn)&&jl.lt(n,"2.0.0")&&!n.includes("alpha")&&(t=n);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 rN,mkdirSync as oN,statSync as iN}from"fs";import{dirname as aN}from"path";import mv from"readline/promises";import{hostname as nN}from"os";var ee=Fl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:nN(),disableConsoleLogs:!0}).child({version:"2.4.4"});var tu=!1,hv=(()=>{try{return iN("/.dockerenv"),!0}catch{return!1}})();async function ft(r,e){if(vi||tu||hv)return!0;ee.flush(),await new Promise(a=>setTimeout(a,500));let t=mv.createInterface({input:process.stdin,output:process.stdout}),n=r.split("."),o;if(n.length===1)o=r;else{let a=`${n.slice(0,n.length-1).join(".").trim()}.`;e?y.warn(a):y.log(a),o=n[n.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(tu=!0,setTimeout(()=>{tu=!1},3e3),!0):i.toLowerCase()==="y"}async function nu(r){let e=aN(r);return dv(e)?rN(r)?ft(`File '${uv(r)}' already exists. Overwrite existing content?`,!0):!0:await ft(`Directory '${uv(e)}' doesn't exist. Create it now?`,!0)?(oN(e,{recursive:!0}),!0):!1}function uv(r){return r.replace(/(\s+)/g,"\\$1")}async function gv(r,e){if(vi||hv)return e;let t=mv.createInterface({input:process.stdin,output:process.stdout}),n=await t.question(`${r} `);return t.close(),n.trim()||e}async function fv({test:r,fragment:e,entities:t,client:n,logger:o,yes:i}){lN(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)),Vg(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=r.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(r.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${r.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=sN(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:r.relativePath,steps:u,schemaVersion:d??e.schemaVersion,project:t.project}),y.success("Patch applied successfully."),await n.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as po}from"crypto";import{z as Fv}from"zod";var jt=" ".repeat(6);import Dv from"chalk";import{Argument as lo,Option as Oe}from"@commander-js/extra-typings";import{validateHeaderValue as cN}from"http";import{cpus as Sv}from"os";import{parse as Nme}from"yaml";import{z as q}from"zod";var Gl=58888,ru=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"),ou=new Oe("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),iu=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 ${ru/1e3} seconds.`),Wl=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."),bv=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)),wv=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."),au=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."),vv=new Oe("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),xv=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."),Tv=new Oe("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),su=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."),Ev=new Oe("--port <port>",`Port to run the app on. Defaults to ${Gl}.`),lu=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."),Vl=new Oe("--env <env>","Name of the environment to use when running tests."),ql=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."),Cv=new Oe("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>parseInt(r,10)),Fn=new Oe("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),cu=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."),Rv=new Oe("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(r=>parseInt(r,10)),Av=new Oe("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),du=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"),pu=new Oe("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),Iv=new lo("<tests...>",`One or more test paths to queue on Momentic Cloud.
3821
+ l.`),1)}function Sv(){return Kk()==="darwin"&&qk("system_profiler SPDisplaysDataType").toString().includes("Retina")}function ru(n){Sv()&&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 Yk from"@actions/exec";import Jk from"@actions/io";import Xk from"quote";import Zk from"string-argv";async function yv(n,e=!0){let t=Zk(n),r=await Jk.which(t[0],!0),o=t.slice(1),i=Yk.exec(Xk(r),o,{delay:100});if(e)return i}import{existsSync as Qk,statSync as eN}from"fs";var Ti=!!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 bv(n){try{return Qk(n)&&eN(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import tN from"csv-parser";import{createReadStream as nN}from"fs";function ou(n){return new Promise((e,t)=>{let r=[];nN(n).pipe(tN()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import $l from"semver";import{z as Gl}from"zod";var wn="2.5.0",rN="https://registry.npmjs.org/momentic",oN=Gl.object({versions:Gl.record(Gl.string(),Gl.unknown()).optional()});async function wv(n){try{await iN(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function iN(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(rN),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=oN.parse(i).versions;break}catch(o){n.warn({err:o},"Failed to fetch npm registry data")}if(!e){n.warn("Failed to fetch npm registry data. Skipping version check.");return}let t;for(let r of Object.keys(e))$l.valid(r)&&(!t||$l.gt(r,t))&&$l.gt(r,wn)&&$l.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 aN,mkdirSync as lN,statSync as cN}from"fs";import{dirname as dN}from"path";import xv from"readline/promises";import{hostname as sN}from"os";var ee=Ul({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:sN(),disableConsoleLogs:!0}).child({version:"2.5.0"});var iu=!1,Tv=(()=>{try{return cN("/.dockerenv"),!0}catch{return!1}})();async function ft(n,e){if(Ti||iu||Tv)return!0;ee.flush(),await new Promise(s=>setTimeout(s,500));let t=xv.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let s=`${r.slice(0,r.length-1).join(".").trim()}.`;e?y.warn(s):y.log(s),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"?(iu=!0,setTimeout(()=>{iu=!1},3e3),!0):i.toLowerCase()==="y"}async function su(n){let e=dN(n);return bv(e)?aN(n)?ft(`File '${vv(n)}' already exists. Overwrite existing content?`,!0):!0:await ft(`Directory '${vv(e)}' doesn't exist. Create it now?`,!0)?(lN(e,{recursive:!0}),!0):!1}function vv(n){return n.replace(/(\s+)/g,"\\$1")}async function Ev(n,e){if(Ti||Tv)return e;let t=xv.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function Cv({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){uN(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)),tf(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 a=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<a&&!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=Zr(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 is({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:y});d=f,p=Pe.array().parse(g)}else p=Pe.array().parse(e.steps);let{stepsToSave:u,moduleUpdates:m}=await _t({stepLists:{steps:p}});u.beforeSteps=l.beforeSteps??void 0,u.afterSteps=l.afterSteps??void 0;let h=pN(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 uo}from"crypto";import{z as $v}from"zod";var Wt=" ".repeat(6);import jv from"chalk";import{Argument as co,Option as Me}from"@commander-js/extra-typings";import{validateHeaderValue as mN}from"http";import{cpus as Rv}from"os";import{parse as Bme}from"yaml";import{z as q}from"zod";var Wl=58888,au=30*60*1e3,Jn=new Me("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),Xn=new Me("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),po=new Me("-y, --yes","Skip all confirmation prompts.").env("CI"),lu=new Me("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),cu=new Me("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${au/1e3} seconds.`),Vl=new Me("--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."),Iv=new Me("--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(Ji)),Pv=new Me("--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."),du=new Me("--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."),Lv=new Me("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),pu=new Me("--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."),uu=new Me("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),mu=new Me("--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."),Ov=new Me("--port <port>",`Port to run the app on. Defaults to ${Wl}.`),hu=new Me("--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."),ql=new Me("--env <env>","Name of the environment to use when running tests."),Kl=new Me("--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."),Mv=new Me("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),vn=new Me("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),Yl=new Me("-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."),kv=new Me("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),Nv=new Me("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),gu=new Me("--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"),fu=new Me("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),_v=new co("<tests...>",`One or more test paths to queue on Momentic Cloud.
3822
3822
 
3823
- A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic pull hello-world'.`),Pv=new lo("<tests...>",`One or more test paths to import from Momentic Cloud.
3823
+ A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic pull hello-world'.`),Dv=new co("<tests...>",`One or more test paths to import from Momentic Cloud.
3824
3824
 
3825
- A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic import hello-world'.`).argOptional(),Lv=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(),Ov=new lo("<suites...>",`One or more suite paths that exist on Momentic Cloud.
3825
+ A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic import hello-world'.`).argOptional(),Su=new co("<tests...>","One or more test file path or folders that exist on the local machine: 'npx momentic run hello-world.test.yaml'.").argOptional(),Fv=new co("<suites...>",`One or more suite paths that exist on Momentic Cloud.
3826
3826
 
3827
- The suite path is a lowercased version of your suite name where spaces and special characters are replaced with dashes, such as 'production-tests'.`),Ume=new lo("<envs...>","One or more environment names to push").argOptional(),Mv=new lo("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),kv=new lo("<results>","Path to the results archive.").argRequired(),yv=q.object({apiKey:q.preprocess(r=>r!==void 0?r: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(Gl).optional(),wait:q.preprocess(r=>!!r,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 r=>{let e={},t;try{let n=Object.assign(e,yv.partial().parse(r));t=yv.parse(n)}catch(n){y.error(`Error parsing command line arguments: ${n.message}`),process.exit(1)}try{dN(t)}catch(n){y.error(`Invalid command line arguments: ${n.message}`),process.exit(1)}return t};var dN=r=>{for(let[e,t]of Object.entries(r))switch(e){case"shardIndex":if(!r.shardCount)throw new Error("The --shard-count flag must be provided alongside --shard-index");if(r.shardCount&&r.shardIndex&&r.shardIndex>r.shardCount)throw new Error("Shard index cannot be greater than shard count");if(r.shardIndex!==void 0&&r.shardIndex<1)throw new Error("Shard index must be greater than 0");break;case"waitTimeout":case"pixelRatio":try{r[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(n){throw new Error(`Invalid URL provided for ${e}`,{cause:n})}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}`);Sv().length<t*2&&y.warn(`You requested to run tests in parallel ${t} at a time on a machine with ${Sv().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);break;default:break}};function Kl(r){if(r===void 0)return;let e={};for(let t of r){let n=t.indexOf("=");if(n===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,n),i=t.slice(n+1);cN(o,i),e[o]=i}return e}async function uu(r){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 n=await r.client.getAuthInfo();return y.debug("Got auth info from API"),n}import{Console as Nv}from"console";import{format as Fa}from"util";var mu=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},Yl=class r extends Nv{_buffer=[];_groupDepth=0;Console=Nv;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new mu(void 0,r.write).stack;if(!i)return e;let a=i.split(`
3827
+ The suite path is a lowercased version of your suite name where spaces and special characters are replaced with dashes, such as 'production-tests'.`),$me=new co("<envs...>","One or more environment names to push").argOptional(),Uv=new co("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),Bv=new co("<results>","Path to the results archive.").argRequired(),Av=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(Wl).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(Ji).optional(),reporterDir:q.string().optional(),outputDir:q.string().optional(),uploadResults:q.boolean().optional(),saveCache:q.boolean().optional(),disableCache:q.boolean().optional()}),cn=async n=>{let e={},t;try{let r=Object.assign(e,Av.partial().parse(n));t=Av.parse(r)}catch(r){y.error(`Error parsing command line arguments: ${r.message}`),process.exit(1)}try{hN(t)}catch(r){y.error(`Invalid command line arguments: ${r.message}`),process.exit(1)}return t};var hN=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}`);Rv().length<t*2&&y.warn(`You requested to run tests in parallel ${t} at a time on a machine with ${Rv().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);break;default:break}};function Jl(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);mN(o,i),e[o]=i}return e}async function yu(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 zv}from"console";import{format as Us}from"util";var bu=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}},Xl=class n extends zv{_buffer=[];_groupDepth=0;Console=zv;constructor(){super({write:e=>(n.write(this._buffer,"log",e),!0)})}static write(e,t,r,o=2){let i=new bu(void 0,n.write).stack;if(!i)return e;let s=i.split(`
3828
3828
  `).slice(o).filter(Boolean).join(`
3829
- `);return e.push({message:n,origin:a,type:t}),e}_log(e,t){r.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",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 _v(r){let e=globalThis.console,t=new Yl;globalThis.console=t;try{r()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
3829
+ `);return e.push({message:r,origin:s,type:t}),e}_log(e,t){n.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Us(e,...t))}error(e,...t){this._log("error",Us(e,...t))}info(e,...t){this._log("info",Us(e,...t))}log(e,...t){this._log("log",Us(e,...t))}warn(e,...t){this._log("warn",Us(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function Hv(n){let e=globalThis.console,t=new Xl;globalThis.console=t;try{n()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
3830
3830
  `);process.stderr.write(`${o}
3831
- `),globalThis.console=e}}var uN=5;async function Jl({getResults:r,checkDone:e,name:t,timeoutMs:n=ru}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>uN&&(y.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{a=await r(),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(n/100));await new Promise(c=>setTimeout(c,l))}y.error(`Timeout elapsed waiting for ${t} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function xi({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(l=>l.status==="PASSED"),a=r.filter(l=>l.status==="FAILED"),s=r.filter(l=>l.status==="CANCELLED");return _v(()=>{a.forEach(l=>{y.log(""),o(l)}),a.length&&(y.log(""),y.error(`${a.length} ${t}s failed:`),a.forEach(l=>{y.dimmed(n(l))})),s.length&&(y.log(""),y.warn(`${s.length} ${t}s cancelled:`),s.forEach(l=>{y.dimmed(n(l))})),i.length&&(y.log(""),y.success(`${i.length} ${t}s passed:`),i.forEach(l=>{y.dimmed(n(l))})),y.log(""),y.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{passed:i.length,failed:a.length,cancelled:s.length}}var Xl=(r,e)=>{if(!r.failureDetails||!r.failureReason)return;let t=is[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Io[r.failureReason];y.error(e),y.log(`${jt}Reason: ${Dv.red(t)}`),y.log(`${jt}Description: ${Dv.red(n)}`)};async function hu({fix:r,project:e}){let t=we(e,y),n=Object.values(t.tests),o={},i={},a={},s=new Set,l={},c=new Set,d=0;for(let u of n)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,v=!1;f.steps=f.steps.map((x,b)=>{x.id||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) does not have an ID`),v=!0,r&&(S=!0,x.id=po())),Fv.string().uuid().safeParse(x.id)||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has an ID that does not parse as a UUID: '${x.id}'`),v=!0,r&&(S=!0,x.id=po()));let T=o[x.id]?.testId,C=o[x.id]?.testRelativePath;if(T?(d++,v=!0,T===u.id?y.error(`Multiple steps in the test '${u.name}' (${u.relativePath}) have the same ID '${x.id}'`):y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has the ID ${x.id} which is duplicated in ${C}`),r&&(S=!0,x.id=po())):o[x.id]={testId:u.id,testRelativePath:u.relativePath},x.type==="PRESET_ACTION"){let A=x.command.id,N=a[A]?.testId,L=a[A]?.testRelativePath;N?(d++,v=!0,N===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}`),r&&(S=!0,x.command.id=po())):a[A]={testId:u.id,testRelativePath:u.relativePath}}return be.parse(x)}),v&&y.dimmed("=".repeat(80)),S&&r&&(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,v=!1,x=g.map((b,T)=>{if(Fv.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}'`),v=!0,r&&(S=!0,b.id=po())),o[b.id]?.testId){let A=o[b.id]?.testRelativePath;d++,v=!0,y.error(`Step ${T} in module '${u.name}' (${u.relativePath}) has the ID ${b.id} which is duplicated in test ${A}`),r&&(S=!0,b.id=po())}if(b.type==="PRESET_ACTION"){let A=b.command.id,N=a[A],L=l[A];N||L?(d++,v=!0,L?.moduleId===u.id?y.error(`Multiple commands in module '${u.name}' (${u.relativePath}) have the same ID '${A}'`):N?y.error(`Command in module '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in test ${N.testRelativePath}`):y.error(`Command ${T} in module '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in module ${L.moduleRelativePath}`),r&&(S=!0,b.command.id=po())):l[A]={moduleId:u.id,moduleRelativePath:u.relativePath}}return be.parse(b)});v&&y.dimmed("=".repeat(80)),S&&r&&(Yr({content:{...m,steps:x},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 Uv({fix:r,project:e}){let{errors:t,modifiedTestFilePaths:n,modifiedModuleFilePaths:o}=await hu({fix:r,project:e});t>0?(y.error(`Found errors in ${t} steps`),r?(y.warn(`Modified the following test files:
3832
- ${[...n].map(i=>`${jt}- ${i}`).join(`
3831
+ `),globalThis.console=e}}var fN=5;async function Zl({getResults:n,checkDone:e,name:t,timeoutMs:r=au}){let o=Date.now(),i=0;for(;Date.now()-o<r;){let s;i>fN&&(y.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{s=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(s))return s;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 Ei({results:n,startTime:e,entity:t,getDisplayLine:r,onFailed:o}){let i=n.filter(l=>l.status==="PASSED"),s=n.filter(l=>l.status==="FAILED"),a=n.filter(l=>l.status==="CANCELLED");return Hv(()=>{s.forEach(l=>{y.log(""),o(l)}),s.length&&(y.log(""),y.error(`${s.length} ${t}s failed:`),s.forEach(l=>{y.dimmed(r(l))})),a.length&&(y.log(""),y.warn(`${a.length} ${t}s cancelled:`),a.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:s.length,cancelled:a.length}}var Ql=(n,e)=>{if(!n.failureDetails||!n.failureReason)return;let t=sa[n.failureDetails?.classification?.reason||n.failureReason],r=n.failureDetails?.classification?.summary||Lo[n.failureReason];y.error(e),y.log(`${Wt}Reason: ${jv.red(t)}`),y.log(`${Wt}Description: ${jv.red(r)}`)};async function wu({fix:n,project:e}){let t=be(e,y),r=Object.values(t.tests),o={},i={},s={},a=new Set,l={},c=new Set,d=0;for(let u of r)try{let m=Zr(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=wt.parse(m),f=await Vr(g,h,y),S=!1,v=!1;f.steps=f.steps.map((x,b)=>{x.id||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) does not have an ID`),v=!0,n&&(S=!0,x.id=uo())),$v.string().uuid().safeParse(x.id)||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has an ID that does not parse as a UUID: '${x.id}'`),v=!0,n&&(S=!0,x.id=uo()));let T=o[x.id]?.testId,C=o[x.id]?.testRelativePath;if(T?(d++,v=!0,T===u.id?y.error(`Multiple steps in the test '${u.name}' (${u.relativePath}) have the same ID '${x.id}'`):y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has the ID ${x.id} which is duplicated in ${C}`),n&&(S=!0,x.id=uo())):o[x.id]={testId:u.id,testRelativePath:u.relativePath},x.type==="PRESET_ACTION"){let A=x.command.id,N=s[A]?.testId,O=s[A]?.testRelativePath;N?(d++,v=!0,N===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 ${O}`),n&&(S=!0,x.command.id=uo())):s[A]={testId:u.id,testRelativePath:u.relativePath}}return ve.parse(x)}),v&&y.dimmed("=".repeat(80)),S&&n&&(Wn({relativeTestPath:u.relativePath,steps:{beforeSteps:m.beforeSteps,steps:f.steps,afterSteps:m.afterSteps},schemaVersion:_e,project:e}),a.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 Vr({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,v=!1,x=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}'`),v=!0,n&&(S=!0,b.id=uo())),o[b.id]?.testId){let A=o[b.id]?.testRelativePath;d++,v=!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=uo())}if(b.type==="PRESET_ACTION"){let A=b.command.id,N=s[A],O=l[A];N||O?(d++,v=!0,O?.moduleId===u.id?y.error(`Multiple commands in module '${u.name}' (${u.relativePath}) have the same ID '${A}'`):N?y.error(`Command in module '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in test ${N.testRelativePath}`):y.error(`Command ${T} in module '${u.name}' (${u.relativePath}) has the ID ${A} which is duplicated in module ${O.moduleRelativePath}`),n&&(S=!0,b.command.id=uo())):l[A]={moduleId:u.id,moduleRelativePath:u.relativePath}}return ve.parse(b)});v&&y.dimmed("=".repeat(80)),S&&n&&(Jr({content:{...m,steps:x},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:a,modifiedModuleFilePaths:c}}async function Gv({fix:n,project:e}){let{errors:t,modifiedTestFilePaths:r,modifiedModuleFilePaths:o}=await wu({fix:n,project:e});t>0?(y.error(`Found errors in ${t} steps`),n?(y.warn(`Modified the following test files:
3832
+ ${[...r].map(i=>`${Wt}- ${i}`).join(`
3833
3833
  `)}`),o.size>0&&y.warn(`Modified the following module files:
3834
- ${[...o].map(i=>`${jt}- ${i}`).join(`
3835
- `)}`)):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 Bv({project:r}){let e=we(r,y),t=Object.values(e.tests),n=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 n)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 mN}from"lodash-es";async function zv({client:r,skipPrompts:e,project:t}){let n=await r.getAllEnvironments(),o=mN(t.config);o.environments||(o.environments=[]);for(let i of n){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})}}Qo(o,t.configFilePath),y.success(`Pulled ${n.length} environments successfully! Please make sure to commit any changes to your project configuration file.`)}import{createHash as Hv}from"crypto";import jv from"fs";async function gu({testsToFetch:r,client:e,all:t,yes:n}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:r,all:t}),a=0;for(let[l,c]of Object.entries(o)){let d=$v(l,Ae.TEST);!n&&!await nu(d)||(a+=1,jv.writeFileSync(d,c,"utf-8"),ee.info({checksum:Hv("md5").update(c).digest("hex")},`Wrote '${d}'`))}let s=0;for(let[l,c]of Object.entries(i)){let d=$v(l,Ae.MODULE);!n&&!await nu(d)||(s+=1,jv.writeFileSync(d,c,"utf-8"),ee.info({checksum:Hv("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 $v(r,e){switch(e){case Ae.TEST:return`${ke(r)}.${Mt.TEST}`;case Ae.MODULE:return`${ke(r)}.${Mt.MODULE}`;default:throw new Error(`Unknown entity type ${e}`)}}async function Gv(r){let{project:e,client:t,skipPrompts:n}=r;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 zv({client:t,project:e,skipPrompts:n}),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 gu({testsToFetch:[],client:t,all:!0,yes:n}),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 Wv(r){let{client:e,skipPrompts:t,paths:n}=r;await gu({testsToFetch:n,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 hN from"fs";import{tmpdir as gN}from"os";import fN from"path";import{registry as Ua}from"playwright-core/lib/server";import Vv from"proper-lockfile";var qv=fN.join(gN(),"momenticBrowserInstallation");var fu=["chrome","chromium","chrome-for-testing"],SN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},Kv={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell"};function Yv(r){let e=Kv[SN[r]??""]??"",t=Ua.findExecutable(e);return!t||t.installType==="none"?!1:Su(t)}function Su(r){let e=r.executablePath();return hN.existsSync(e)}function yN(r,e){let t=Kv[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=Ua.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Su(n)))return n}async function bN({browser:r,force:e}){let t=yN(r,e);if(!t){y.info(`Browser '${r}' is already installed, skipping...`);return}y.info(`Installing browser '${r}'...`);try{await Ua.installDeps([t],!1),await Ua.install([t],!1)}catch(n){if(n.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(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Su(o);)y.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function Jv({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?fu:Array.from(new Set(r));try{await Vv.lock(qv,{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 n)try{await bN({browser:o,force:e})}catch(i){y.error(`Failed to install the ${o} browser: ${i}`)}}finally{await Vv.unlock(qv,{realpath:!1})}}async function Xv(r){let e=we(r,y),t=Object.values(e.tests);for(let n of t)try{let o=Xr(n.fullFilePath,y,e),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){y.debug(`Test ${n.name} (${n.relativePath}) has no steps, skipping...`);continue}let a=vt.parse(o),s=await Wr(a,i,y);y.dimmed(`Updating ${n.relativePath}`),Wn({relativeTestPath:n.relativePath,steps:{beforeSteps:o.beforeSteps,steps:s.steps,afterSteps:o.afterSteps},schemaVersion:_e,project:r,forceSaveOnNoDiffs:!0})}catch(o){y.error({err:o},`Failed to read or migrate test ${n.name} (${n.relativePath}), continuing...`)}for(let n of Object.values(e.modules)){y.dimmed(`Updating ${n.relativePath}`);try{let o=Gn(n.fullFilePath,y),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){y.debug(`Module ${n.name} (${n.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:r,forceSaveOnNoDiffs:!0})}catch(o){y.error({err:o},`Failed to read or migrate module ${n.name} (${n.relativePath}), continuing...`)}}}import{spawnSync as vN}from"child_process";import{PostHog as wN}from"posthog-node";async function Zv(r,e){let t,n=0,o=3,i,a;for(;n<o;)try{let s=await D(r.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=s.featureFlags||{},a=s.featureFlagPayloads||{};break}catch(s){t=s,n++,await new Promise(l=>setTimeout(l,100*n))}if(i&&a)return{flags:i,payloads:a};throw t}var Zl=class r extends ta{constructor(t,n,o,i){super(o,i);this.client=t;this.orgId=n}static async init(t){let n=new wN("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await Zv(n,t);return new r(n,t,o,i)}async refresh(){let{flags:t,payloads:n}=await Zv(this.client,this.orgId);this.flags=t,this.payloads=n}};function xN(){try{let e=vN("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(r){let e=r instanceof Error?r.message:String(r);y.warn(`Could not determine Git main branch. Please set it manually in your project configuration under the 'gitMainBranch' field. Error:
3836
- ${e}`)}}async function Qv({project:r,orgId:e,apiClient:t}){y.info("Pulling browser and AI configuration options from Cloud");let n=await Zl.init(e);r.config.browser={autoExpandIframes:n.isBooleanFlagEnabled("auto_expand_iframes"),disableSecondaryCacheResolution:n.isBooleanFlagEnabled("disable_secondary_cache_resolution"),globalLocatorRedirect:n.isBooleanFlagEnabled("global_locator_redirect"),visualActions:n.isBooleanFlagEnabled("visual_actions"),...r.config.browser},r.config.advanced={fakerConstantSeed:n.isBooleanFlagEnabled("faker_constant_seed"),...r.config.advanced},r.config.ai={aiPageFiltering:n.isBooleanFlagEnabled("rag_v2"),agentConfig:await t.getAgentConfig(),...r.config.ai},y.info(`Updated ${r.configFilePath} to include V2 browser and AI configuration options`),y.info("Determining main Git branch"),r.config.gitMainBranch=xN(),Qo(r.config,r.configFilePath),y.success("Migration complete!")}function ex(r){return r?ke(r):"Unknown suite"}async function tx({client:r,orgId:e,suitePaths:t,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await r.queueSuiteRuns({paths:t,...i});ee.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:t},"Queued suites remotely"),y.dimmed(`Queued ${t.length} suites.`),n||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(v=>v.status==="FAILED"&&(v.failureReason||v.finishedAt&&Date.now()-v.finishedAt.getTime()>30*1e3)||v.status==="PASSED"||v.status==="CANCELLED"),u=await Jl({name:"suites",getResults:async()=>{let f=s.filter(x=>!d.some(b=>b.id===x)),S=await r.bulkGetRunGroupStatus(f),v=[];for(let x of S)p(x)?d.push(x):v.push(x);return[...d,...v]},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} ${ex(S.suite?.name)}`)))}),f.every(p))}),m=r.getAppUrl(),g=xi({results:u,startTime:l,onFailed:f=>{let S=ex(f.suite?.name),v=f.runs.filter(b=>b.status==="FAILED").length,x=f.runs.length;y.error(`${S} (${v}/${x} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let T=b.testName||b.test?.name;y.error(` ${T?ke(T):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?ke(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function nx({tests:r,client:e,orgId:t,...n}){!n.yes&&!await ft(`This command will queue ${r.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${e.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await e.queueTests({testPaths:r,...n});if(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.`),n.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 Jl({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:n.waitTimeout?n.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} ${ke(g)}`)}}),m.every(l))}),u=xi({results:p,startTime:d,onFailed:m=>{let h=m.testName||m.test?.name;Xl(m,h?ke(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?ke(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 YN}from"chalk";import JN from"fs";import{existsSync as _N,mkdirSync as DN,statSync as FN}from"fs";import{randomUUID as yu}from"crypto";import Ql from"fs";import{hostname as TN}from"os";import Ba from"path";async function ec(r,e,t,n,o){if(n){let i=Ba.extname(n),a=`${yu()}-screenshot${i}`,s=Ba.join(t,a),c=await(await fetch(n)).arrayBuffer();return Ql.writeFileSync(s,Buffer.from(c)),a}if(o){let i=await e.getScreenshot(r,o);if(i){let a=`${o}-screenshot.jpeg`,s=Ba.join(t,a);return Ql.writeFileSync(s,i),a}}}async function EN(r,e,t,n){let o=n.runId??yu(),i={uuid:o,historyId:o,testCaseId:n.test.id,fullName:n.test.name,name:ke(n.test.name),status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"skipped":"failed",start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:TN()},{name:"platform",value:"momentic"},{name:"attempts",value:n.attempts.toString()}],steps:[]};n.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${n.runId}`});for(let[s,l]of Object.entries(n.parameters))l!=null&&i.parameters.push({name:s,value:JSON.stringify(l)});n.results&&await CN(r,e,t.folder,i.steps,n.results);let a=`${o}-result.json`;Ql.writeFileSync(Ba.join(t.folder,a),JSON.stringify(i,void 0,2))}async function Ti(r,e,t,n){let o={name:un(n),start:n.startedAt.getTime(),stop:n.finishedAt.getTime(),status:n.status==="SUCCESS"?"passed":n.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};n.beforeUrl&&o.labels?.push({name:"URL before step",value:n.beforeUrl}),n.afterUrl&&o.labels?.push({name:"URL after step",value:n.afterUrl});let i=await ec(r,e,t,n.beforeScreenshot,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await ec(r,e,t,n.afterScreenshot,n.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),n.message&&(o.statusDetails={message:n.message}),n.data){let s=`${yu()}-attachment.json`,l=Ba.join(t,s);Ql.writeFileSync(l,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:s,type:"text/plain"})}return o}async function CN(r,e,t,n,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{n.push(await Ti(r,e,t,i));break}case"CONDITIONAL":{let a=await Ti(r,e,t,i);a.steps=[],i.assertion&&a.steps.push(await Ti(r,e,t,i.assertion)),a.steps.push(...await Promise.all(i.results.map(s=>Ti(r,e,t,s)))),n.push(a);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let a=await Ti(r,e,t,i);if(a.steps=await Promise.all(i.results.map(s=>Ti(r,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})}n.push(a)}}}async function rx(r,e,t,n){for(let o of n.runs)await EN(r,e,{folder:t,suiteName:n.suiteName},o)}import ox from"junit-report-builder";import ix from"path";function RN(r,e){let t=e??ox.testCase();if(t.name(r.test.name).className(r.test.name).file(ix.relative(".",r.filePath)).property("id",r.test.id),r.baseUrl&&t.property("baseUrl",r.baseUrl),r.runId&&t.property("runUrl",`https://app.momentic.ai/runs/${r.runId}`),r.status==="FAILED"){if(r.failureReason){let n=is[r.failureDetails?.classification?.reason||r.failureReason],o=r.failureDetails?.classification?.summary||Io[r.failureReason];r.runId&&(o+=` See details: https://app.momentic.ai/runs/${r.runId}`),t.failure(o,n)}r.failureDetails?.errorStack&&t.stacktrace(r.failureDetails.errorStack)}else r.status==="CANCELLED"&&t.skipped();t.time((r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime())/1e3).property("startedAt",r.lastAttemptStartedAt.toISOString()).property("finishedAt",r.finishedAt.toISOString()).property("attempts",r.attempts.toString());for(let n of["testInputs","customHeaders"]){let o=r.parameters[n];Object.keys(o??{}).length>0&&t.multilineProperty(n,JSON.stringify(o))}for(let n of["envName","urlOverride"])r.parameters[n]!==void 0&&t.property(n,r.parameters[n]);return Object.keys(r.outputs).length&&t.multilineProperty("testOutputs",JSON.stringify(r.outputs)),t}function AN(r,{suiteId:e,suiteName:t,startedAt:n,finishedAt:o,runs:i}){let a=r.testSuite().name(t);e&&a.property("id",e),a.timestamp(n).property("startedAt",n.toISOString()).property("finishedAt",o.toISOString()).time((o.getTime()-n.getTime())/1e3);for(let s of i){let l=a.testCase();RN(s,l)}return a}function ax(r,e){let t=ox.newBuilder();AN(t,e),t.writeTo(ix.join(r,`${e.suiteName}.xml`))}import IN from"fs";import PN from"path";function sx(r){return{title:un(r),duration:r.finishedAt.getTime()-r.startedAt.getTime(),error:r.status==="FAILED"?{value:r.failureReason}:void 0,steps:r.results&&r.type!=="PRESET_ACTION"?r.results.map(sx):[]}}async function LN(r,e,t,n){if(n.results?.length){let o=await ec(r,e,t,n.results[n.results.length-1].afterScreenshot,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function ON(r,e,t,n){return{status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"interrupted":"failed",duration:n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime(),error:n.status==="FAILED"&&n.failureReason?{value:n.failureDetails?.classification?.reason||n.failureReason,message:n.failureDetails?.classification?.summary||Io[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(sx)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await LN(r,e,t,n)}}async function MN(r,e,t,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await ON(r,e,t,n)]}}async function kN(r,e,t,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await MN(r,e,t,n)],id:n.runId,file:n.filePath}}function bu(r,e){return r.reduce((t,n)=>e(n)?t+1:t,0)}async function NN(r,e,t,n){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(n.runs.map(o=>kN(r,e,t,o)))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:bu(n.runs,o=>o.status==="PASSED"),unexpected:bu(n.runs,o=>o.status!=="PASSED"),flaky:bu(n.runs,o=>!!o.isFlake),skipped:0}}}async function lx(r,e,t,n){let o=await NN(r,e,t,n);IN.writeFileSync(PN.join(t,`${n.suiteName}.json`),JSON.stringify(o,null,2))}async function cx(r,e,t,n,o){switch(_N(o)?FN(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...`),DN(o,{recursive:!0})),t){case"junit":ax(o,n);return;case"allure":case"allure-json":await rx(r,e,o,n);return;case"playwright-json":await lx(r,e,o,n);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import XN from"wait-on";import wu from"fs";import{compact as UN}from"lodash-es";import vu from"path";import{cwd as BN}from"process";import zN from"semver";async function dx({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,labels:a}){let s=new Set;if(r&&r.length>0){let c=r.some(p=>wu.existsSync(p)),d=BN();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:
3837
- ${r.map(p=>`${jt}- ${p}`).join(`
3834
+ ${[...o].map(i=>`${Wt}- ${i}`).join(`
3835
+ `)}`)):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 Wv({project:n}){let e=be(n,y),t=Object.values(e.tests),r=await $a(e,ee),o={},i={},s={},a={},l=new Set,c=new Set,d=new Set,p=new Set;for(let m of t)o[m.id]?s[m.id]?s[m.id].push(m.fullFilePath):s[m.id]=[o[m.id],m.fullFilePath]:o[m.id]=m.fullFilePath,i[m.name]?a[m.name]?a[m.name].push(m.fullFilePath):a[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(s).length>0||Object.entries(a).length>0||l.size>0||c.size>0){for(let[m,h]of Object.entries(s))for(let g of h)y.error(`Test ID ${m} is duplicated in ${g}`);for(let[m,h]of Object.entries(a))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 SN}from"lodash-es";async function Vv({client:n,skipPrompts:e,project:t}){let r=await n.getAllEnvironments(),o=SN(t.config);o.environments||(o.environments=[]);for(let i of r){let s=o.environments?.find(a=>a.name===i.name);if(s)!e&&!await ft(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),s.baseUrl=i.variables[We],delete i.variables[We],s.envVariables=i.variables;else{let a=i.variables[We];delete i.variables[We],o.environments.push({name:i.name,baseUrl:a,envVariables:i.variables})}}ti(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 qv}from"crypto";import Kv from"fs";async function vu({testsToFetch:n,client:e,all:t,yes:r}){let{tests:o,modules:i}=await e.getTestYAMLExport({paths:n,all:t}),s=0;for(let[l,c]of Object.entries(o)){let d=Yv(l,Ae.TEST);!r&&!await su(d)||(s+=1,Kv.writeFileSync(d,c,"utf-8"),ee.info({checksum:qv("md5").update(c).digest("hex")},`Wrote '${d}'`))}let a=0;for(let[l,c]of Object.entries(i)){let d=Yv(l,Ae.MODULE);!r&&!await su(d)||(a+=1,Kv.writeFileSync(d,c,"utf-8"),ee.info({checksum:qv("md5").update(c).digest("hex")},`Wrote '${d}'`))}s===0?y.success("Pulled 0 tests."):y.success(`Pulled ${s} test${s>1?"s":""}${a?` and ${a} module${a>1?"s":""}`:""}!`)}function Yv(n,e){switch(e){case Ae.TEST:return`${ke(n)}.${Nt.TEST}`;case Ae.MODULE:return`${ke(n)}.${Nt.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 Vv({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 vu({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 Xv(n){let{client:e,skipPrompts:t,paths:r}=n;await vu({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 yN from"fs";import{tmpdir as bN}from"os";import wN from"path";import{registry as Bs}from"playwright-core/lib/server";import Zv from"proper-lockfile";var Qv=wN.join(bN(),"momenticBrowserInstallation");var xu=["chrome","chromium","chrome-for-testing"],vN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},ex={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell"};function tx(n){let e=ex[vN[n]??""]??"",t=Bs.findExecutable(e);return!t||t.installType==="none"?!1:Tu(t)}function Tu(n){let e=n.executablePath();return yN.existsSync(e)}function xN(n,e){let t=ex[n];if(!t)throw new Error(`Requested install of unknown browser type ${n}`);let r=Bs.findExecutable(t);if(!r||r.installType==="none")throw new Error(`Requested install of unknown browser type ${n}`);if(!(!e&&Tu(r)))return r}async function TN({browser:n,force:e}){let t=xN(n,e);if(!t){y.info(`Browser '${n}' is already installed, skipping...`);return}y.info(`Installing browser '${n}'...`);try{await Bs.installDeps([t],!1),await Bs.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=Bs.findExecutable(n),i=5*60*1e3,s=Date.now();for(;Date.now()-s<i&&!Tu(o);)y.info("Waiting for browser to finish installing..."),await new Promise(a=>setTimeout(a,5e3))}else throw r}}async function nx({rawBrowsers:n,force:e=!1,all:t=!1}){let r=t?xu:Array.from(new Set(n));try{await Zv.lock(Qv,{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 TN({browser:o,force:e})}catch(i){y.error(`Failed to install the ${o} browser: ${i}`)}}finally{await Zv.unlock(Qv,{realpath:!1})}}async function rx(n){let e=be(n,y),t=Object.values(e.tests);for(let r of t)try{let o=Zr(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 s=wt.parse(o),a=await Vr(s,i,y);y.dimmed(`Updating ${r.relativePath}`),Wn({relativeTestPath:r.relativePath,steps:{beforeSteps:o.beforeSteps,steps:a.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 s=await Vr({id:o.moduleId,schemaVersion:o.schemaVersion},i,y);Jr({content:{...o,steps:s.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 CN}from"child_process";import{PostHog as EN}from"posthog-node";async function ox(n,e){let t,r=0,o=3,i,s;for(;r<o;)try{let a=await D(n.getAllFlagsAndPayloads(e),{milliseconds:5e3});i=a.featureFlags||{},s=a.featureFlagPayloads||{};break}catch(a){t=a,r++,await new Promise(l=>setTimeout(l,100*r))}if(i&&s)return{flags:i,payloads:s};throw t}var ec=class n extends ns{constructor(t,r,o,i){super(o,i);this.client=t;this.orgId=r}static async init(t){let r=new EN("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await ox(r,t);return new n(r,t,o,i)}async refresh(){let{flags:t,payloads:r}=await ox(this.client,this.orgId);this.flags=t,this.payloads=r}};function RN(){try{let e=CN("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:
3836
+ ${e}`)}}async function ix({project:n,orgId:e,apiClient:t}){y.info("Pulling browser and AI configuration options from Cloud");let r=await ec.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=RN(),ti(n.config,n.configFilePath),y.success("Migration complete!")}function sx(n){return n?ke(n):"Unknown suite"}async function ax({client:n,orgId:e,suitePaths:t,wait:r,waitTimeout:o,...i}){let{suiteRunIds:s,runGroupIds:a}=await n.queueSuiteRuns({paths:t,...i});ee.info({orgId:e,suiteRunIds:s,runGroupIds:a,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(v=>v.status==="FAILED"&&(v.failureReason||v.finishedAt&&Date.now()-v.finishedAt.getTime()>30*1e3)||v.status==="PASSED"||v.status==="CANCELLED"),u=await Zl({name:"suites",getResults:async()=>{let f=a.filter(x=>!d.some(b=>b.id===x)),S=await n.bulkGetRunGroupStatus(f),v=[];for(let x of S)p(x)?d.push(x):v.push(x);return[...d,...v]},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}/${a.length} ${sx(S.suite?.name)}`)))}),f.every(p))}),m=n.getAppUrl(),g=Ei({results:u,startTime:l,onFailed:f=>{let S=sx(f.suite?.name),v=f.runs.filter(b=>b.status==="FAILED").length,x=f.runs.length;y.error(`${S} (${v}/${x} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let T=b.testName||b.test?.name;y.error(` ${T?ke(T):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?ke(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function lx({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 s=new Set,a=[],l=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",c=e.getAppUrl(),d=Date.now(),p=await Zl({name:"runs",getResults:async()=>{let m=i.filter(f=>!a.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)l(f)?a.push(f):g.push(f);return[...a,...g]},timeoutMs:r.waitTimeout?r.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(h=>{if(h.status==="RUNNING"&&!s.has(h.id)){s.add(h.id);let g=h.testName||h.test?.name;g&&y.log(`${s.size}/${o.length} ${ke(g)}`)}}),m.every(l))}),u=Ei({results:p,startTime:d,onFailed:m=>{let h=m.testName||m.test?.name;Ql(m,h?ke(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?ke(h):"Unknown test"}`;return m.id&&(g+=` (${c}/runs/${m.id})`),g},entity:"test"});process.exit(u.failed>0?1:0)}import Ri,{supportsColor as QN}from"chalk";import e_ from"fs";import{existsSync as BN,mkdirSync as zN,statSync as HN}from"fs";import{randomUUID as Eu}from"crypto";import tc from"fs";import{hostname as AN}from"os";import zs from"path";async function nc(n,e,t,r,o){if(r){let i=zs.extname(r),s=`${Eu()}-screenshot${i}`,a=zs.join(t,s),c=await(await fetch(r)).arrayBuffer();return tc.writeFileSync(a,Buffer.from(c)),s}if(o){let i=await e.getScreenshot(n,o);if(i){let s=`${o}-screenshot.jpeg`,a=zs.join(t,s);return tc.writeFileSync(a,i),s}}}async function IN(n,e,t,r){let o=r.runId??Eu(),i={uuid:o,historyId:o,testCaseId:r.test.id,fullName:r.test.name,name:ke(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:AN()},{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[a,l]of Object.entries(r.parameters))l!=null&&i.parameters.push({name:a,value:JSON.stringify(l)});r.results&&await PN(n,e,t.folder,i.steps,r.results);let s=`${o}-result.json`;tc.writeFileSync(zs.join(t.folder,s),JSON.stringify(i,void 0,2))}async function Ci(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 nc(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let s=await nc(n,e,t,r.afterScreenshot,r.afterSnapshot);if(s&&o.attachments.push({name:"Screenshot after step",source:s,type:"image/jpeg"}),r.message&&(o.statusDetails={message:r.message}),r.data){let a=`${Eu()}-attachment.json`,l=zs.join(t,a);tc.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:a,type:"text/plain"})}return o}async function PN(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await Ci(n,e,t,i));break}case"CONDITIONAL":{let s=await Ci(n,e,t,i);s.steps=[],i.assertion&&s.steps.push(await Ci(n,e,t,i.assertion)),s.steps.push(...await Promise.all(i.results.map(a=>Ci(n,e,t,a)))),r.push(s);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let s=await Ci(n,e,t,i);if(s.steps=await Promise.all(i.results.map(a=>Ci(n,e,t,a))),i.type==="MODULE"&&i.inputs){s.parameters=[];for(let[a,l]of Object.entries(i.inputs))s.parameters.push({name:a,value:l})}r.push(s)}}}async function cx(n,e,t,r){for(let o of r.runs)await IN(n,e,{folder:t,suiteName:r.suiteName},o)}import dx from"junit-report-builder";import Cu from"path";function LN(n,e){let t=e??dx.testCase();if(t.name(n.test.name).className(n.test.name).file(Cu.relative(".",n.filePath)).property("id",n.test.id),n.test.labels&&(t.property("labels",n.test.labels.join(",")),n.test.labels.forEach(r=>{t.property("dd_tags[label]",r)})),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=sa[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||Lo[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 ON(n,{suiteId:e,suiteName:t,startedAt:r,finishedAt:o,runs:i,skippedTests:s}){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 l of i){let c=a.testCase();LN(l,c)}for(let l of s){let c=a.testCase();c.name(l.name).className(l.name).file(Cu.relative(".",l.relativeFilePath)).property("id",l.id),l.baseUrl&&c.property("baseUrl",l.baseUrl),l.labels&&(c.property("labels",l.labels.join(",")),l.labels.forEach(d=>{c.property("dd_tags[label]",d)})),c.skipped()}return a}function px(n,e){let t=dx.newBuilder();ON(t,e),t.writeTo(Cu.join(n,`${e.suiteName}.xml`))}import MN from"fs";import kN from"path";function ux(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(ux):[]}}async function NN(n,e,t,r){if(r.results?.length){let o=await nc(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 _N(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||Lo[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(ux)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await NN(n,e,t,r)}}async function DN(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await _N(n,e,t,r)]}}async function FN(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await DN(n,e,t,r)],id:r.runId,file:r.filePath}}function Ru(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function UN(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>FN(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:Ru(r.runs,o=>o.status==="PASSED"),unexpected:Ru(r.runs,o=>o.status!=="PASSED"),flaky:Ru(r.runs,o=>!!o.isFlake),skipped:0}}}async function mx(n,e,t,r){let o=await UN(n,e,t,r);MN.writeFileSync(kN.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function hx(n,e,t,r,o){switch(BN(o)?HN(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...`),zN(o,{recursive:!0})),t){case"junit":px(o,r);return;case"allure":case"allure-json":await cx(n,e,o,r);return;case"playwright-json":await mx(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import t_ from"wait-on";import Au from"fs";import{compact as jN}from"lodash-es";import Iu from"path";import{cwd as $N}from"process";import GN from"semver";async function rc({tests:n,momenticFiles:e,project:t,yes:r,include:o,exclude:i,labels:s,logger:a}){let l=new Set;if(n&&n.length>0){let d=n.some(u=>Au.existsSync(u)),p=$N();d?(p!==t.rootDir&&a.warn(`The current working directory ('${p}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),a.info(`Reading tests from the following local file paths:
3837
+ ${n.map(u=>`${Wt}- ${u}`).join(`
3838
3838
  `)}
3839
- `),r.forEach(p=>{if(!wu.existsSync(p))throw new Error(`Path '${p}' does not exist.`);let u,m;try{u=wu.statSync(p),m=u.isDirectory()}catch(g){y.warn({err:g},`Skipping path ${p} because it cannot be read`);return}let h=vu.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:
3840
- ${r.map(p=>`${jt}- ${p}`).join(`
3841
- `)}`),Object.values(e.tests).forEach(p=>{r.some(u=>p.relativePath.includes(u))&&s.add(p.fullFilePath)}))}else{!n&&!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=vu.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(zN.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:vu.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(UN)}import{cloneDeep as gx}from"lodash-es";async function px({orgId:r,codeEvalTools:e,logger:t,outputDefinitions:n,testContext:o,flagStore:i}){let a={};for(let s of n){let{name:l,value:c}=s;a[l]=await Ht({orgId:r,s:c,localTools:e,logger:t,context:o,flagStore:i})}return a}async function ux({baseUrl:r,envName:e,devicePixelRatio:t,apiClient:n,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:r,logger:d,localTools:a,orgId:l,flagStore:g}),S={baseUrl:n.baseUrl,apiKey:n.apiKey,logger:ee},v=g.isBooleanFlagEnabled("icon_knowledge_base")?await i.fetchIconKnowledgeBase(l,d):null,x=f.browserType??"Chromium";if(!Yv(x)){let A=`Browser ${x} 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:r,logger:d,userBrowserSettings:f,storage:i,flagStore:g,enricher:new li(S,s),contextArgs:{viewport:o.advanced.viewport??Vt,locale:o.advanced.locale??Po,geolocation:o.advanced.geolocation??Oo,timezoneId:o.advanced.timezone??Lo,colorScheme:o.advanced.colorScheme,deviceScaleFactor:t},iconKnowledgeBase:v}),T=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 It({baseUrl:r,currentUrl:T.browser.url(),variablesFromEnvironment:c,envName:e});return o.parameters&&await Promise.all(o.parameters.map(async A=>{let{name:N,defaultValue:L,required:$}=A,U=u?.[N];$&&U===void 0&&(y.error(`Required parameter '${N}' 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(N,M)})),{controller:T,context:C}}import{randomUUID as HN}from"crypto";async function mx({testId:r,apiClient:e,testAdvancedSettings:t,aiSettingsFromEnv:n,logger:o}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!n?.failureRecovery)return!1;let i;try{i=await e.getPastTestResults(r,{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 hx({attemptInputs:r,attemptFixtures:e,attemptMetadata:t}){let{attemptNumber:n,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:v,orgSettings:x}=r;h.info(`Running test '${v.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||HN(),runAttemptId:a,testMetadata:v,steps:v.steps,beforeSteps:v.beforeSteps,afterSteps:v.afterSteps},C={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await mx({currentAttempt:n,testId:v.id,flagStore:c,apiClient:g,testAdvancedSettings:v.advanced,aiSettingsFromEnv:x.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 fx(r){let{testDefinition:e,logger:t}=r,n=new Date;try{return await jN(r)}catch(o){let i="Fatal error running test";return y.error(`${i}: ${o.message}`),t.error({err:o},i),{parameters:r,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function jN(r){let{testDefinition:e,project:t,apiClient:n,orgId:o,urlOverride:i,runSigIntHandlers:a,runGroupTracer:s,logger:l,gitMetadata:c,alwaysSaveCache:d,noCache:p}=r,u=new ii(n,o),m=ci({client:n,gitMetadata:c,alwaysSaveCache:d,noCache:p}),h=gx(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=r.envName??GN(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 v=e.baseUrl;if(i)v=i;else if(!v){let T=S[Ge];typeof T=="string"&&(v=T)}if(!v){let T=`Cannot run test with no base URL and no ${Ge} variable defined in its environment`;throw new Error(T)}let x=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:v,environmentName:g,schemaVersion:e.schemaVersion}),b=l.child(x.loggerBindings||{});Object.entries(x.envVarBindings||{}).forEach(([T,C])=>{S[T]=C});try{let T=await $N({...r,variables:S,envName:g,stepsWithCaches:h,resolvedEnv:f,baseUrl:v,storageClient:u,tracer:x,logger:b,cacheStorage:m});return await x.finish({logger:l,status:T.status,finishedAt:T.finishedAt,failureDetails:T.failureDetails,failureReason:T.failureReason,isFlake:T.isFlake}),{runId:x.runId,...T}}finally{a?.pop()}}async function $N(r){let{testDefinition:e,stepsWithCaches:t,project:n,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:v,tracer:x,logger:b,flagStore:T,cacheStorage:C}=r,A=new Date,N=new ti(n,o),L={ai:n.config.ai},$={envName:d,urlOverride:p,customHeaders:u,testInputs:m},U,M=Math.abs(f??n.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 Y=await x.startAttempt(),B=b.child(Y.loggerBindings||{}),J={...e,steps:gx(t)};O!==0&&v("RETRY",`attempt ${O+1}/${M+1}`);let Q=new Date,St=new gr({httpClient:new kt({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:B}),fakerSeed:T.isBooleanFlagEnabled("faker_constant_seed")?wh:void 0});try{let{controller:re,context:Te}=await ux({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:{...n.config.browser||{},...g?.browser||{},...J.advanced},visualDiffScreenshotStorage:N,flagStore:T});U=await hx({attemptMetadata:{attemptNumber:O+1,orgId:c,runId:x.runId},attemptFixtures:{logger:B,storageClient:l,billingReporter:new Do,analytics:new yi,debugDataStorage:new Fr,codeEvalTools:St,flagStore:T,apiClient:i,context:Te,controller:re,tracer:Y},attemptInputs:{test:J,orgSettings:L}});let Me=new Date;U?.status==="PASSED"&&await ks({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 Y.finish({logger:B,result:U}),z.unshift(U.status);let Ft=await px({orgId:c,codeEvalTools:St,logger:B,outputDefinitions:e.outputs??[],testContext:Te,flagStore:T}),ln=Xm(z),Un=O+1;if(U.status!=="FAILED")return{...U,parameters:$,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Q,finishedAt:Me,attempts:Un,baseUrl:s,outputs:Ft,isFlake:ln};let er=U.failedStepResult,cn=er?.message||"Unknown failure",Ci=er?.failureReason??Lh(cn)??"UnknownError",Ri=B.child({errResult:er,failureReason:Ci,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:$,failureDetails:{errorMessage:cn},failureReason:Ci,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Q,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 Y.finish({logger:B,result:{status:"FAILED",results:[]}}),{...Un,parameters:$,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Q,finishedAt:new Date,attempts:Ft,baseUrl:s,outputs:{}}}}throw new Error("This code should not be reachable")}function GN(r){for(let e of r.envs??[])if(e.default)return e.name}import{randomUUID as yx}from"crypto";import WN from"adm-zip";import Zn from"fs";import uo from"path";var za=class r{constructor(e){this.filePath=e;Zn.rmSync(this.filePath,{recursive:!0,force:!0}),Zn.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(uo.join(this.filePath,e))}storeFile(e){let{name:t,contents:n}=e,o=uo.join(this.filePath,t);Zn.writeFileSync(o,n)}createRunArchive(e){return new xu(uo.join(this.filePath,"runs"),e)}},xu=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:n}=e,o=uo.join(this.tempPath,t);Zn.writeFileSync(o,n)}close(){let e=new WN;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();Zn.writeFileSync(this.finalPath,t),Zn.rmSync(this.tempPath,{recursive:!0,force:!0})}};async function Sx(r,e,t,n,o){let i=Zi(o.type);if(i&&await e.reportCreditsUsed(r,o.type,i,{testId:t,testName:n}),"command"in o){let a=Qi(o.command);a&&await e.reportCreditsUsed(r,o.command.type,a,{testId:t,testName:n})}}function VN(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function qN(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Tu=class{constructor(e,t,n,o,i,a){this.testId=e;this.testName=t;this.metadata=n;this.diskStorage=o;this.billingReporter=i;this.asyncWork=a}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.jpeg",contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.jpeg",contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.beforeSnapshotId=t,this.diskStorage.storeFile({name:"before.html",contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:t,html:n}=e;this.metadata.afterSnapshotId=t,this.diskStorage.storeFile({name:"after.html",contents:n})}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(n=>n.finish({status:qN(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 tc(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},tc=class{constructor(e,t,n,o,i){this.testId=e;this.testName=t;this.diskStorage=n;this.billingReporter=o;this.asyncWork=i}children=[];finished=!1;getParentStepIdChain(){return[]}async startStep(e){let{logger:t,step:n}=e;this.asyncWork.push(Sx(t,this.billingReporter,this.testId,this.testName,n));let o=this.diskStorage.cd(n.id),i={step:n,status:"RUNNING",startedAt:new Date};o.storeFile({name:"metadata.json",contents:JSON.stringify(i,null,2)});let a=new Tu(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:VN(e.status),finishedAt:e.finishedAt}))))}},Eu=class{constructor(e,t,n,o,i,a,s,l,c){this.orgId=e;this.testId=t;this.testName=n;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:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:_s(n.results,t),beforeResults:n.beforeResults?_s(n.beforeResults,t):void 0,afterResults:n.afterResults?_s(n.afterResults,t):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startStepList(){let e=this.diskStorage.cd("steps"),t=new tc(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},Cu=class{constructor(e,t,n,o,i,a,s,l,c,d){this.orgId=e;this.testId=t;this.testName=n;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{[Iy]: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(n=>n.finish({logger:e.logger,result:{status:t.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}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 n=new Eu(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork);return this.children.push(n),n}},nc=class r{constructor(e,t,n,o,i,a){this.orgId=e;this.runGroupId=t;this.metadata=n;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,n,o,i,a){let s=yx(),l={...a,id:s,trigger:qt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:wn},c=new za(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(l,null,2)}),new r(t,s,l,o,c,i)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,n={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)}),await Promise.allSettled(this.asyncWork)}trackStatus(){}async startRun(e){let t=yx(),n=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};n.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 Cu(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,n,this.billingReporter,this.asyncWork);return this.children.push(i),i}};import bx from"adm-zip";import Ru from"fs";import rc from"path";function KN(r){let e=new bx,t=rc.join(r,"metadata.json"),n=ra.parse(JSON.parse(Ru.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Ru.readdirSync(rc.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new bx(rc.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(rc.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function oc(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Ru.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new ul(e);try{let{runGroupId:i,buffer:a}=KN(n),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 wx(r){let{logger:e,tests:t,yes:n,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:v,include:x,exclude:b,labels:T,reporterDir:C=qS,outputDir:A=KS,uploadResults:N=!1,waitOnTimeout:L=60,parallel:$=d.config.parallel??1,shardIndex:U=1,shardCount:M=1,regenerateGoldenFiles:z,gitMetadata:O,alwaysSaveCache:Y,noCache:B}=r;o&&(e.info({orgId:h},`Executing start command: ${o}`),await cv(o,!1)),i&&(e.info({orgId:h},`Waiting for url: ${i} with timeout: ${L} seconds.`),await XN({resources:[i],interval:2500,timeout:L*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let J=new si(d.config.ai?.agentConfig,{baseUrl:a.baseUrl,apiKey:a.apiKey,logger:e}),Q=we(d,y),St=await dx({tests:t,momenticFiles:Q,yes:n,project:d,include:x,exclude:b,labels:T}),re=[];St.forEach((ot,Er)=>{S?S.forEach((ho,yt)=>{re.push({testIndex:Er,inputs:ho,inputIndex:yt})}):re.push({testIndex:Er,inputs:void 0,inputIndex:void 0})}),M&&M>1&&(re=ZN(re,U,M));let Te=`Running ${re.length} tests with ${$} 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=xi({results:Me,startTime:Ft.getTime(),onFailed:yt=>{Xl(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"}),ho=Me.filter(yt=>!!yt.proposedTest);return ho.length>0&&y.warn(`${ho.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 oc({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};JN.existsSync(A)&&y.warn(`Output directory ${A} already exists, removing before test execution...`);let er=await nc.start(e,h,A,a,l,O),cn=e.child(er.loggerBindings||{}),Ci=[],Ri=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await er.finish({logger:cn,status:"CANCELLED"}),await Un(),await Promise.allSettled(Ci.map(ot=>ot())),process.exit(1)};process.once("SIGINT",Ri);let H={};for(let ot=0;ot<re.length;ot++){let Er=Object.values(H);Er.length===$&&await Promise.race(Er.map(Cr=>Cr.promise));let ho=re[ot],yt=`test-${ot}`;H[yt]={done:!1,promise:(async({testIndex:Cr,inputs:Lu})=>{let go=St[Cr];ln.add({testIndex:Cr,inputs:Lu});let Px=go.relativeFilePath.includes("..")?go.fullFilePath:go.relativeFilePath,Ha=(ct,Ai)=>{ct=ct.toUpperCase();let Bn=ct,tr;ct.includes("FAIL")?(Bn=Ei.bgRed.white("FAIL"),tr=3):ct.includes("PASS")?(Bn=Ei.bgGreen.white("PASS"),tr=3):ct.includes("START")?(Bn=Ei.bgBlue.white("START"),tr=2):ct.includes("CANCEL")?(Bn=Ei.bgRgb(191,68,11).white("CANCEL"),tr=1):ct.includes("RETRY")?(Bn=Ei.bgRgb(191,68,11).white("RETRY"),tr=2):ct.includes("RUN")||ct.includes("PROG")?(Bn=Ei.bgMagenta.white("RUNNING"),tr=0):(cn.warn(`Unknown status tried to be logged in run test locally: ${ct}`),tr=0),YN||(Bn=`${Bn}`),y.log(`${Bn}${" ".repeat(tr)} ${Px} ${Ai?`${Ai} `:""}(${ln.size}/${re.length})`)};Ha("START");let Lx=setInterval(()=>Ha("RUN"),5*60*1e3),Ou=cn.child({testId:go.id});try{let ct=await fx({testDefinition:go,project:d,testInputs:Lu,orgId:h,devicePixelRatio:g,apiClient:a,runGroupTracer:er,generator:J,retriesOverride:p,urlOverride:u,envName:m,customHeaders:f,regenerateGoldenFiles:z,logUpdate:Ha,runSigIntHandlers:Ci,logger:Ou,flagStore:c,gitMetadata:O,alwaysSaveCache:Y,noCache:B});Ha(ct.status),Me.push(ct)}catch(ct){let Ai=`Encountered unexpected fatal error when running test '${go.name}': ${ct.message}`;y.error(Ai),Ou.error(Ai)}finally{clearInterval(Lx),H[yt].done=!0,delete H[yt]}})(ho)}}await Promise.allSettled(Object.values(H).map(ot=>ot.promise));let Pu="PASSED";return Me.some(ot=>ot.status==="FAILED")&&(Pu="FAILED"),await er.finish({logger:cn,status:Pu}),process.off("SIGINT",Ri),v&&await cx(cn,s,v,{projectConfigPath:d.configFilePath,suiteName:d.config.name,startedAt:Ft,finishedAt:new Date,runs:Me},C),Un()}function ZN(r,e,t){if(t>r.length&&(y.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let n=Math.floor((e-1)*(r.length/t)),o=Math.floor(e*(r.length/t));return r.sort().filter((a,s)=>s>=n&&s<o)}import{randomUUID as QN}from"crypto";import Qn from"fs";import mo from"path";var vx={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId};function xx(r,e){let t=r[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function e_(r,e,t){if(vx[t]){let i=vx[t];return i(r,e)}let n=xx(r,t),o=xx(e,t);if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var Tx=new Set([".DS_Store","__MACOSX"]);function Ex(r,e,t){let n=QN(),o=r.child({runGroupId:n});Qn.rmSync(e,{recursive:!0,force:!0});let i=Qn.readdirSync(t).filter(c=>!Tx.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:n};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(Tx.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]=e_(s,m,g)}}let l=mo.join(e,"metadata.json");Qn.writeFileSync(l,JSON.stringify(s,null,2))}var Cx=new bi({platform:"cli"},{flushAt:1,flushInterval:0});sc||ee.warn("Sentry is not enabled in this environment due to unsupported node version");var a_=process.argv.some(r=>r.includes("--log-level"))&&process.argv.some(r=>r.includes("debug")),Au=r=>{a_&&y.dimmed(r)},Dt=new t_;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: ${fu.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(y.error("No browsers specified"),process.exit(1)),await Jv({rawBrowsers:r,force:e.force,all:e.all})});Dt.addOption(new sn("--log-level <level>").choices(["debug","info","warn","error"]).default("info")).on("option:log-level",r=>{r==="debug"&&y.info("Enabling debug logging"),y.setMinLevel(r.toLowerCase())});Dt.addOption(new sn("--verbose","enable verbose logging")).on("option:verbose",()=>{ee.enableConsoleLogs(),y.setMinLevel(0)});var Iu=Dt.command("checks").alias("check").description("Perform various project checks");Iu.command("config").addOption(Fn).action(async r=>{nn({configFilePath:r.config})});Iu.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(Fn).addOption(Av).action(async r=>{let e=await vn(r),t=nn({configFilePath:r.config});await Uv({project:t,fix:e.fix})});Iu.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(Fn).action(async r=>{let e=nn({configFilePath:r.config});await Bv({project:e})});var Rx=Dt.command("migrate").description("Migrate and upgrade tooling");Rx.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 r=>{let e=nn({configFilePath:r.config});await Xv(e)});Rx.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(Xn).addOption(Fn).addOption(Jn).action(async r=>{let e=await vn(r);!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:r.config}),n=new lt({baseUrl:e.server,apiKey:e.apiKey,logger:ee}),{orgId:o}=await n.getAuthInfo();await Qv({project:t,orgId:o,apiClient:n}),process.exit(0)});Dt.command("import").addOption(Jn).addOption(Xn).addOption(Fn).addOption(co).addArgument(Pv).action(async(r,e)=>{let t=await vn(e),{apiKey:n,server:o,config:i,yes:a}=t,s=nn({configFilePath:i}),l=new lt({baseUrl:o,apiKey:n,logger:ee});!r||r.length===0?await Gv({client:l,project:s,skipPrompts:a}):await Wv({client:l,project:s,paths:r,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 r=>{y.info(`Welcome to the Momentic project setup wizard! \u{1F680}
3842
- `),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."),ac.existsSync(Zo)&&(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:r.name??await gv("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:jd};Qo(t,Zo),y.success(`Initialized Momentic project file at ${ic.resolve(Zo)}`)});Dt.command("app").addOption(Jn).addOption(Xn).addOption(co).addOption(su).addOption(Ev).addOption(Fn).addOption(du).addOption(pu).action(async r=>{let e=await vn(r),{apiKey:t,port:n=Gl,yes:o,server:i,pixelRatio:a,disableCache:s,saveCache:l}=e,c=new lt({baseUrl:i,apiKey:t,logger:ee});await uu({client:c,skipPrompts:o});let d=i_(import.meta.url),p=ic.dirname(d),u=ic.resolve(p,"..","static"),m=ic.resolve(p,"..","assets"),h=a??Zp();Qp(h),await av({momenticServerUrl:i,apiKey:t,serverPort:n,appPort:n,staticDir:u,assetsDir:m,devicePixelRatio:h,version:wn,noCache:s,alwaysSaveCache:l});let g=`http://localhost:${n}`;await o_(g)});var Ax=Dt.command("queue").description("Queue tests or suites to run on Momentic Cloud");Ax.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Jn).addOption(Xn).addOption(ou).addOption(iu).addOption(co).addArgument(Ov).addOption(ql).addOption(Vl).addOption(Wl).action(async(r,e)=>{let{apiKey:t,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s,customHeaders:l}=await vn(e),c=new lt({baseUrl:n,apiKey:t,logger:ee});(!r||!Array.isArray(r)||!r.length)&&(y.error("Must pass at least one suite to run."),process.exit(1));let{orgId:d}=await c.getAuthInfo();await tx({client:c,orgId:d,wait:o,suitePaths:r,waitTimeout:i,env:a,urlOverride:s,customHeaders:Kl(l)})});Ax.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Jn).addOption(Xn).addOption(co).addOption(Wl).addOption(lu).addOption(ql).addOption(Vl).addOption(ou).addOption(iu).addArgument(Iv).action(async(r,e)=>{let t=await vn(e),{all:n,apiKey:o,customHeaders:i,env:a,server:s,inputCsv:l,urlOverride:c,wait:d,waitTimeout:p,yes:u}=t,m=Kl(i);for(let S of r)(S.endsWith(".yaml")||ac.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 eu(l)),await nx({client:h,orgId:g,tests:r,all:n,customHeaders:m,env:a,urlOverride:c,wait:d,waitTimeout:p,testInputMatrix:f,yes:u}),process.exit(0)});var s_=Dt.command("run").alias("test").description("Run tests on the local machine");s_.addOption(Jn).addOption(Xn).addOption(Fn).addOption(cu).addOption(co).addOption(Wl).addOption(lu).addOption(du).addOption(pu).addOption(Vl).addOption(ql).addOption(su).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(bv).addOption(wv).addOption(au).addOption(vv).addOption(Cv).addOption(Rv).addOption(xv).addOption(Tv).addArgument(Lv).action(async(r,e)=>{y.debug("Run tests invoked");let t=await vn(e);y.debug(t,"Parsed CLI options");let n=Kl(t.customHeaders),o=nn({configFilePath:t.config,nameFilter:t.filter});y.debug({projectName:o.config.name},"Identified project config");let{errors:i}=await hu({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 uu({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 ri(ee,a,o);m.debug(h,"Got local git metadata");let g=new ni(o.config),f=Cx.child({org_id:s,user_id:l,cli_version:wn,trigger:"CLI"}),S;t.inputCsv&&(S=await eu(t.inputCsv));let v=t.pixelRatio??Zp();Qp(v);try{(await wx({...t,retriesOverride:t.retries,devicePixelRatio:v,tests:r,project:o,client:a,debugDataStorage:d,billingReporter:c,analytics:f,flagStore:g,outputDir:p,uploadResults:t.uploadResults,reporterDir:u,customHeaders:n,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(x){y.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),y.error(x),process.exit(1)}});var l_=Dt.command("apply").description("Apply an operation to local resources");l_.command("patch").addOption(Jn).addOption(Xn).addOption(Fn).addOption(cu).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 r=>{let e=await vn(r),{apiKey:t,server:n,config:o,yes:i}=e,a=nn({configFilePath:o}),s=ee,l=new lt({baseUrl:n,apiKey:t,logger:s}),c=we(a,y),d=c.tests[r.to]??Object.values(c.tests).find(u=>ke(u.name)===r.to.trim());d||(y.error(`No test matching '${r.to}' could be found in the current project.`),process.exit(1));let p=await l.fetchTestFragment(r.from);await fv({client:l,test:d,fragment:p,yes:i,entities:c,logger:ee}),process.exit(0)});var Ix=Dt.command("results").description("Merge and upload test results.");Ix.command("merge").description("Merge test results files.").addOption(au).addArgument(Mv).action(async(r,e)=>{let t=await vn(e),{outputDir:n}=t;n||(y.error("Output directory is required."),process.exit(1)),ac.existsSync(r)||(y.warn("Results path does not exist, skipping merge."),process.exit(0)),ac.existsSync(n)&&y.warn(`Output directory ${n} already exists, removing before merging...`),Ex(ee,n,r)});Ix.command("upload").description("Upload test results to Momentic cloud.").addOption(Jn).addOption(Xn).addArgument(kv).action(async(r,e)=>{let t=await vn(e),{apiKey:n,server:o}=t,i=ee,a=new lt({baseUrl:o,apiKey:n,logger:i});await oc({consoleLogger:y,resultsPath:r,client:a}),process.exit(0)});async function c_(){Au("Main program started"),await pv(ee),Au("CLI version check complete");try{await Dt.parseAsync(process.argv)}catch(r){let e={};try{e.playwrightVersion=n_("npx playwright --version").toString()}catch(t){ee.error({err:t},"Error fetching debug information")}ee.error({err:r,debugInfo:e},"Uncaught error in CLI"),ee.flush(),Ii(r,e),y.error(r),process.exit(1)}}r_.setMaxListeners(50);process.on("warning",r=>{ee.warn({err:r},`Node warning received on CLI: ${r.message}`)});Au("CLI parsing setup complete");c_();
3839
+ `),n.forEach(u=>{if(!Au.existsSync(u))throw new Error(`Path '${u}' does not exist.`);let m,h;try{m=Au.statSync(u),h=m.isDirectory()}catch(f){a.warn({err:f},`Skipping path ${u} because it cannot be read`);return}let g=Iu.resolve(u);Object.values(e.tests).filter(f=>h?f.fullFilePath.startsWith(g):f.fullFilePath===g).forEach(f=>{l.add(f.fullFilePath)})})):(a.info(`Reading all tests from the project and running those matching the following substring filters:
3840
+ ${n.map(u=>`${Wt}- ${u}`).join(`
3841
+ `)}`),Object.values(e.tests).forEach(u=>{n.some(m=>u.relativePath.includes(m))&&l.add(u.fullFilePath)}))}else{!r&&!await ft("No test paths or substrings were provided. Do you want to run all tests?")&&(a.error("Cancelled by user."),process.exit(1));let d=Object.values(e.tests);a.info(`Reading all ${d.length} tests in the project from local disk.`),d.forEach(p=>{l.add(p.fullFilePath)})}for(let d of l){let p=Iu.relative(t.rootDir,d);o&&!o.some(u=>new RegExp(u).test(p))&&l.delete(d),i&&i.some(u=>new RegExp(u).test(p))&&l.delete(d)}let c=Array.from(l).map(async d=>{try{let p=await cs(d,ee,e);if(GN.gt(p.schemaVersion,_e)&&a.warn(`Test ${d} has schema version ${p.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),s&&s.length>0){let u=p.labels||[];if(!s.some(h=>u.includes(h)))return null}return{...p,fullFilePath:d,relativeFilePath:Iu.relative(t.rootDir,d)}}catch(p){a.error(`Failed to read and resolve test at '${d}': ${p}`),process.exit(1)}});return Promise.all(c).then(jN)}import{cloneDeep as bx}from"lodash-es";async function gx({orgId:n,codeEvalTools:e,logger:t,outputDefinitions:r,testContext:o,flagStore:i}){let s={};for(let a of r){let{name:l,value:c}=a;s[l]=await Gt({orgId:n,s:c,localTools:e,logger:t,context:o,flagStore:i})}return s}async function fx({baseUrl:n,envName:e,devicePixelRatio:t,apiClient:r,test:o,storageClient:i,codeEvalTools:s,generator:a,orgId:l,variables:c,logger:d,customHeaders:p,testInputs:u,localBrowserConfig:m,visualDiffScreenshotStorage:h,flagStore:g}){let f=await vl({settings:m,customHeaders:p,envVariables:c,envName:e,baseUrl:n,logger:d,localTools:s,orgId:l,flagStore:g}),S={baseUrl:r.baseUrl,apiKey:r.apiKey,logger:ee},v=g.isBooleanFlagEnabled("icon_knowledge_base")?await i.fetchIconKnowledgeBase(l,d):null,x=f.browserType??"Chromium";if(!tx(x)){let A=`Browser ${x} 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 di(S,a),contextArgs:{viewport:o.advanced.viewport??Jt,locale:o.advanced.locale??Oo,geolocation:o.advanced.geolocation??ko,timezoneId:o.advanced.timezone??Mo,colorScheme:o.advanced.colorScheme,deviceScaleFactor:t},iconKnowledgeBase:v}),T=new yi({browser:b,generator:a,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:f.slowMoMs,autoFollowNewTabs:f.autoFollowNewTabs},storage:i,flagStore:g,localCodeEvalTools:s,visualDiffScreenshotStorage:h,analytics:new wi}),C=new Lt({baseUrl:n,currentUrl:T.browser.url(),variablesFromEnvironment:c,envName:e});return o.parameters&&await Promise.all(o.parameters.map(async A=>{let{name:N,defaultValue:O,required:H}=A,B=u?.[N];H&&B===void 0&&(y.error(`Required parameter '${N}' is required by test '${o.name}' but not provided`),process.exit(1));let M=await Gt({orgId:l,s:B??O,localTools:s,logger:d,context:Lt.dummyContext(C.getEnvName()),flagStore:g});C.setMomenticSystemVariable(N,M)})),{controller:T,context:C}}import{randomUUID as WN}from"crypto";async function Sx({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(a){return o.error({err:a},"Test is not eligible for recovery since we failed to fetch the recent test results"),!1}return i.some(a=>a.status==="PASSED")?Ti?!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 yx({attemptInputs:n,attemptFixtures:e,attemptMetadata:t}){let{attemptNumber:r,orgId:o,runId:i,runAttemptId:s}=t,{controller:a,context:l,flagStore:c,analytics:d,codeEvalTools:p,storageClient:u,debugDataStorage:m,logger:h,apiClient:g,billingReporter:f,tracer:S}=e,{test:v,orgSettings:x}=n;h.info(`Running test '${v.name}' locally (run link: https://app.momentic.ai/runs/${i})`);let b={controller:a,storage:u,debugDataStorage:m,billingReporter:f,analytics:d,context:l,logger:h,codeEvalTools:p},T={orgId:o,runId:i||WN(),runAttemptId:s,testMetadata:v,steps:v.steps,beforeSteps:v.beforeSteps,afterSteps:v.afterSteps},C={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await Sx({currentAttempt:r,testId:v.id,flagStore:c,apiClient:g,testAdvancedSettings:v.advanced,aiSettingsFromEnv:x.ai,logger:h})};return await wl({fixtures:b,inputs:T,options:C,callbacks:{step:{},test:{onTestComplete:async()=>{await a.browser.cleanup()},onProposedTestSteps:async O=>g.uploadProposedSteps(O,h)}},testParams:{tracer:S}})}async function wx(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await VN(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 VN(n){let{testDefinition:e,project:t,apiClient:r,orgId:o,urlOverride:i,runSigIntHandlers:s,runGroupTracer:a,logger:l,gitMetadata:c,alwaysSaveCache:d,noCache:p}=n,u=new ai(r,o),m=pi({orgId:o,client:r,gitMetadata:c,alwaysSaveCache:d,noCache:p}),h=bx(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??KN(e),f,S={};if(g){try{f=ds(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 v=e.baseUrl;if(i)v=i;else if(!v){let T=S[We];typeof T=="string"&&(v=T)}if(!v){let T=`Cannot run test with no base URL and no ${We} variable defined in its environment`;throw new Error(T)}let x=await a.startRun({logger:l,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testLabels:e.labels,baseUrl:v,environmentName:g,schemaVersion:e.schemaVersion}),b=l.child(x.loggerBindings||{});Object.entries(x.envVarBindings||{}).forEach(([T,C])=>{S[T]=C});try{let T=await qN({...n,variables:S,envName:g,stepsWithCaches:h,resolvedEnv:f,baseUrl:v,storageClient:u,tracer:x,logger:b,cacheStorage:m});return await x.finish({logger:l,status:T.status,finishedAt:T.finishedAt,failureDetails:T.failureDetails,failureReason:T.failureReason,isFlake:T.isFlake}),{runId:x.runId,...T}}finally{s?.pop()}}async function qN(n){let{testDefinition:e,stepsWithCaches:t,project:r,regenerateGoldenFiles:o,apiClient:i,generator:s,baseUrl:a,storageClient:l,orgId:c,envName:d,urlOverride:p,customHeaders:u,testInputs:m,variables:h,resolvedEnv:g,retriesOverride:f,devicePixelRatio:S,logUpdate:v,tracer:x,logger:b,flagStore:T,cacheStorage:C}=n,A=new Date,N=new ri(r,o),O={ai:r.config.ai},H={envName:d,urlOverride:p,customHeaders:u,testInputs:m},B,M=Math.abs(f??r.config.retries??e.retries??0),U=[];b.info({labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let L=0;L<=M;L++){let Y=await x.startAttempt(),z=b.child(Y.loggerBindings||{}),J={...e,steps:bx(t)};L!==0&&v("RETRY",`attempt ${L+1}/${M+1}`);let Q=new Date,Et=new fr({httpClient:new Dt({baseUrl:i.baseUrl,apiKey:i.apiKey,logger:z}),fakerSeed:T.isBooleanFlagEnabled("faker_constant_seed")?Ih:void 0});try{let{controller:he,context:Ie}=await fx({baseUrl:a,envName:d,apiClient:i,devicePixelRatio:S,logger:z,storageClient:l,codeEvalTools:Et,test:J,generator:s,orgId:c,variables:h,customHeaders:u,testInputs:m,localBrowserConfig:{...r.config.browser||{},...g?.browser||{},...J.advanced},visualDiffScreenshotStorage:N,flagStore:T});B=await yx({attemptMetadata:{attemptNumber:L+1,orgId:c,runId:x.runId},attemptFixtures:{logger:z,storageClient:l,billingReporter:new Uo,analytics:new wi,debugDataStorage:new Ur,codeEvalTools:Et,flagStore:T,apiClient:i,context:Ie,controller:he,tracer:Y},attemptInputs:{test:J,orgSettings:O}});let Se=new Date;B?.status==="PASSED"&&await Na({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 Y.finish({logger:z,result:B}),U.unshift(B.status);let Bt=await gx({orgId:c,codeEvalTools:Et,logger:z,outputDefinitions:e.outputs??[],testContext:Ie,flagStore:T}),Ct=ih(U),Un=L+1;if(B.status!=="FAILED")return{...B,parameters:H,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Q,finishedAt:Se,attempts:Un,baseUrl:a,outputs:Bt,isFlake:Ct};let go=B.failedStepResult,er=go?.message||"Unknown failure",Er=go?.failureReason??Uh(er)??"UnknownError",tr=z.child({errResult:go,failureReason:Er,errorMessage:er,numAttempts:M+1,name:J.name});if(L<M){tr.warn(`Retrying failed execution attempt for run: ${er}`);continue}return tr.error(`Test failed after all exhausting attempts: ${er}`),{...B,parameters:H,failureDetails:{errorMessage:er},failureReason:Er,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Q,finishedAt:Se,attempts:L+1,baseUrl:a,outputs:Bt}}catch(he){Pi(he);let Ie=`Encountered fatal platform error while running test '${J.name}': ${he}`,Se=new Date,Bt=L+1;z.error({err:he},Ie),y.error(Ie);let Ct={errorMessage:he.message,errStack:he.stack},Un={status:"FAILED",failureDetails:Ct,failureReason:"InternalPlatformError",finishedAt:Se};return await Y.finish({logger:z,result:{status:"FAILED",results:[]}}),{...Un,parameters:H,test:J,filePath:J.relativeFilePath,startedAt:A,lastAttemptStartedAt:Q,finishedAt:new Date,attempts:Bt,baseUrl:a,outputs:{}}}}throw new Error("This code should not be reachable")}function KN(n){for(let e of n.envs??[])if(e.default)return e.name}import{randomUUID as xx}from"crypto";import YN from"adm-zip";import Zn from"fs";import mo from"path";var Hs=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(mo.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=mo.join(this.filePath,t);try{Zn.writeFileSync(o,r)}catch{}}createRunArchive(e){return new Pu(mo.join(this.filePath,"runs"),e)}},Pu=class{constructor(e,t){this.filePath=e;this.tempPath=mo.join(e,`.${t}`),this.finalPath=mo.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 Hs(mo.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=mo.join(this.tempPath,t);Zn.writeFileSync(o,r)}close(){let e=new YN;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 vx(n,e,t,r,o){let i=Qi(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let s=es(o.command);s&&await e.reportCreditsUsed(n,o.command.type,s,{testId:t,testName:r})}}function JN(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 XN(n){switch(n){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Lu=class{constructor(e,t,r,o,i,s){this.testId=e;this.testName=t;this.metadata=r;this.diskStorage=o;this.billingReporter=i;this.asyncWork=s}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:XN(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 oc(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},oc=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(vx(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 s=new Lu(this.testId,this.testName,i,o,this.billingReporter,this.asyncWork);return this.children.push(s),s}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:JN(e.status),finishedAt:e.finishedAt}))))}},Ou=class{constructor(e,t,r,o,i,s,a,l,c){this.orgId=e;this.testId=t;this.testName=r;this.originalSteps=o;this.metadata=i;this.client=s;this.diskStorage=a;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:Da(r.results,t),beforeResults:r.beforeResults?Da(r.beforeResults,t):void 0,afterResults:r.afterResults?Da(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 oc(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},Mu=class{constructor(e,t,r,o,i,s,a,l,c,d){this.orgId=e;this.testId=t;this.testName=r;this.runId=o;this.originalSteps=i;this.metadata=s;this.client=a;this.diskStorage=l;this.billingReporter=c;this.asyncWork=d}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[Fy]: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 Ou(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork);return this.children.push(r),r}},ic=class n{constructor(e,t,r,o,i,s){this.orgId=e;this.runGroupId=t;this.metadata=r;this.client=o;this.diskStorage=i;this.billingReporter=s;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,s){let a=xx(),l={...s,id:a,trigger:Xt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:wn},c=new Hs(r);return c.storeFile({name:"metadata.json",contents:JSON.stringify(l,null,2)}),new n(t,a,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=xx(),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 Mu(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork);return this.children.push(i),i}};import Tx from"adm-zip";import ku from"fs";import sc from"path";function ZN(n){let e=new Tx,t=sc.join(n,"metadata.json"),r=os.parse(JSON.parse(ku.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of ku.readdirSync(sc.join(n,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),s=new Tx(sc.join(n,"runs",o));for(let a of s.getEntries())a.isDirectory||e.addFile(sc.join("runs",i,a.entryName),a.getData())}return{runGroupId:r.id,buffer:e.toBuffer()}}async function ac(n){let{client:e,consoleLogger:t,resultsPath:r}=n;if(!ku.existsSync(r)){t.warn("Results path does not exist, skipping upload.");return}let o=new ml(e);try{let{runGroupId:i,buffer:s}=ZN(r),a=await o.uploadResultsArchive(i,s),l=`${e.getAppUrl()}/run-groups/${a}`;t.success(`Successfully uploaded test results. Once processed, your results can be found at ${l}`);return}catch(i){let s;i instanceof Error?s=i.message:typeof i=="string"?s=i:s="Unknown error",t.error(`Failed to upload test results: ${s}.`);return}}async function Ex(n){let{logger:e,tests:t,yes:r,start:o,waitOn:i,client:s,debugDataStorage:a,billingReporter:l,flagStore:c,project:d,retriesOverride:p,urlOverride:u,envName:m,orgId:h,devicePixelRatio:g,customHeaders:f,testInputMatrix:S,reporter:v,include:x,exclude:b,labels:T,reporterDir:C=ny,outputDir:A=ry,uploadResults:N=!1,waitOnTimeout:O=60,parallel:H=d.config.parallel??1,shardIndex:B=1,shardCount:M=1,regenerateGoldenFiles:U,gitMetadata:L,alwaysSaveCache:Y,noCache:z}=n;o&&(e.info({orgId:h},`Executing start command: ${o}`),await yv(o,!1)),i&&(e.info({orgId:h},`Waiting for url: ${i} with timeout: ${O} seconds.`),await t_({resources:[i],interval:2500,timeout:O*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let J=new ci(d.config.ai?.agentConfig,{baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e}),Q=be(d,y),Et=await rc({tests:t,momenticFiles:Q,yes:r,project:d,include:x,exclude:b,labels:T,logger:e}),he=Et.filter(De=>!De.disabled),Ie=Et.filter(De=>De.disabled),Se=[];he.forEach((De,Cr)=>{S?S.forEach((fo,St)=>{Se.push({testIndex:Cr,inputs:fo,inputIndex:St})}):Se.push({testIndex:Cr,inputs:void 0,inputIndex:void 0})}),M&&M>1&&(Se=n_(Se,B,M));let Bt=`Running ${Se.length} tests with ${H} workers:`;e.info({allTestsToRunWithInputs:Se,shardCount:M,shardIndex:B,orgId:h},Bt),y.info(Bt),Se.forEach(De=>{y.info(`${Wt}- ${[he[De.testIndex].relativeFilePath]}${typeof De.inputIndex=="number"?` with input set ${De.inputIndex}`:""}`)}),y.log("");let Ct=[],Un=new Date,go=new Set,er=async()=>{let De=s.getAppUrl(),Cr=Ei({results:Ct,startTime:Un.getTime(),onFailed:St=>{Ql(St,St.filePath)},getDisplayLine:St=>{let Rr=`${Wt}- ${St.filePath}${St.proposedTest?" [AUTO-HEALED] ":""}`;return St.runId&&(Rr+=` ( link when uploaded: ${De}/runs/${St.runId} )`),Rr},entity:"test"}),fo=Ct.filter(St=>!!St.proposedTest);return fo.length>0&&y.warn(`${fo.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 ac({client:s,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}'.`),Cr};e_.existsSync(A)&&y.warn(`Output directory ${A} already exists, removing before test execution...`);let Er=await ic.start(e,h,A,s,l,L),tr=e.child(Er.loggerBindings||{}),G=[],Du=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await Er.finish({logger:tr,status:"CANCELLED"}),await er(),await Promise.allSettled(G.map(De=>De())),process.exit(1)};process.once("SIGINT",Du);let Ai={};for(let De=0;De<Se.length;De++){let Cr=Object.values(Ai);Cr.length===H&&await Promise.race(Cr.map(Rr=>Rr.promise));let fo=Se[De],St=`test-${De}`;Ai[St]={done:!1,promise:(async({testIndex:Rr,inputs:Uu})=>{let So=he[Rr];go.add({testIndex:Rr,inputs:Uu});let kx=So.relativeFilePath.includes("..")?So.fullFilePath:So.relativeFilePath,js=(ct,Ii)=>{ct=ct.toUpperCase();let Bn=ct,nr;ct.includes("FAIL")?(Bn=Ri.bgRed.white("FAIL"),nr=3):ct.includes("PASS")?(Bn=Ri.bgGreen.white("PASS"),nr=3):ct.includes("START")?(Bn=Ri.bgBlue.white("START"),nr=2):ct.includes("CANCEL")?(Bn=Ri.bgRgb(191,68,11).white("CANCEL"),nr=1):ct.includes("RETRY")?(Bn=Ri.bgRgb(191,68,11).white("RETRY"),nr=2):ct.includes("RUN")||ct.includes("PROG")?(Bn=Ri.bgMagenta.white("RUNNING"),nr=0):(tr.warn(`Unknown status tried to be logged in run test locally: ${ct}`),nr=0),QN||(Bn=`${Bn}`),y.log(`${Bn}${" ".repeat(nr)} ${kx} ${Ii?`${Ii} `:""}(${go.size}/${Se.length})`)};js("START");let Nx=setInterval(()=>js("RUN"),5*60*1e3),Bu=tr.child({testId:So.id});try{let ct=await wx({testDefinition:So,project:d,testInputs:Uu,orgId:h,devicePixelRatio:g,apiClient:s,runGroupTracer:Er,generator:J,retriesOverride:p,urlOverride:u,envName:m,customHeaders:f,regenerateGoldenFiles:U,logUpdate:js,runSigIntHandlers:G,logger:Bu,flagStore:c,gitMetadata:L,alwaysSaveCache:Y,noCache:z});js(ct.status),Ct.push(ct)}catch(ct){let Ii=`Encountered unexpected fatal error when running test '${So.name}': ${ct.message}`;y.error(Ii),Bu.error(Ii)}finally{clearInterval(Nx),Ai[St].done=!0,delete Ai[St]}})(fo)}}await Promise.allSettled(Object.values(Ai).map(De=>De.promise));let Fu="PASSED";return Ct.some(De=>De.status==="FAILED")&&(Fu="FAILED"),await Er.finish({logger:tr,status:Fu}),process.off("SIGINT",Du),v&&await hx(tr,a,v,{projectConfigPath:d.configFilePath,suiteName:d.config.name,startedAt:Un,finishedAt:new Date,runs:Ct,skippedTests:Ie},C),er()}function n_(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((s,a)=>a>=r&&a<o)}import{randomUUID as r_}from"crypto";import Qn from"fs";import ho from"path";var Cx={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 Rx(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function o_(n,e,t){if(Cx[t]){let i=Cx[t];return i(n,e)}let r=Rx(n,t),o=Rx(e,t);if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}var Ax=new Set([".DS_Store","__MACOSX"]);function Ix(n,e,t){let r=r_(),o=n.child({runGroupId:r});Qn.rmSync(e,{recursive:!0,force:!0});let i=Qn.readdirSync(t).filter(c=>!Ax.has(c)).map(c=>ho.join(t,c));Qn.mkdirSync(e,{recursive:!0});let s=ho.join(i[0],"metadata.json"),a={...os.parse(JSON.parse(Qn.readFileSync(s,"utf-8"))),id:r};for(let c of i){let d=ho.join(c,"runs");if(!Qn.existsSync(d))continue;let p=Qn.readdirSync(d);for(let h of p){if(Ax.has(h))continue;let g=ho.join(d,h),f=ho.join(e,"runs",h);Qn.cpSync(g,f,{recursive:!0})}let u=ho.join(c,"metadata.json"),m=os.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;a[g]=o_(a,m,g)}}let l=ho.join(e,"metadata.json");Qn.writeFileSync(l,JSON.stringify(a,null,2))}var Px=new vi({platform:"cli"},{flushAt:1,flushInterval:0});dc||ee.warn("Sentry is not enabled in this environment due to unsupported node version");var d_=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),Nu=n=>{d_&&y.dimmed(n)},Tt=new i_;Tt.name("momentic").description("CLI").version(wn);Tt.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: ${xu.join(", ")}.`).action(async(n,e)=>{!e.all&&n.length===0&&(y.error("No browsers specified"),process.exit(1)),await nx({rawBrowsers:n,force:e.force,all:e.all})});Tt.addOption(new Vt("--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())});Tt.addOption(new Vt("--verbose","enable verbose logging")).on("option:verbose",()=>{ee.enableConsoleLogs(),y.setMinLevel(0)});var _u=Tt.command("checks").alias("check").description("Perform various project checks");_u.command("config").addOption(vn).action(async n=>{$t({configFilePath:n.config})});_u.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(vn).addOption(Nv).action(async n=>{let e=await cn(n),t=$t({configFilePath:n.config});await Gv({project:t,fix:e.fix})});_u.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(vn).action(async n=>{let e=$t({configFilePath:n.config});await Wv({project:e})});var Lx=Tt.command("migrate").description("Migrate and upgrade tooling");Lx.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(vn).action(async n=>{let e=$t({configFilePath:n.config});await rx(e)});Lx.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(Xn).addOption(vn).addOption(Jn).action(async n=>{let e=await cn(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=$t({configFilePath:n.config}),r=new lt({baseUrl:e.server,apiKey:e.apiKey,logger:ee}),{orgId:o}=await r.getAuthInfo();await ix({project:t,orgId:o,apiClient:r}),process.exit(0)});Tt.command("import").addOption(Jn).addOption(Xn).addOption(vn).addOption(po).addArgument(Dv).action(async(n,e)=>{let t=await cn(e),{apiKey:r,server:o,config:i,yes:s}=t,a=$t({configFilePath:i}),l=new lt({baseUrl:o,apiKey:r,logger:ee});!n||n.length===0?await Jv({client:l,project:a,skipPrompts:s}):await Xv({client:l,project:a,paths:n,skipPrompts:s}),process.exit(0)});Tt.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new Vt("--name <name>","Name of the project")).action(async n=>{y.info(`Welcome to the Momentic project setup wizard! \u{1F680}
3842
+ `),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."),cc.existsSync(ei)&&(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 Ev("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Vd};ti(t,ei),y.success(`Initialized Momentic project file at ${lc.resolve(ei)}`)});Tt.command("app").addOption(Jn).addOption(Xn).addOption(po).addOption(mu).addOption(Ov).addOption(vn).addOption(gu).addOption(fu).action(async n=>{let e=await cn(n),{apiKey:t,port:r=Wl,yes:o,server:i,pixelRatio:s,disableCache:a,saveCache:l}=e,c=new lt({baseUrl:i,apiKey:t,logger:ee});await yu({client:c,skipPrompts:o});let d=c_(import.meta.url),p=lc.dirname(d),u=lc.resolve(p,"..","static"),m=lc.resolve(p,"..","assets"),h=s??nu();ru(h),await gv({momenticServerUrl:i,apiKey:t,serverPort:r,appPort:r,staticDir:u,assetsDir:m,devicePixelRatio:h,version:wn,noCache:a,alwaysSaveCache:l});let g=`http://localhost:${r}`;await l_(g)});var Ox=Tt.command("queue").description("Queue tests or suites to run on Momentic Cloud");Ox.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Jn).addOption(Xn).addOption(lu).addOption(cu).addOption(po).addArgument(Fv).addOption(Kl).addOption(ql).addOption(Vl).action(async(n,e)=>{let{apiKey:t,server:r,wait:o,waitTimeout:i,env:s,urlOverride:a,customHeaders:l}=await cn(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 ax({client:c,orgId:d,wait:o,suitePaths:n,waitTimeout:i,env:s,urlOverride:a,customHeaders:Jl(l)})});Ox.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Jn).addOption(Xn).addOption(po).addOption(Vl).addOption(hu).addOption(Kl).addOption(ql).addOption(lu).addOption(cu).addArgument(_v).action(async(n,e)=>{let t=await cn(e),{all:r,apiKey:o,customHeaders:i,env:s,server:a,inputCsv:l,urlOverride:c,wait:d,waitTimeout:p,yes:u}=t,m=Jl(i);for(let S of n)(S.endsWith(".yaml")||cc.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:a,apiKey:o,logger:ee}),{orgId:g}=await h.getAuthInfo(),f;l&&(f=await ou(l)),await lx({client:h,orgId:g,tests:n,all:r,customHeaders:m,env:s,urlOverride:c,wait:d,waitTimeout:p,testInputMatrix:f,yes:u}),process.exit(0)});var p_=Tt.command("list").description("List test paths");p_.addOption(vn).addOption(Yl).addOption(pu).addOption(uu).addOption(new Vt("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(Su).action(async(n,e)=>{let t=await cn(e),r=$t({configFilePath:t.config,nameFilter:t.filter}),o=be(r,y),i=await rc({tests:n,momenticFiles:o,yes:!0,project:r,include:t.include,exclude:t.exclude,labels:t.labels,logger:rg});y.info(i.map(s=>s.relativeFilePath).join(`
3843
+ `)),process.exit(0)});var u_=Tt.command("run").alias("test").description("Run tests on the local machine");u_.addOption(Jn).addOption(Xn).addOption(vn).addOption(Yl).addOption(po).addOption(Vl).addOption(hu).addOption(gu).addOption(fu).addOption(ql).addOption(Kl).addOption(mu).addOption(new Vt("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new Vt("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new Vt("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.")).addOption(new Vt("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.")).addOption(new Vt("-p, --parallel <parallel>","When running with the --local flag, the number of tests to run in parallel. Defaults to 1.")).addOption(new Vt("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new Vt("--update-golden-files","Update locally stored golden files for steps that this is enabled for.")).addOption(Iv).addOption(Pv).addOption(du).addOption(Lv).addOption(Mv).addOption(kv).addOption(pu).addOption(uu).addArgument(Su).action(async(n,e)=>{y.debug("Run tests invoked");let t=await cn(e);y.debug(t,"Parsed CLI options");let r=Jl(t.customHeaders),o=$t({configFilePath:t.config,nameFilter:t.filter});y.debug({projectName:o.config.name},"Identified project config");let{errors:i}=await wu({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 s=new lt({baseUrl:t.server,apiKey:t.apiKey,logger:ee});y.debug("Checking API key and dependencies");let{orgId:a,userId:l}=await yu({client:s,skipPrompts:t.yes});y.debug("API key check and browser installation complete");let c=new pl(s),d=new ul(s),p=t.outputDir??o.config.outputDir,u=t.reporterDir??o.config.reporterDir,m=ee.child({orgId:a,userId:l,cliVersion:wn,trigger:"CLI"}),h=await ii(ee,s,o);m.debug(h,"Got local git metadata");let g=new oi(o.config),f=Px.child({org_id:a,user_id:l,cli_version:wn,trigger:"CLI"}),S;t.inputCsv&&(S=await ou(t.inputCsv));let v=t.pixelRatio??nu();ru(v);try{(await Ex({...t,retriesOverride:t.retries,devicePixelRatio:v,tests:n,project:o,client:s,debugDataStorage:d,billingReporter:c,analytics:f,flagStore:g,outputDir:p,uploadResults:t.uploadResults,reporterDir:u,customHeaders:r,envName:t.env,orgId:a,testInputMatrix:S,logger:m,regenerateGoldenFiles:t.updateGoldenFiles,gitMetadata:h,alwaysSaveCache:t.saveCache,noCache:t.disableCache})).failed>0?process.exit(1):process.exit(0)}catch(x){y.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),y.error(x),process.exit(1)}});var m_=Tt.command("apply").description("Apply an operation to local resources");m_.command("patch").addOption(Jn).addOption(Xn).addOption(vn).addOption(Yl).addOption(po).addOption(new Vt("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new Vt("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async n=>{let e=await cn(n),{apiKey:t,server:r,config:o,yes:i}=e,s=$t({configFilePath:o}),a=ee,l=new lt({baseUrl:r,apiKey:t,logger:a}),c=be(s,y),d=c.tests[n.to]??Object.values(c.tests).find(u=>ke(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 Cv({client:l,test:d,fragment:p,yes:i,entities:c,logger:ee}),process.exit(0)});var Mx=Tt.command("results").description("Merge and upload test results.");Mx.command("merge").description("Merge test results files.").addOption(du).addArgument(Uv).action(async(n,e)=>{let t=await cn(e),{outputDir:r}=t;r||(y.error("Output directory is required."),process.exit(1)),cc.existsSync(n)||(y.warn("Results path does not exist, skipping merge."),process.exit(0)),cc.existsSync(r)&&y.warn(`Output directory ${r} already exists, removing before merging...`),Ix(ee,r,n)});Mx.command("upload").description("Upload test results to Momentic cloud.").addOption(Jn).addOption(Xn).addArgument(Bv).action(async(n,e)=>{let t=await cn(e),{apiKey:r,server:o}=t,i=ee,s=new lt({baseUrl:o,apiKey:r,logger:i});await ac({consoleLogger:y,resultsPath:n,client:s}),process.exit(0)});async function h_(){Nu("Main program started"),await wv(ee),Nu("CLI version check complete");try{await Tt.parseAsync(process.argv)}catch(n){let e={};try{e.playwrightVersion=s_("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(),Pi(n,e),y.error(n),process.exit(1)}}a_.setMaxListeners(50);process.on("warning",n=>{ee.warn({err:n},`Node warning received on CLI: ${n.message}`)});Nu("CLI parsing setup complete");h_();
3843
3844
  //# sourceMappingURL=cli.js.map
3844
- //# debugId=a2da5833-1f0d-59e2-a369-5d1b59df3df4
3845
+ //# debugId=5f086a40-5ca5-52f7-8f11-37b39098c9c8