momentic 2.4.4 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +80 -79
- package/npm-shrinkwrap.json +15 -15
- package/package.json +1 -1
- package/static/assets/{index-Dsu1peWD.js → index-unbnqAaM.js} +11 -11
- package/static/index.html +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
4
|
-
var 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
|
-
`||
|
|
6
|
-
`)return
|
|
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]="a994cae4-7f00-58a6-802d-ea88d710ff40")}catch(e){}}();
|
|
4
|
+
var Dx=Object.create;var ju=Object.defineProperty;var Fx=Object.getOwnPropertyDescriptor;var Ux=Object.getOwnPropertyNames;var Bx=Object.getPrototypeOf,zx=Object.prototype.hasOwnProperty;var $u=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var Hx=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ux(e))!zx.call(n,o)&&o!==t&&ju(n,o,{get:()=>e[o],enumerable:!(r=Fx(e,o))||r.enumerable});return n};var jx=(n,e,t)=>(t=n!=null?Dx(Bx(n)):{},Hx(e||!n||!n.__esModule?ju(t,"default",{value:n,enumerable:!0}):t,n));var oS=$u((e3,rS)=>{"use strict";rS.exports=tS;function tS(n,e,t){n instanceof RegExp&&(n=eS(n,t)),e instanceof RegExp&&(e=eS(e,t));var r=nS(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 eS(n,e){var t=e.match(n);return t?t[0]:null}tS.range=nS;function nS(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 uS=$u((t3,pS)=>{"use strict";var iS=oS();pS.exports=UA;var sS="\0SLASH"+Math.random()+"\0",aS="\0OPEN"+Math.random()+"\0",Pd="\0CLOSE"+Math.random()+"\0",lS="\0COMMA"+Math.random()+"\0",cS="\0PERIOD"+Math.random()+"\0";function Id(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function DA(n){return n.split("\\\\").join(sS).split("\\{").join(aS).split("\\}").join(Pd).split("\\,").join(lS).split("\\.").join(cS)}function FA(n){return n.split(sS).join("\\").split(aS).join("{").split(Pd).join("}").split(lS).join(",").split(cS).join(".")}function dS(n){if(!n)return[""];var e=[],t=iS("{","}",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=dS(i);return i.length&&(s[s.length-1]+=a.shift(),s.push.apply(s,a)),e.push.apply(e,s),e}function UA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),hs(DA(n),!0).map(FA)):[]}function BA(n){return"{"+n+"}"}function zA(n){return/^-?0\d/.test(n)}function HA(n,e){return n<=e}function jA(n,e){return n>=e}function hs(n,e){var t=[],r=iS("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?hs(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+Pd+r.post,hs(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=dS(r.body),u.length===1&&(u=hs(u[0],!1).map(BA),u.length===1))return i.map(function($){return r.pre+u[0]+$});var m;if(d){var h=Id(u[0]),g=Id(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(Id(u[2])):1,x=HA,v=g<h;v&&(S*=-1,x=jA);var b=u.some(zA);m=[];for(var E=h;x(E,g);E+=S){var C;if(c)C=String.fromCharCode(E),C==="\\"&&(C="");else if(C=String(E),b){var R=f-C.length;if(R>0){var M=new Array(R+1).join("0");E<0?C="-"+M+C.slice(1):C=M+C}}m.push(C)}}else{m=[];for(var L=0;L<u.length;L++)m.push.apply(m,hs(u[L],!1))}for(var L=0;L<m.length;L++)for(var s=0;s<i.length;s++){var a=o+m[L]+i[s];(!e||d||a)&&t.push(a)}}return t}});var Oi=(n,e)=>{},mc=!1;try{let n=await import("@sentry/node");Oi=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),mc=!0}catch{}import{Command as s_,Option as Vt}from"@commander-js/extra-typings";import{execSync as a_}from"child_process";import hv from"body-parser";import HM from"cors";import jM from"dedent";import $M from"events";import gv,{Router as GM}from"express";import{diff as MA}from"deep-object-diff";import hn from"fs";import Jr from"path";import{diff as iA}from"deep-object-diff";import{z as Gu}from"zod";var b_=Gu.object({input:Gu.string()});import{z as Ke}from"zod";var x_=Ke.object({srcs:Ke.array(Ke.string()),urls:Ke.array(Ke.string()),desiredSrc:Ke.string().optional(),desiredUrl:Ke.string().optional()}),Wu=Ke.object({srcRegex:Ke.string().optional(),urlRegex:Ke.string().optional()}),Vu=Ke.object({x:Ke.number(),y:Ke.number(),correlation:Ke.number()}),T_=Ke.object({searchImageBase64String:Ke.string(),pageImageBase64String:Ke.string(),id:Ke.string().uuid(),timeoutMs:Ke.number().max(1e4).min(0).optional()});import{z as k}from"zod";import{v4 as ye}from"uuid";import*as w from"zod";function Ce(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 Se}from"zod";Ce(Se);var qu=Se.object({plan:Se.string().optional(),evidence:Se.string().optional(),thoughts:Se.string(),result:Se.boolean(),relevantElements:Se.array(Se.number()).optional()}),bo=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(bo||{});var $x=Se.object({type:Se.literal("ELEMENT_CONTENT"),negated:Se.boolean().optional(),operation:Se.nativeEnum(bo),value:Se.string()}).openapi({ref:"ElementContentAssertion"}),Gx=Se.object({type:Se.literal("ELEMENT_ATTRIBUTE"),negated:Se.boolean().optional(),operation:Se.nativeEnum(bo),attr:Se.string(),value:Se.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Ni=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(Ni||{}),Wx=Se.object({type:Se.literal("ELEMENT_EXISTENCE"),negated:Se.boolean().optional(),condition:Se.nativeEnum(Ni).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Ku=Se.discriminatedUnion("type",[$x,Gx,Wx]).openapi({ref:"ManualElementAssertion"});var Vx=Se.object({type:Se.literal("CONTENT"),negated:Se.boolean().optional(),value:Se.string()}).openapi({ref:"PageContentAssertion"}),Yu=Se.discriminatedUnion("type",[Vx]).openapi({ref:"ManualPageAssertion"});import*as U from"zod";Ce(U);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||{}),qx=U.object({mPathSelectorTokens:U.string().array(),frameSrcRegex:U.string().optional(),frameUrlRegex:U.string().optional(),indices:U.number().array()}),Rr=U.object({id:U.number().int(),dataMomenticId:U.number().int().optional(),selector:U.string().optional(),hybridSelector:U.object({textContent:U.string().or(U.null()),attributes:U.record(U.string(),U.string()),tagName:U.string(),expandShadowRoot:U.boolean(),classNames:U.string().array(),nthChild:U.number()}).array().optional(),generatedSelectors:U.string().array().optional(),role:U.string().optional(),name:U.string().optional(),numChildren:U.number().optional(),content:U.string().optional(),pathFromRoot:U.string().optional(),serializedForm:U.string().optional(),nodeOnlySerializedForm:U.string().optional(),serializedHtml:U.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:U.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:U.string().url().optional(),boundingBox:U.object({x:U.number().optional(),y:U.number().optional(),width:U.number(),height:U.number()}).describe("css pixel bounding box").optional(),frameCache:qx.optional(),inputDescription:U.string().optional().describe("the description that generated this cache"),targetSource:U.nativeEnum(rr).optional(),targetUpdateTime:U.string().optional(),targetUpdateLoggerTags:U.record(U.string(),U.string()).optional()}).openapi({ref:"A11yTargetWithCache"});function Ju(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var Kx=U.object({type:U.literal("description"),elementDescriptor:U.string(),a11yData:Rr.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),Yx=U.object({x:U.number(),y:U.number()}),Jx=U.object({type:U.literal("coordinates"),pixels:Yx}).openapi({ref:"CoordinatesTarget"});function or(n){return n.type==="description"}function En(n){return n.type==="coordinates"}var pt=U.discriminatedUnion("type",[Kx,Jx]).openapi({ref:"ElementTarget"});function hc(n){if(!n)return!1;switch(n.type){case"description":return!!n.elementDescriptor}return!0}function ut(n){if(!n)return"";switch(n.type){case"description":return n.elementDescriptor;case"coordinates":return`x: ${n.pixels.x}, y: ${n.pixels.y}`}}import{z as ae}from"zod";var Vs=ae.object({url:ae.string(),method:ae.union([ae.literal("GET"),ae.literal("POST"),ae.literal("PUT"),ae.literal("DELETE"),ae.literal("PATCH")]),headers:ae.record(ae.string(),ae.string()).optional(),params:ae.record(ae.string(),ae.string()).optional(),body:ae.string().optional(),timeout:ae.number().int().optional().describe("Max seconds to wait for the request to complete")}),Xu=ae.object({url:ae.string(),headers:ae.record(ae.string(),ae.string()).optional(),query:ae.string(),variables:ae.record(ae.string(),ae.string()).optional(),timeout:ae.number().int().optional().describe("Max seconds to wait for the request to complete")}),qs=ae.object({code:ae.string(),fragment:ae.boolean().optional(),environment:ae.union([ae.literal("NODE"),ae.literal("BROWSER")]).optional().describe("default NODE"),timeout:ae.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ue=(z=>(z.AI_EXTRACT="AI_EXTRACT",z.AI_ASSERTION="AI_ASSERTION",z.AUTH_LOAD="AUTH_LOAD",z.AUTH_SAVE="AUTH_SAVE",z.BLUR="BLUR",z.CAPTCHA="CAPTCHA",z.CLICK="CLICK",z.COOKIE="COOKIE",z.COPY="COPY",z.DIALOG="DIALOG",z.DRAG="DRAG",z.ELEMENT_CHECK="ELEMENT_CHECK",z.FILE_UPLOAD="FILE_UPLOAD",z.FOCUS="FOCUS",z.GO_BACK="GO_BACK",z.GO_FORWARD="GO_FORWARD",z.HOVER="HOVER",z.JAVASCRIPT="JAVASCRIPT",z.LOCAL_STORAGE="LOCAL_STORAGE",z.MOUSE_DRAG="MOUSE_DRAG",z.NAVIGATE="NAVIGATE",z.NEW_TAB="NEW_TAB",z.PAGE_CHECK="PAGE_CHECK",z.PASTE="PASTE",z.PRESS="PRESS",z.KEY_DOWN="KEY_DOWN",z.KEY_UP="KEY_UP",z.REFRESH="REFRESH",z.REQUEST="REQUEST",z.GRAPHQL_REQUEST="GRAPHQL_REQUEST",z.SCROLL_DOWN="SCROLL_DOWN",z.SCROLL_UP="SCROLL_UP",z.SCROLL_LEFT="SCROLL_LEFT",z.SCROLL_RIGHT="SCROLL_RIGHT",z.SELECT_OPTION="SELECT_OPTION",z.SWITCH_TAB="TAB",z.TYPE="TYPE",z.VISUAL_DIFF="VISUAL_DIFF",z.WAIT="WAIT",z.WAIT_FOR_URL="WAIT_FOR_URL",z.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",z.AWAIT_LISTENER="AWAIT_LISTENER",z.RECORD_REQUESTS="RECORD_REQUESTS",z.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",z.SET_HEADER="SET_HEADER",z.SUCCESS="SUCCESS",z))(Ue||{});Ce(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"}),Cn=w.object({target:Rr}).optional().openapi({ref:"SingleTargetCache"}),Ks=w.object({loadTimeout:w.number().int().max(60).optional().describe("Max seconds for the page to load")}),Xx=K.merge(Ks).merge(w.object({type:w.literal("NAVIGATE"),url:w.string()})).openapi({ref:"NavigateCommand"}),Ys=qt.merge(w.object({cache:Cn})),wo=K.merge(Ys.merge(w.object({target:pt.optional(),type:w.literal("SCROLL_UP"),deltaY:w.number().optional()}))).openapi({ref:"ScrollUpCommand"}),vo=K.merge(Ys.merge(w.object({target:pt.optional(),type:w.literal("SCROLL_DOWN"),deltaY:w.number().optional()}))).openapi({ref:"ScrollDownCommand"}),xo=K.merge(Ys.merge(w.object({target:pt.optional(),type:w.literal("SCROLL_LEFT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),To=K.merge(Ys.merge(w.object({target:pt.optional(),type:w.literal("SCROLL_RIGHT"),deltaX:w.number().optional()}))).openapi({ref:"ScrollRightCommand"}),z_=w.discriminatedUnion("type",[wo,vo,xo,To]).openapi({ref:"AllScrollCommands"}),Zx=K.merge(w.object({type:w.literal("DIALOG"),action:w.union([w.literal("ACCEPT"),w.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Qx=K.merge(w.object({type:w.literal("WAIT"),delay:w.number()})).openapi({ref:"WaitCommand"}),eT=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()})]),tT=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")}),nT=K.extend({type:w.literal("WAIT_FOR_URL"),matcher:eT}).merge(tT).openapi({ref:"WaitUrlCommand"}),rT=K.merge(Ks).merge(w.object({type:w.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),oT=K.merge(w.object({type:w.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),iT=K.merge(w.object({type:w.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),sT=K.extend({type:w.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),aT=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"}),fc=K.merge(qt).extend({type:w.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),lT=K.extend({type:w.literal("COPY"),value:w.string()}).openapi({ref:"CopyCommand"}),cT=K.extend({type:w.literal("PASTE")}).openapi({ref:"PasteCommand"}),dT=K.merge(qs).extend({type:w.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),ki=K.merge(qt).merge(w.object({type:w.literal("CLICK"),target:pt,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:Cn,relativePosition:w.object({x:w.number(),y:w.number()}).optional()})).openapi({ref:"ClickCommand"}),_i=K.merge(qt).merge(w.object({type:w.literal("DRAG"),fromTarget:pt,toTarget:pt,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"}),Di=K.merge(qt).merge(w.object({type:w.literal("MOUSE_DRAG"),target:pt.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:Cn})).openapi({ref:"MouseDragCommand"}),Fi=K.merge(qt).merge(w.object({type:w.literal("HOVER"),target:pt,cache:Cn})).openapi({ref:"HoverCommand"}),Ui=K.merge(qt).merge(w.object({type:w.literal("FOCUS"),target:pt,cache:Cn})).openapi({ref:"FocusCommand"}),Bi=K.merge(qt).extend({type:w.literal("BLUR"),target:pt.optional(),cache:Cn}).openapi({ref:"BlurCommand"}),pT=w.object({type:w.literal("URL"),url:w.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),uT=w.object({type:w.literal("USER_FILE"),name:w.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),mT=K.extend({type:w.literal("FILE_UPLOAD"),fileSource:w.discriminatedUnion("type",[pT,uT]),filename:w.string().optional()}).openapi({ref:"FileUploadCommand"}),hT=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()})]),zi=K.merge(qt).extend({type:w.literal("SELECT_OPTION"),target:pt,cache:Cn,choice:hT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Sc=w.union([w.literal("MULTIMODAL"),w.literal("VISION_ONLY")]),Zu=K.merge(w.object({type:w.literal("AI_ASSERTION"),assertion:w.string(),disableCache:w.boolean().optional(),iframeUrl:w.string().optional(),contextChoice:Sc.optional(),timeout:w.number().int().optional().describe("Max seconds to wait for assertion to be true")})).openapi({ref:"AIAssertionCommand"}),Rn=5,yc=600,Hi=K.merge(qt).extend({type:w.literal("ELEMENT_CHECK"),target:pt,assertion:Ku,cache:Cn,timeout:w.number().int().min(0).max(yc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),gT=K.extend({type:w.literal("PAGE_CHECK"),assertion:Yu,iframeUrl:w.string().optional().describe("url or url regex for the iframe"),timeout:w.number().int().min(0).max(yc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),fT=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"}),ST=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()}),Qu=25,ji=K.merge(qt).merge(ST).extend({type:w.literal("TYPE"),target:pt.optional(),value:w.string(),cache:Cn}).openapi({ref:"TypeCommand"}),yT=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"}),bT=K.merge(w.object({type:w.literal("KEY_DOWN"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyDownCommand"}),wT=K.merge(w.object({type:w.literal("KEY_UP"),value:w.string(),convertMeta:w.boolean().optional()})).openapi({ref:"KeyUpCommand"}),vT=w.object({type:w.literal("SUBSTRING"),substring:w.string()}),xT=w.object({type:w.literal("REGEX"),pattern:w.string()}),TT=w.object({type:w.literal("INDEX"),index:w.coerce.string()}),ET=w.discriminatedUnion("type",[vT,xT,TT]),CT=K.merge(Ks).merge(w.object({type:w.literal("TAB"),action:ET})).openapi({ref:"TabCommand"}),RT=K.merge(Ks).merge(w.object({type:w.literal("NEW_TAB"),url:w.string()})).openapi({ref:"NewTabCommand"}),AT=K.merge(w.object({type:w.literal("COOKIE"),value:w.string()})).openapi({ref:"CookieCommand"}),IT=K.merge(w.object({type:w.literal("LOCAL_STORAGE"),key:w.string(),value:w.string()})).openapi({ref:"LocalStorageCommand"}),PT=K.extend({type:w.literal("REQUEST")}).merge(Vs).openapi({ref:"RequestCommand"}),LT=K.extend({type:w.literal("GRAPHQL_REQUEST")}).merge(Xu).openapi({ref:"GraphQLRequestCommand"}),OT=K.merge(w.object({type:w.literal("SUCCESS"),condition:Zu.optional()})).openapi({ref:"SuccessCommand"}),NT=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()}),$i=K.merge(qt).merge(w.object({type:w.literal("VISUAL_DIFF"),threshold:w.number().optional().describe("default 0.1"),target:pt.optional(),screenshot:MT.optional(),cache:Cn})).openapi({ref:"VisualDiffCommand"}),kT=K.merge(w.object({type:w.literal("REGISTER_REQUEST_LISTENER"),pattern:w.string(),key:w.string()})).openapi({ref:"RegisterRequestListenerCommand"}),_T=K.merge(w.object({type:w.literal("AWAIT_LISTENER"),key:w.string(),timeout:w.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),DT=K.merge(w.object({type:w.literal("RECORD_REQUESTS"),pattern:w.string(),key:w.string()})).openapi({ref:"RecordRequestsCommand"}),FT=K.merge(w.object({type:w.literal("GET_RECORDED_REQUESTS"),key:w.string()})).openapi({ref:"GetRecordedRequestsCommand"}),UT=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"}),em=w.discriminatedUnion("type",[ki,ji,yT,bT,wT,zi,Xx,vo,wo,Zu,Fi,Qx,OT]),BT=w.discriminatedUnion("type",[fT,aT,sT,fc,AT,lT,Zx,_i,Hi,mT,oT,iT,dT,IT,Di,RT,gT,cT,rT,PT,LT,xo,To,CT,$i,Ui,Bi,nT,kT,_T,DT,FT,UT]),Eo=w.discriminatedUnion("type",[...em.options,...BT.options]).openapi({ref:"Command"}),Js=w.discriminatedUnion("type",[...em.options,NT]);function Hn(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 tm(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 zT}from"zod";var W_=zT.discriminatedUnion("type",[Bi,fc,ki,_i,Ui,Fi,Di,wo,vo,xo,To,zi,ji,$i,Hi]);function nm(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as HT}from"zod";var At={type:!0,cache:!0},Ar=HT.discriminatedUnion("type",[Bi.pick(At),ki.pick(At),_i.pick(At),Hi.pick(At),Ui.pick(At),Fi.pick(At),Di.pick(At),wo.pick(At),vo.pick(At),xo.pick(At),To.pick(At),zi.pick(At),ji.pick(At),$i.pick(At)]),bc=Object.values(Ue).filter(n=>Ar.options.some(e=>e.shape.type.safeParse(n).success));Eo.options.forEach(n=>{if("target"in n.shape&&!bc.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as vc}from"zod";import{z as wc}from"zod";import{z as Co}from"zod";var It=Co.object({index:Co.number().optional().describe("global index within a test (in-order traversal)"),id:Co.string(),skipped:Co.boolean().optional(),envKey:Co.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:Co.boolean().optional()});Ce(wc);var Pt=It.extend({type:wc.literal("PRESET_ACTION"),command:Eo,skipped:wc.boolean().optional()}).openapi({ref:"PresetAction"});Ce(vc);var Ir=It.extend({type:vc.literal("AI_ACTION"),text:vc.string(),steps:Pt.array().optional()}).openapi({ref:"AIAction"});import{z as de}from"zod";var jT=de.object({cacheKey:de.string(),cacheExpiryMs:de.number()}),xc=It.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:jT.optional()}),jn=xc.extend({type:de.literal("MODULE"),moduleId:de.string().uuid()}),$T=de.union([jn.pick({type:!0,moduleId:!0}),de.record(de.unknown())]),GT=de.object({type:de.literal("URL_REGEX"),regex:de.string()}),WT=de.object({type:de.literal("PAGE_CHECK"),substring:de.string()}),Tc=de.object({cacheInvalidation:de.discriminatedUnion("type",[WT,GT]).optional()}),Lt=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:Tc.nullish()});import{z as st}from"zod";import{z as Ec}from"zod";Ce(Ec);var Ro=It.extend({type:Ec.literal("AI_ACTION_DYNAMIC"),text:Ec.string()}).openapi({ref:"AIActionDynamic"});import{z as rm}from"zod";var Cc=It.extend({type:rm.literal("CONDITIONAL"),skipped:rm.boolean().optional()});import{z as Xs}from"zod";var VT=Xs.object({type:Xs.literal("url"),url:Xs.string()}),Gi=It.extend({type:Xs.literal("IFRAME"),identifier:VT});import{z as Kt}from"zod";var Rc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(Rc||{});var qT=Kt.discriminatedUnion("type",[Kt.object({type:Kt.literal("NAVIGATE_URL"),url:Kt.string().url()}),Kt.object({type:Kt.literal("GO_TO_SECTION_START")})]),KT=Kt.object({trigger:Kt.nativeEnum(Rc).optional(),attempts:Kt.number().int().optional(),restartBehavior:qT}),Wi=It.extend({type:Kt.literal("SECTION"),description:Kt.string().describe("user provided goal of what the section should accomplish"),plan:Kt.string().array().optional(),autohealingConfig:KT.optional()});var om=Lt.merge(xc).extend({type:st.literal("RESOLVED_MODULE"),steps:st.lazy(()=>Pe.array())}),Ac=Lt.extend({steps:st.lazy(()=>Pe.array())}),Ic=Gi.extend({steps:st.lazy(()=>ve.array())}),YT=Gi.extend({steps:st.lazy(()=>Pe.array())}),Pc=Wi.extend({steps:st.lazy(()=>ve.array())}),JT=Wi.extend({steps:st.lazy(()=>Pe.array())}),Pr=Cc.extend({blocks:st.object({assertion:st.lazy(()=>Pt),steps:st.lazy(()=>ve.array())}).array(),elseSteps:st.lazy(()=>ve.array().optional())}),XT=Cc.extend({blocks:st.object({assertion:st.lazy(()=>Pt),steps:st.lazy(()=>Pe.array())}).array(),elseSteps:st.lazy(()=>Pe.array().optional())}),ve=st.discriminatedUnion("type",[Pt,Ir,Ro,jn,Pr,Ic,Pc]),Pe=st.discriminatedUnion("type",[Pt,Ir,Ro,om,XT,YT,JT]);import{z as Yt}from"zod";var ZT=Yt.object({steps:ve.array(),beforeSteps:ve.array().nullish(),afterSteps:ve.array().nullish()}),Ao=Yt.object({steps:Pe.array(),beforeSteps:Pe.array().nullish(),afterSteps:Pe.array().nullish()}),Lr=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 De="1.0.20";import{z as ir}from"zod";var Lc=ir.object({key:ir.string(),testId:ir.string().optional(),moduleId:ir.string().optional(),organizationId:ir.string(),value:Ar}),QT=Lc.extend({uniqueKey:ir.string()}),im=ir.record(ir.string(),QT);var sm=k.object({phrase:k.string()}),Oc=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()])}),GF=k.object({text:k.string()}),am=k.object({thoughts:k.string(),review:k.string().optional(),id:k.number().int()}),Zs=(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))(Zs||{});var lm=k.object({thoughts:k.string(),category:k.nativeEnum(Zs)}),eE=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()})]),WF=k.object({thoughts:k.string(),patches:eE.array()}),cm=[k.literal("add"),k.literal("replace"),k.literal("remove")],tE=k.object({op:k.union(cm),path:k.string(),value:Pe.optional()}),dm=k.object({patches:tE.array(),thoughts:k.string()});var nE=k.object({thoughts:k.string(),op:k.union(cm),value:k.union([k.null(),Pe])}),pm=k.object({reasoning:k.string(),scenario:k.string(),patch:nE.or(k.null())}),VF=k.object({thoughts:k.string(),evaluation:k.number().min(1).max(10)}),qF=k.object({observations:k.string(),reasoning:k.string(),command:Js});var Nc=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 D}from"zod";import*as ee from"zod";var QF=ee.object({thoughts:ee.string().optional().describe("only provided if a description was provided"),target:Rr.optional().describe("only provided if a description was provided"),pageState:ee.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ee.object({label:ee.string(),value:ee.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ee.object({data:ee.string(),height:ee.number().int(),width:ee.number().int()}).optional().describe("only provided if returnScreenshot is true")}),um=ee.union([ee.literal("ELEMENT_CHECK"),ee.literal("NEGATED_CHECK"),ee.literal("SELECT_OPTION"),ee.literal("TYPE")]);function Or(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.negated)return"NEGATED_CHECK";if(n.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Vi=(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))(Vi||{}),Io=ee.object({matched:ee.boolean(),reason:ee.string().optional().describe("Human understandable description"),logs:ee.string().array().optional().describe("Logs for debugging")}),rE=Io.extend({type:ee.literal("USER_SELECTOR")}),oE=Io.extend({type:ee.literal("CSS_SELECTOR"),selectors:ee.string().array()}),iE=Io.extend({type:ee.literal("HYBRID_SELECTOR")}),sE=Io.extend({type:ee.literal("HTML_DISTANCE"),distance:ee.number().optional(),closestElement:ee.string().optional(),savedElement:ee.string().optional()}),aE=Io.extend({type:ee.literal("TEMPLATE_MATCHING"),elementImageUrl:ee.string().url()}),lE=Io.extend({type:ee.literal("AUTO_FRAME"),logs:ee.string().array().optional()}),mm=ee.discriminatedUnion("type",[rE,oE,iE,sE,aE,lE]);import{z as Zi}from"zod";import{z as LC}from"zod";import*as X from"zod";import{cloneDeep as Yi}from"lodash-es";var cE=n=>{let e=hm(n,0);if(e===void 0||!pE(n[e]))return;let t=hm(n,e+1);if(t!==void 0)return uE(n,e,t)},gm=cE,hm=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!dE(r))return t}},dE=n=>n===" "||n===" "||n===`
|
|
5
|
+
`||n==="\r",pE=n=>n==="{"||n==="[",uE=(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 mE(r);if(r===void 0)r=i;else if(r[0]===i)r+=i;else return}},mE=n=>n===void 0?0:n[0]===" "?n.length:n;var fm=(n,e)=>{let t=Mc(n,"toPrecision",e,e);return t===void 0?Mc(n,"toExponential",e,e):t},Mc=(n,e,t,r)=>{let i=n[e](r).replace(hE,"$1").replace(gE,"$1");return i.length<=t?i:r===1?void 0:Mc(n,e,t,r-1)},hE=/(e)\+/iu,gE=/\.?0*($|e)/iu;var ym=(n,e)=>{if(typeof n!="string")throw new TypeError(`Input must be a JSON string: ${n}`);fE(e)},fE=n=>{if(SE(n),n<0)throw new TypeError(`"maxSize" argument must be positive: ${n}`);if(n<Sm)throw new TypeError(`"maxSize" argument must be at least ${Sm}: ${n}`)},SE=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}`)},Sm=7;var Qs=(n,e,t)=>{let r=wm(e,t);return bm(n,e,r)},bm=(n,e,t)=>{if(t>=e)return t;let r=n[t];return r>=RE&&r<=AE?bm(n,e,t+1):t},ea=(n,e,t)=>{if(t===void 0)return t;let r=wm(e,t);return yE(n,r)},yE=(n,e)=>bE(n,e)?e-3:wE(n,e)?e-2:vE(n,e)?e-1:e,bE=(n,e)=>e>=3&&n[e-3]>=xE&&n[e-3]<=TE,wE=(n,e)=>e>=2&&n[e-2]>=EE,vE=(n,e)=>e>=1&&n[e-1]>=CE,wm=(n,e)=>e<0||Object.is(e,-0)?Math.max(n+e,0):e,xE=240,TE=244,EE=224,CE=194,RE=128,AE=191;var vm=(n,e,t)=>{let r=globalThis.Buffer.from(n),o=Qs(r,r.length,e),i=ea(r,r.length,t);return o===0&&i>=r.length?r.toString():r.toString("utf8",o,i)};var xm=/[\uD800-\uDFFF]/gu,Tm="\uFFFD";var ta=n=>IE(n)?n.replace(xm,Tm):n,IE=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 Dc=({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 Fc=(n,e,t)=>e<0||Object.is(e,-0)?kE(n,e,t):ME(n,e,t),ME=(n,e,t)=>Dc({input:n,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),kE=(n,e,t)=>Dc({input:n,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:n.length-1});var na=(n,e,t)=>{let r=Fc(n,e,!1),o=_E(n,t),i=r===0&&o===void 0?n:n.slice(r,o);return ta(i)},_E=(n,e)=>{if(e===void 0)return e;let t=Fc(n,e,!0);return t===n.length?void 0:t};var Cm=(n,e,t)=>{let{textEncoder:r,textDecoder:o}=DE(),i=FE(n),{written:s}=r.encodeInto(n,i),a=Qs(i,s,e),l=ea(i,s,t),c=l===void 0?s:Math.min(l,s),d=i.subarray(a,c);return o.decode(d)},DE=()=>(Uc===void 0&&(Uc=new globalThis.TextEncoder,Em=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:Uc,textDecoder:Em}),Uc,Em,FE=n=>{let e=n.length*3;return e>UE?new Uint8Array(e):((ra===void 0||ra.length<e)&&(ra=new Uint8Array(e)),ra)},UE=1e5,ra;var Rm=(n,e)=>{if(e===void 0)return e;let t=Bc(n,e);return t>=n.length*Am?void 0:t},Bc=(n,e)=>e<=n.length*-Am?0:e,Am=4;var Im=(n,e,t)=>{if(typeof n!="string")throw new TypeError(`First argument must be a string: ${n}`);BE(e),zE(t)},BE=n=>{if(n===void 0)throw new TypeError("Second argument is required.");Pm("Second",n)},zE=n=>{n!==void 0&&Pm("Third",n)},Pm=(n,e)=>{if(!Number.isInteger(e))throw new TypeError(`${n} argument must be an integer: ${e}`)};var Lm=n=>{let e=!0,t=0;for(let r=0;r<zc;r+=1){let o=HE(n,r);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/zc}},HE=(n,e)=>{let t=zc-1,r=1-(t-e)/t,o=Math.round(r*(n.length-1));return n.charCodeAt(o)},zc=50;var jE=(n,e,t)=>{if(Im(n,e,t),n==="")return n;let r=Bc(n,e),o=Rm(n,t);return o===void 0&&Object.is(r,0)?ta(n):$E(n,r,o)},Om=jE,$E=(n,e,t)=>{if(n.length<=GE)return na(n,e,t);let{asciiOnly:r,longCharsPercentage:o}=Lm(n);return r?VE(n,e,t):o>=WE?na(n,e,t):Nm(n,e,t)},GE=200,WE=.4,VE=(n,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?vm(n,e,t):Nm(n,e,t),Nm=(n,e,t)=>"TextEncoder"in globalThis?Cm(n,e,t):na(n,e,t);var km=(n,e)=>{let t=JSON.stringify(n),r=YE(t),o=Om(r,0,e-Mm.length-qi.length*2),s=`${qE(o)}${Mm}`;return JE(s)},qE=n=>n.replace(KE,""),KE=/(\\|\\u[0-9a-fA-F]{0,3})$/u,YE=n=>n.slice(qi.length,-qi.length),JE=n=>`${qi}${n}${qi}`,qi='"',Mm="...";var _m=n=>globalThis.Buffer.byteLength(n);var Hc=n=>{let e=n.length,t=e;for(let r=0;r<e;r+=1){let o=n.charCodeAt(r);if(o<=XE)continue;if(o<=ZE){t+=1;continue}if(t+=2,o<QE||o>eC)continue;let i=n.charCodeAt(r+1);i<tC||i>nC||(r+=1)}return t},XE=127,ZE=2047,QE=55296,eC=56319,tC=56320,nC=57343;var Dm=()=>rC.bind(void 0,new TextEncoder),rC=(n,e)=>{let t=oC(e);return n.encodeInto(e,t).written},oC=n=>{let e=n.length*3;return e>iC?new Uint8Array(e):((oa===void 0||oa.length<e)&&(oa=new Uint8Array(e)),oa)},iC=1e5,oa;var aC=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?_m:"TextEncoder"in globalThis?lC.bind(void 0,Dm()):Hc,lC=(n,e)=>e.length<100?Hc(e):n(e),Fm=aC();var Um=n=>{if(n===null)return cC;if(n===!0)return dC;if(n===!1)return pC;let e=typeof n;return e==="object"?uC:e==="number"?JSON.stringify(n).length:jc(n)},cC=4,dC=4,pC=5,uC=2,jc=n=>Fm(JSON.stringify(n));var ia=({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}},zm=n=>Um(n),Hm=(n,e,t)=>{let r=$m({empty:n,indent:e,depth:t,keySpaceSize:0}),o=Gm(n);return r+o},jm=({key:n,empty:e,indent:t,depth:r})=>{let o=$m({empty:e,indent:t,depth:r,keySpaceSize:1}),i=jc(n),s=Gm(e);return o+i+mC+s},mC=1,$m=({empty:n,indent:e,depth:t,keySpaceSize:r})=>{if(e===void 0)return 0;let o=Bm+e*(t+1),i=n?Bm+e*t:0;return r+o+i},Bm=1,Gm=n=>n?0:hC,hC=1;var sa=({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}=ia({size:a,increment:r,maxSize:o,truncatedProps:e,path:u,value:p});return h?{empty:s,size:m,truncatedProps:g}:gC({value:p,truncatedProps:e,path:u,maxSize:o,empty:s,size:a,newSize:m,truncateValue:l,indent:c,depth:d})},gC=({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 Wm=({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=Hm(c.empty,s,a);c=sa({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 Vm=({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=jm({key:d,empty:c.empty,indent:s,depth:a});c=sa({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 aa=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:s})=>{let a=zm(n),{size:l,stop:c,truncatedProps:d}=ia({size:r,increment:a,maxSize:o,truncatedProps:e,path:t,value:n});return c?{value:void 0,size:l,truncatedProps:d}:fC({value:n,truncatedProps:d,path:t,size:l,maxSize:o,indent:i,depth:s})},fC=({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)?Wm({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:aa,indent:i,depth:s}):Vm({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:aa,indent:i,depth:s});var SC=(n,e)=>{ym(n,e);let t=yC(n),r=bC(n),{value:o,truncatedProps:i}=aa({value:r,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:wC({newValue:o,value:r,maxSize:e,indent:t}),truncatedProps:i}},Po=SC,yC=n=>{let e=gm(n);return typeof e=="string"?e.length:e},bC=n=>{try{return JSON.parse(n)}catch(e){throw new TypeError(`Invalid JSON string: "${n}"
|
|
7
|
+
${e.message}`)}},wC=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?fm(e,t):km(e,t);import*as Mr from"zod";import{z as pn}from"zod";import{z as wt}from"zod";var $c=wt.object({autoFollowNewTabs:wt.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:wt.boolean().optional(),ignoreHrefForCaching:wt.boolean().optional(),hybridSelectorMode:wt.enum(["test","prefer"]).optional()});var qm=1e4,Km=6e4,Nr=$c.extend({pageLoadTimeoutMs:wt.number().optional().refine(n=>n===void 0||n<=Km&&n>=-1,{message:`Page load timeout must be between 0 and ${Km/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:wt.number().optional().refine(n=>n===void 0||n<=qm&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${qm/1e3} seconds`}),localChromeExtensionPaths:wt.string().array().optional(),extraHeaders:wt.record(wt.string(),wt.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:wt.string().optional(),disableGpu:wt.boolean().optional(),bustCacheOnBoundingBoxChange:wt.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:wt.boolean().optional().describe("Allow fetching the partial accessibility tree if the full tree takes too long.")});var Ve="BASE_URL",la="CURRENT_URL",Lo="ENV_NAME",Ki="TEST_NAME",dU={[Ve]:"https://www.google.com"},Ym=pn.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),Jm=pn.object({name:pn.string(),variables:pn.record(pn.string().describe("variable name"),pn.string().describe("variable value"))}),Xm=pn.object({name:pn.string(),variables:pn.record(pn.string().describe("variable name"),pn.unknown().describe("variable value")),browser:Nr.optional()});Ce(Mr);var Ji=Mr.object({env:Mr.record(Mr.unknown())}).openapi({ref:"TestContextSnapshot"}),vC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",xC=[Ve,Lo,Ki],Zm=[la,Ve,Lo,Ki],Ot=class n{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,r={}){return new n({baseUrl:"about:blank",currentUrl:"about:blank",testName:e,envName:t,variablesFromEnvironment:r})}static fromSnapshot({snapshot:e,environmentVariables:t}){let r=e.env[Ve]??"about:blank",o=e.env[la]??"about:blank",i=e.env[Lo],s=e.env[Ki],a={};for(let[c,d]of Object.entries(e.env))Zm.includes(c)||(t??{})[c]===void 0&&(a[c]=d);return new n({baseUrl:r,currentUrl:o,dynamicVariables:a,envName:i,testName:s,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Yi(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){xC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[Lo]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Yi(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>Zm.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,vC]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Po(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Po(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[la]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Yi(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ve,e.baseUrl),e.envName&&this.setMomenticSystemVariable(Lo,e.envName),e.testName&&this.setMomenticSystemVariable(Ki,e.testName)}getDynamicVariablesCopy(){return Yi(this.env)}getVariablesFromEnvironmentCopy(){return Yi(this.varsFromMomenticEnvironment)}};import{z as kr}from"zod";Ce(kr);var pe=(c=>(c.AI_PROVIDER="AIProviderError",c.USER_INFRA="UserInfrastructureError",c.ACTION_FAILURE="ActionFailureError",c.ASSERTION_FAILURE="AssertionFailureError",c.CONFIG_ERROR="UserConfigurationError",c.WEB_AGENT_PLATFORM="InternalWebAgentError",c.UNKNOWN_PLATFORM="InternalPlatformError",c.JOB_TIMEOUT="JobTimeoutError",c.UNKNOWN="UnknownError",c))(pe||{});var Qm=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],ca={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"},Oo={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."},Gc=kr.object({reason:kr.nativeEnum(pe),summary:kr.string()}).openapi({ref:"TestResultClassification"}),da=kr.object({errorMessage:kr.string(),errorStack:kr.string().optional(),classification:Gc.optional()}).openapi({ref:"TestFailureDetails"});Ce(X);var Re=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Re||{}),Wc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(Wc||{}),Vc=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()}),TC=Vc.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(Wc),message:X.string().optional(),elementInteracted:X.string().optional()}),sr=Vc.extend({status:X.nativeEnum(Re),message:X.string().optional(),data:X.unknown().optional(),beforeTestContext:Ji.optional(),afterTestContext:Ji.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"}),pa=sr.merge(Pt).extend({results:TC.array(),proposedStep:Pt.optional()}),EC=sr.merge(Ir).extend({results:X.lazy(()=>pa.array())}),CC=sr.merge(Ro).extend({results:X.lazy(()=>pa.array())}),RC=sr.merge(jn).extend({moduleName:X.string().optional(),results:X.lazy(()=>Nt.array())}),AC=sr.merge(Pr).extend({assertion:pa.optional(),results:X.lazy(()=>Nt.array()).describe("results for the block actually executed")}),IC=sr.merge(Gi).extend({results:X.lazy(()=>Nt.array())}),PC=sr.merge(Wi).extend({results:X.lazy(()=>Nt.array()),healingAttempts:X.lazy(()=>Nt.array().array()).optional()}),Nt=X.discriminatedUnion("type",[EC,CC,pa,RC,AC,IC,PC]),ua=sr.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),ma=Vc.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var qc=LC.object({results:Nt.array().describe("main results"),beforeResults:Nt.array().optional(),afterResults:Nt.array().optional()}),ha=qc.partial();import{z as G}from"zod";import{z as Ae}from"zod";var OC=Ae.object({type:Ae.literal("FAILURE_RECOVERY"),thoughts:Ae.string()}),NC=Ae.object({type:Ae.literal("DESCRIPTION_UPDATE"),thoughts:Ae.string()}),ga=Ae.discriminatedUnion("type",[NC,OC]),fa=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(fa||{}),MC=Ae.object({testId:Ae.string(),name:Ae.string(),orgId:Ae.string(),runId:Ae.string(),purpose:Ae.nativeEnum(fa).catch("AUTO_HEALING"),steps:Pe.array(),details:ga.or(ga.array()).optional()}),DU=MC.pick({name:!0,orgId:!0}),Kc=Ae.object({id:Ae.string(),name:Ae.string().nullish(),createdAt:Ae.string().pipe(Ae.coerce.date()).or(Ae.date()),organizationId:Ae.string(),schemaVersion:Ae.string(),purpose:Ae.nativeEnum(fa).catch("AUTO_HEALING"),runId:Ae.string().nullish(),details:ga.or(ga.array()).nullish(),applied:Ae.boolean().nullish(),appliedAt:Ae.coerce.date().nullish()}),eh=Kc.extend({steps:Pe.array()});import{isValidCron as kC}from"cron-validator";import{z as ne}from"zod";import{z as Yc}from"zod";var $n=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r))($n||{});var Sa=Yc.object({width:Yc.number().min(200).max(1e4),height:Yc.number().min(200).max(1e4)}),th={"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}},BU=Object.keys(th);var Jt=th["Desktop Large"],No="en-us",Mo="America/Los_Angeles";var ko={latitude:37.7749,longitude:-122.4194};var nh=["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 rh=2e3,ya=Nr.extend({browserType:ne.nativeEnum($n).optional(),slowMoMs:ne.number().optional().refine(n=>n===void 0||n<=rh&&n>=-1,{message:`Slow motion must be between 0 and ${rh} milliseconds`}),basicAuthorization:ne.object({username:ne.string().optional(),password:ne.string().optional()}).optional(),geolocation:ne.object({latitude:ne.coerce.number().refine(n=>n>=-90&&n<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:ne.coerce.number().refine(n=>n>=-180&&n<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:ne.boolean().optional(),locale:ne.string().optional(),timezone:ne.enum(nh).optional(),colorScheme:ne.enum(["light","dark"]).optional()}),oh=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],_C=ne.object({disableAICaching:ne.boolean().optional(),failureRecovery:ne.boolean().optional().describe("undefined means inherit org settings")});var DC=ne.object({viewport:Sa.optional()}),_o=DC.merge(_C).merge(ya),Do=ne.object({cron:ne.string().refine(n=>kC(n),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:ne.boolean().default(!1),env:ne.string().optional(),timeZone:ne.string().default("America/Los_Angeles"),jobKey:ne.string().optional()}),Fo=ne.object({onSuccess:ne.boolean().default(!1),failureMessage:ne.string().optional(),onFailure:ne.boolean().default(!0),successMessage:ne.string().optional()}),FC=ne.object({name:ne.string(),required:ne.boolean().optional(),defaultValue:ne.string().describe("this is not optional because we need a value when the editor is first loaded")}),ba=FC.array(),UC=ne.object({name:ne.string(),value:ne.string()}),ih=UC.array(),wa=ne.object({name:ne.string(),default:ne.boolean().optional(),fixtures:Ym.array().optional()});Ce(G);var Xt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},oe=(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))(oe||{}),va=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(va||{});var qe=G.string().pipe(G.coerce.date()).or(G.date()),Xi=G.object({id:G.string(),runKey:G.string(),organizationId:G.string(),createdAt:qe,createdBy:G.string(),flake:G.boolean().nullish(),scheduledAt:qe.or(G.null()),startedAt:qe.or(G.null()),updatedAt:qe.nullish(),finishedAt:qe.or(G.null()),resolvedBaseUrl:G.string().nullish(),environmentName:G.string().nullish(),labels:G.array(G.string()).optional(),cliVersion:G.string().nullish(),section:G.nativeEnum(va).nullish(),status:G.nativeEnum(oe),trigger:G.nativeEnum(Xt),attempts:G.number(),runAttempts:G.array(G.object({id:G.string(),status:G.nativeEnum(oe),startedAt:qe.or(G.null()),finishedAt:qe.or(G.null())})).optional(),videos:G.array(G.string()).optional(),failureReason:G.nativeEnum(pe).nullish(),failureDetails:da.nullish(),testFragments:G.array(Kc).nullish(),localTestId:G.string().nullish(),testId:G.string().nullish(),testName:G.string().nullish(),test:G.object({name:G.string(),id:G.string()}).nullish().default(null),suiteId:G.string().nullish()}).openapi({ref:"RunMetadata"}),BC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},xa=Xi.pick({...BC,test:!0}),sh=Xi.omit({failureReason:!0,failureDetails:!0,test:!0}),Jc=Xi.extend({stepsSnapshot:G.array(G.record(G.unknown())).nullish(),resolvedInputs:G.record(G.string(),G.string()).nullish(),test:G.object({name:G.string(),id:G.string(),description:G.string().nullish(),baseUrl:G.string().nullish(),advanced:_o.nullish()}).nullish()}).merge(qc),ah=n=>n.includes("PASSED")&&n.includes("FAILED");var zC=Zi.object({id:Zi.string().uuid(),startedAt:qe.or(Zi.null()),finishedAt:qe.or(Zi.null()),status:Zi.nativeEnum(oe)}).merge(ha),aB=zC.array();var Qi=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(Qi||{});import{z as Ye}from"zod";var HC=Ye.object({id:Ye.string(),status:Ye.nativeEnum(oe),trigger:Ye.nativeEnum(Xt),createdAt:qe,startedAt:qe.nullish(),finishedAt:qe.nullish(),gitCommitSha:Ye.string().nullish(),gitCommitShaShort:Ye.string().nullish(),gitCommitTimestamp:qe.nullish(),gitBranchName:Ye.string().nullish(),gitOriginUrl:Ye.string().nullish(),gitCommitMessage:Ye.string().nullish(),gitCommitAuthorName:Ye.string().nullish(),githubRepository:Ye.string().nullish(),gitlabProjectPath:Ye.string().nullish(),pipelineId:Ye.string().nullish(),cliVersion:Ye.string().nullish(),suite:Ye.object({id:Ye.string(),name:Ye.string()}).nullish(),runs:Ye.object({status:Ye.nativeEnum(oe)}).array()}).openapi({ref:"RunGroup"}),lh=HC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:xa.array()});import{z as Qe}from"zod";var jC=Qe.object({type:Qe.literal("TARGETING"),name:Qe.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:mm.array(),pageState:Qe.string().optional(),targetSource:Qe.nativeEnum(rr).optional(),targetUpdateTime:Qe.string().optional()}),$C=Qe.object({type:Qe.literal("AI_LOCATION"),matched:Qe.boolean(),pageState:Qe.string().optional(),ragUsed:Qe.boolean().optional(),thoughts:Qe.string().optional()}),GC=Qe.object({type:Qe.literal("ASSERTION"),relevantElementsSerialized:Qe.string().array().optional(),pageState:Qe.string().optional(),ragUsed:Qe.boolean().optional()}),ch=Qe.discriminatedUnion("type",[jC,$C,GC]);function Ta(){return{details:[]}}import{z as Be}from"zod";var WC=Be.object({id:Be.string(),name:Be.string()}),vB=WC.merge(Be.object({createdAt:qe,createdBy:Be.string(),schedule:Do,notification:Fo,environment:Be.object({name:Be.string()}).nullish(),beforeTests:Be.object({id:Be.string()}).array().nullish(),afterTests:Be.object({id:Be.string()}).array().nullish()})),dh=Be.object({id:Be.string().uuid(),orgId:Be.string(),createdAt:qe,startedAt:qe.or(Be.null()),finishedAt:qe.or(Be.null()),status:Be.nativeEnum(oe),trigger:Be.nativeEnum(Xt),suite:Be.object({id:Be.string(),name:Be.string()}).nullish(),runs:Xi.array()}),xB=dh.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),ph=dh.extend({runs:xa.array()});import{z as Zt}from"zod";import{cloneDeep as RB}from"lodash-es";import{z as ge}from"zod";var OB=ge.object({thoughts:ge.string(),subGoals:ge.object({instruction:ge.string()}).array()}),NB=ge.object({thoughts:ge.string(),newPlanMarkdown:ge.string()}),MB=ge.object({thoughts:ge.string(),correct:ge.boolean(),failedActionIndex:ge.number().optional()}),VC=ge.object({type:ge.literal("PLANNING"),beforePlan:ge.string(),goalDecision:ge.string(),thoughts:ge.string()}),qC=ge.object({type:ge.literal("RUNNING"),stepDisplayName:ge.string(),status:ge.nativeEnum(Re),results:Nt.array()}),KC=ge.object({type:ge.literal("REVISING"),beforePlan:ge.string(),afterPlan:ge.string(),errString:ge.string(),diffs:ge.string(),thoughts:ge.string()}),YC=ge.object({type:ge.literal("SYSTEM"),message:ge.string()}),JC=ge.discriminatedUnion("type",[VC,qC,KC,YC]),uh=JC.array();var UB=Zt.object({id:Zt.string(),scheduledAt:Zt.coerce.date().nullable(),startedAt:Zt.coerce.date().nullable(),finishedAt:Zt.coerce.date().nullable(),status:Zt.nativeEnum(oe),history:uh.nullable(),testPlan:Zt.object({id:Zt.string(),name:Zt.string()}).nullable(),test:Zt.object({id:Zt.string(),name:Zt.string()}).nullable()});var Qt=D.object({disableCache:D.boolean().optional(),loggerTags:D.record(D.string(),D.string()).optional(),langfuseSessionId:D.string().optional(),agentConfigVersion:D.string().optional()}),XC=D.object({screenshotBase64AfterCommand:D.string(),urlAfterCommand:D.string(),serializedCommand:D.string(),elementInteracted:D.string().optional(),thoughts:D.string().optional()}),mh=D.object({goal:D.string(),browserState:D.string(),screenshot:D.string(),source:um.optional().catch(void 0)}),hh=D.object({target:D.string().or(D.number()),browserState:D.string().optional(),screenshot:D.string().optional(),boundingBox:D.object({x:D.number(),y:D.number(),height:D.number(),width:D.number()}).optional()}),gh=D.object({goal:D.string(),browserState:D.string(),screenshot:D.string().optional(),returnSchema:D.string().optional()}),fh=D.object({goal:D.string(),browserState:D.string(),screenshot:D.string(),url:D.string(),contextChoice:Sc.optional()}),Sh=D.object({command:Eo}),Xc=D.object({goal:D.string(),browserState:D.string(),startingScreenshot:D.string().optional(),screenshot:D.string(),url:D.string(),history:XC.array(),actionHint:D.string().optional(),lastError:D.string().optional()}),yh=D.object({results:ma.array(),errorMessage:D.string(),errorStack:D.string().optional()}),bh=D.object({results:ma.array(),goal:D.string(),errorMessage:D.string()}),wh=D.object({failedResults:ma.array(),nextStepsSerialized:D.string().array(),currentUrl:D.string(),currentPageState:D.string(),currentScreenshot:D.string()}),o1=D.object({description:D.string(),type:D.union([D.literal("locator"),D.literal("assertion"),D.literal("ai-action")]),excerpt:D.string()});import{z as es}from"zod";var a1=es.object({goal:es.string()}),vh=es.object({keywords:es.array(es.string())});import{z as vt}from"zod";var Zc=vt.object({content:vt.string(),ids:vt.string().array(),tokenLength:vt.number()}),ZC=vt.object({chunks:Zc.array()}),d1=vt.object({ids:vt.string().array(),score:vt.number(),tokenLength:vt.number()}),p1=ZC.extend({description:vt.string().describe("Input to pass to RAG engine"),tokenLimit:vt.number()}),xh=vt.object({ids:vt.number().array()}),Th=vt.object({indices:vt.number().array()});import{z as Qc}from"zod";var ed=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))(ed||{}),h1=Qc.nativeEnum(ed),QC=Qc.enum(["v1","v2"]),g1=QC.or(Qc.string().describe("for people with special configurations"));var Eh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as _r}from"zod";var Ch=_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")}),td=Ch.merge(Vs).extend({type:_r.literal("REQUEST")}),nd=Ch.merge(qs).extend({type:_r.literal("JAVASCRIPT")}),rd=_r.discriminatedUnion("type",[nd,td]);import{z as en}from"zod";import{z as Dr}from"zod";var eR=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Me=n=>{let e=n.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var Ea=Dr.string().min(1).max(255).superRefine((n,e)=>{try{Uo(n)}catch(t){return e.addIssue({code:Dr.ZodIssueCode.custom,message:t.message,fatal:!0}),Dr.NEVER}});function Uo(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(eR))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Ca=Dr.preprocess(n=>n===null?"":n,Dr.union([Dr.string().url(),Dr.literal("")])).optional();var Rh=en.object({id:en.string(),name:Ea,description:en.string().optional().nullish(),baseUrl:Ca.nullish(),schemaVersion:en.string(),advanced:en.unknown().optional(),retries:en.number(),envs:en.array(wa).nullish(),parameters:ba.nullish()}),tR=en.object({createdAt:en.coerce.date(),updatedAt:en.coerce.date(),schedule:Do.nullish(),notification:Fo.nullish(),createdBy:en.string(),organizationId:en.string()}),nR=Rh.merge(tR),D1=nR.extend({steps:rd.array()}),F1=Rh.extend({steps:rd.array()});import{z as Mt}from"zod";var Ah=Mt.object({startedAt:Mt.coerce.date(),finishedAt:Mt.coerce.date(),status:Mt.nativeEnum(Re),message:Mt.string().optional(),data:Mt.unknown().optional()}),oR=Ah.merge(nd).extend({type:Mt.literal("JAVASCRIPT")}),iR=Ah.merge(td).extend({type:Mt.literal("REQUEST")}),sR=Mt.discriminatedUnion("type",[oR,iR]),Ih=Mt.object({startedAt:Mt.coerce.date(),finishedAt:Mt.coerce.date().nullish(),status:Mt.nativeEnum(oe),results:sR.array(),failureReason:Mt.string().nullish(),failureDetails:da.nullish()});import{z as kt}from"zod";var aR=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(oe),trigger:kt.nativeEnum(Xt),results:Ih.array().nullish(),apiTestName:kt.string().nullish(),apiTestPath:kt.string().nullish(),apiTestId:kt.string().nullish()}),V1=aR.pick({status:!0,startedAt:!0,finishedAt:!0});var ts=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(ts||{}),Ph=3;function lR(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function ns(n){if(!lR(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 rs(n){switch(n.type){case"AI_EXTRACT":case"AI_ASSERTION":return Ph;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 Bo=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function od(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as cR,splitCookiesString as dR}from"set-cookie-parser";import{z as fe}from"zod";var id=fe.object({name:fe.string(),value:fe.string(),url:fe.string().optional(),domain:fe.string().optional(),path:fe.string().optional(),expires:fe.number().default(Date.now()/1e3+60*60*24*365),httpOnly:fe.boolean().optional(),secure:fe.boolean().default(!0),sameSite:fe.union([fe.literal("Strict"),fe.literal("Lax"),fe.literal("None")]).default("None")});function Ra(n,e){let t=[],r=dR(n);for(let o of r){let i=cR(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=id.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 pR=fe.object({origin:fe.string(),localStorage:fe.array(fe.object({name:fe.string(),value:fe.string()}))}),uR=fe.object({entries:fe.record(fe.string(),fe.array(fe.tuple([fe.unknown(),fe.unknown()]))),version:fe.number().optional()}),Aa=fe.object({cookies:id.array().optional(),origins:pR.array().optional(),idb:fe.record(fe.string(),uR).optional().describe("key is db name")});function Ia(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=id.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 hz=new Set(Object.values(Ue));var mR={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"},gz={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:[]},fz={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 bz,en as wz}from"@faker-js/faker";import{z as W}from"zod";var Lh=55555,Ez=W.object({body:W.string(),to:W.string(),from:W.string()}),Cz=W.object({from:W.string().optional(),to:W.string(),timeout:W.number().optional(),beforeDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional()}),Rz=W.object({to:W.string(),from:W.string(),subject:W.string(),body:W.string()}),Az=W.object({inbox:W.string(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),timeout:W.number().optional(),trimWhitespace:W.boolean().optional()}),Iz=W.object({inbox:W.string(),limit:W.number().optional(),afterDate:W.string().pipe(W.coerce.date()).or(W.date()).optional(),trimWhitespace:W.boolean().optional()});var Oh=W.object({result:W.unknown(),variableUpdates:W.record(W.string(),W.unknown()).optional(),persistentVariableUpdates:W.record(W.string(),W.unknown()).optional(),error:W.string().optional(),success:W.boolean()}),Pz=W.object({id:W.string().optional(),orgId:W.string(),momenticLambdaAuthHash:W.string(),code:W.string(),fragment:W.boolean(),state:Ji,timeoutMs:W.number().optional()}),ar=15e3;import*as mt from"zod";Ce(mt);var hR=mt.object({url:mt.string(),lineNumber:mt.number(),columnNumber:mt.number()}).openapi({ref:"CodeLocation"}),Pa=mt.object({timestamp:mt.number(),text:mt.string(),type:mt.string(),tabIndex:mt.number(),args:mt.unknown().array().optional(),url:mt.string().optional(),location:hR.optional()}).openapi({ref:"ConsoleLog"}),Nh=Pa.array(),gR=Nh.array();import*as ad from"zod";import{z as I}from"zod";var fR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),SR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),yR=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),kh=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:yR,comment:I.string().optional()}),bR=I.array(kh),wR=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()}),_h=I.array(wR),vR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),Dh=I.array(vR),xR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),TR=I.array(xR),ER=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),CR=I.array(ER),RR=I.object({mimeType:I.string(),params:CR,text:I.string(),comment:I.string().optional()}),AR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:_h,headers:Dh,queryString:TR,postData:RR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),IR=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()}),PR=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:_h,headers:Dh,content:IR,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),Mh=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),LR=I.object({beforeRequest:Mh.optional(),afterRequest:Mh.optional(),comment:I.string().optional()}),OR=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()}),Fh=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:AR,response:PR.optional(),cache:LR.optional(),timings:OR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),NR=I.array(Fh),MR=I.object({version:I.string().default("1.1"),creator:fR.optional(),browser:SR.optional(),pages:bR.optional(),entries:NR,comment:I.string().optional()}),kR=I.object({log:MR}),Uh=I.record(I.string(),kh),Bh=I.record(I.string(),Fh);function sd(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())}}}Ce(ad);var _R=ad.object({logsPerPage:Pa.array().array(),harPages:Uh.optional(),harEntries:Bh.optional()}).openapi({ref:"DebugData"});var Fr=class{async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,r,o){}async storeNetworkLogsForRunAttempt(e,t,r,o){}async storeScreenshot(e,t,r){}async storeHtmlSnapshot(e,t,r){}};var La=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function zh(n){for(let e of Object.values(pe))if(n.includes(e))return e}var A=class extends Error{reason;constructor(e,t,r){let o=!1;for(let i of Object.values(pe))if(t.startsWith(i)){o=!0,e=i;break}if(r?.errOptions?.cause)super(o?t:`${e}: ${t}`,r?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,r?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e,Object.defineProperty(this,"lastScreenshotBuffer",{value:r?.lastScreenshotBuffer,enumerable:!1})}getLastScreenshotBuffer(){return"lastScreenshotBuffer"in this?this.lastScreenshotBuffer:void 0}toString(){return this.message}toJSON(){return{message:this.message}}},An=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 Hh(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator"):!1}function ld(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 os(n){return n instanceof Error?n.message.includes("Timeout")&&n.message.includes("exceeded")&&n.message.includes("waiting for locator")&&n.message.includes("data-momentic-id")&&!n.message.includes("locator resolved")&&!n.message.includes("waiting for element to be"):!1}var Ur=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};import{cloneDeep as DR}from"lodash-es";import{z as In}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 jh=In.union([In.string(),In.number(),In.boolean(),In.null(),In.record(In.string(),In.lazy(()=>jh)),In.array(In.lazy(()=>jh))]),is=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=DR(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")}},SH=new is({},{});var cd={".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"},$h=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],bH=Object.keys(cd);import*as Gh from"zod";var vH=Gh.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 EH=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 Je}from"zod";var xt=Je.object({id:Je.string(),name:Ea,baseUrl:Ca,description:Je.string().optional().nullish(),schemaVersion:Je.string(),advanced:_o,retries:Je.number(),envs:Je.array(wa).nullish(),parameters:ba.nullish(),disabled:Je.boolean().optional(),labels:Je.array(Je.string()).optional().catch([])}),OH=xt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),FR=Je.object({labels:Je.array(Je.string()).optional(),outputs:ih.nullish()}),tn=xt.merge(FR),UR=Je.object({createdAt:Je.coerce.date(),updatedAt:Je.coerce.date(),updatedBy:Je.string().nullable(),schedule:Do,notification:Fo,createdBy:Je.string(),organizationId:Je.string(),folderId:Je.string().nullable().optional()}),BR=xt.merge(UR),NH=BR.merge(Ao),Oa=xt.merge(Ao),MH=xt.merge(Lr);var Wh=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()}),zR=P.array(Wh.extend({id:P.string(),name:P.string(),description:P.string().optional(),labels:P.string().array().optional()})),HR=P.array(Wh.extend({id:P.string(),name:P.string(),description:P.string().optional(),content:Ac})),HH=P.object({tests:zR,modules:HR,labels:P.string().array()}),jH=Oa.merge(tn),Vh=P.object({schemaVersion:P.string(),stepLists:Ao}),qh=tn.partial().merge(xt.pick({id:!0})),Kh=P.object({name:P.string(),description:P.string().optional(),baseUrl:P.string().url().optional(),environment:P.string().optional(),browserType:P.nativeEnum($n).optional(),viewport:Sa.optional(),pathSegments:P.string().array().optional()}),$H=Oa.merge(P.object({relativeFilePath:P.string().describe("relative to project root")})),Yh=P.object({name:P.string()}),GH=P.object({relativeFilePath:P.string()}),Jh=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")}),Xh=P.object({description:P.string(),enabled:P.boolean()}).partial();var WH=P.array(Xm),Zh=P.object({defaultEnv:P.string().optional().describe("name of the default env, or undefined to unset")}),Qh=P.object({configFilePath:P.string().describe("full path on disk")}),VH=P.string().array(),qH=P.object({message:P.string(),newRelativeTestPath:P.string().optional()}),dd=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()}),eg=P.object({pathSegments:P.array(P.string())}),KH=P.object({absolutePath:P.string(),pathSegments:P.array(P.string()),contents:P.array(dd)}),tg=P.object({pathSegments:P.array(P.string())}),ng=P.object({pathSegments:P.array(P.string()),newPathSegments:P.array(P.string())}),rg=P.object({pathSegments:P.array(P.string()),recursive:P.boolean().optional()}),YH=P.object({success:P.boolean(),message:P.string(),pathSegments:P.array(P.string()).optional()});var Na=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],og=Na.map(n=>`**/${n}/**`);import Pn from"chalk";var jR=["app","version","env","namespace","host"];function ze(n){let e=n.bindings()??{},t={};for(let r of Object.keys(e)){let o=e[r];!jR.includes(r)&&typeof o=="string"&&(t[r]=o)}return t}var pd=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(` ${
|
|
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<
|
|
17
|
-
`,2),e+=`${
|
|
18
|
-
`,e+=
|
|
14
|
+
`)),console.log(" ",t(a))}}setMinLevel(e){this.minLogLevel=e}log(...e){this.logWithLevel(1,Pn.reset,...e)}info(...e){this.logWithLevel(1,Pn.white,...e)}debug(...e){this.logWithLevel(0,Pn.dim,...e)}warn(...e){this.logWithLevel(2,Pn.yellow,...e)}error(...e){this.logWithLevel(3,Pn.red,...e)}success(...e){this.logWithLevel(4,Pn.green,...e)}dimmed(...e){this.logWithLevel(1,Pn.dim,...e)}underline(...e){this.logWithLevel(2,Pn.underline,...e)}bold(...e){this.logWithLevel(2,Pn.bold,...e)}grey(...e){this.logWithLevel(0,Pn.grey,...e)}child(e){return new n(this.minLogLevel,{...this.logBindings,...e})}flush(){}bindings(){return this.logBindings}},ud=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}flush(){}bindings(){return{}}},ig=new ud,y=new pd(1,{}),Br={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>Br,flush:()=>{},bindings:()=>({})},Ma={},zr=({logger:n,logKey:e,maxCount:t,intervalMs:r},o,i,...s)=>{let a=Ma[e];a?clearTimeout(a.timer):(a={count:0,totalCount:0},Ma[e]=a),a.totalCount++,a.count<t&&(a.count++,n.debug(o,i,...s)),a.timer=setTimeout(()=>{let l=Ma[e];l?.totalCount!==l?.count&&n.debug({logKey:e,totalCount:l?.totalCount,count:l?.count},`Debug logs were rate-limited for ${e}`),delete Ma[e]},r)};import{z as et}from"zod";var sg=et.object({id:et.string(),createdAt:et.coerce.date(),createdBy:et.string(),organizationId:et.string(),name:et.string(),description:et.string().nullish(),enabled:et.boolean(),schemaVersion:et.string().describe("Schema version for steps"),parameters:et.string().array().nullish().describe("Parameter list"),defaultParameters:et.record(et.string(),et.string()).nullish(),defaultCacheKey:et.string().nullish(),defaultCacheTtl:et.number().nullish(),defaultCacheAllInvocations:et.boolean().nullish(),autoAuth:et.boolean().nullish(),advanced:Tc.nullish()}),lj=sg.extend({steps:et.lazy(()=>ve.array())}),ag=5*60*1e3,md=Lt.merge(sg.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as pj}from"date-fns-tz";import{z as He}from"zod";var hd=He.object({failureRecovery:He.boolean().optional(),aiAction:He.boolean().optional(),stepLintSuggestions:He.boolean().optional(),agentConfig:He.record(He.string(),He.string()).optional()}),lg=He.object({fakerConstantSeed:He.boolean().optional()}),gj=He.object({ai:hd.optional(),githubAppInstallationId:He.number().nullish(),githubReleaseAppInstallationId:He.number().nullish(),gitlabAppAccessToken:He.string().nullish().optional(),gitlabAppBaseUrl:He.string().nullish().optional(),qaseAccessToken:He.string().nullish().optional(),browser:$c.optional()}),fj=He.object({globalOverrides:He.record(He.string()).optional(),agentConfig:He.record(He.string(),He.string()).optional()});import*as T from"zod";var cg="x-momentic-cli-version",dg="x-momentic-main-branch-name",pg="x-momentic-branch-name",ug="x-momentic-commit-timestamp",mg="x-momentic-last-commit-on-main",hg="x-momentic-last-commit-on-main-timestamp",Lj=T.object({error:T.boolean(),reason:T.string(),message:T.string()}),Oj=Qt.merge(Xc),gg=Js,Nj=Qt.merge(Xc);var Mj=Qt.merge(fh).extend({useConsensus:T.boolean().optional(),attemptNumber:T.number().optional()}),gd=qu,kj=Qt.merge(Sh),fg=lm,_j=Qt.merge(mh),Sg=am,Dj=Qt.merge(hh),yg=sm,Fj=Qt.merge(gh);var Uj=T.object({testPaths:T.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:T.string().optional(),all:T.boolean().optional(),urlOverride:T.string().optional(),customHeaders:T.record(T.string(),T.string()).optional(),testInputMatrix:T.record(T.string(),T.string()).array().optional()}),bg=T.object({queuedTests:T.unknown().array(),runIds:T.string().uuid().array(),runGroupId:T.string().optional()});var Bj=T.string().array(),zj=T.union([T.object({paths:T.string().array().describe("run specific test paths (e.g. todo-test)"),all:T.boolean().describe("run all tests").optional()}),T.object({path:T.string().describe("deprecated; present for backcompat")})]),wg=T.object({tests:T.record(T.string().describe("Test name"),T.string().describe("Test YAML")),modules:T.record(T.string().describe("Module name"),T.string().describe("Module YAML"))}),$R=T.object({test:T.string().describe("test YAML"),modules:T.record(T.string().describe("moduleId"),T.string().describe("module YAML"))}),Hj=$R.array(),jj=T.object({testId:T.string(),schemaVersion:T.string()}).merge(Lr),$j=T.object({entries:T.array(Lc),testId:T.string()}),Gj=T.object({testId:T.string(),uniqueKeys:T.string().array()}),Wj=T.object({steps:T.array(T.record(T.unknown())),testId:T.string(),schemaVersion:T.string()}),vg=im,xg=T.object({trigger:T.nativeEnum(Xt),status:T.nativeEnum(oe),startedAt:T.coerce.date().optional(),gitCommitSha:T.string().optional(),gitCommitShaShort:T.string().optional(),gitCommitTimestamp:T.coerce.date().optional(),gitBranchName:T.string().optional(),gitOriginUrl:T.string().optional(),gitCommitMessage:T.string().optional(),gitCommitAuthorName:T.string().optional(),githubRepository:T.string().optional(),gitlabProjectPath:T.string().optional(),pipelineId:T.string().optional(),cliVersion:T.string().optional()}),Vj=T.object({id:T.string()}),Tg=T.object({status:T.nativeEnum(oe),updatedAt:T.coerce.date().optional(),finishedAt:T.coerce.date().optional()}),Eg=T.object({stepsSnapshot:T.array(T.record(T.unknown())).optional(),runGroupId:T.string().optional(),testId:T.string(),testName:T.string(),resolvedBaseUrl:T.string().optional(),environmentName:T.string().optional(),labels:T.array(T.string()).optional(),cliVersion:T.string().optional(),trigger:T.nativeEnum(Xt),schemaVersion:T.string().optional(),section:T.nativeEnum(va).optional()}),qj=T.object({id:T.string()}),GR=Jc.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),Cg=GR.array(),Rg=Jc.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(),Kj=T.object({id:T.string()}),Ag=T.object({status:T.nativeEnum(oe),finishedAt:T.coerce.date().optional(),schemaVersion:T.string().optional().default("1.0.19"),results:T.record(T.string(),T.unknown()).array().optional(),beforeResults:T.record(T.string(),T.unknown()).array().optional(),afterResults:T.record(T.string(),T.unknown()).array().optional()}),Yj=T.object({screenshot:T.string()}),Ig=T.object({key:T.string()}),Pg=T.object({orgId:T.string(),userId:T.string()}),Lg=T.array(Jm),Jj=T.record(T.string(),T.union([T.string(),T.boolean()])),Xj=T.object({paths:T.string().array(),env:T.string().optional(),urlOverride:T.string().optional(),customHeaders:T.record(T.string(),T.string()).optional()}),Og=T.object({suiteRunIds:T.string().array(),runGroupIds:T.string().array()}),Zj=T.object({suiteRunIds:T.string().array()}),Qj=ph.array(),e$=T.object({runGroupIds:T.string().array()}),ss=T.object({uploadUrl:T.string()}),t$=Qt.merge(yh),n$=Qt.merge(wh),r$=Qt.merge(bh),WR=T.object({testId:T.string().optional().default(""),testName:T.string().optional().default(""),suiteId:T.string().optional().default(""),suiteName:T.string().optional().default(""),creditsUsed:T.number().optional(),usedBy:T.string().optional()}),VR=T.object({transactionId:T.string(),timestamp:T.string(),event:T.nativeEnum(ts),properties:WR}),o$=VR.array(),Ng=eh.omit({steps:!0}).extend({steps:T.array(T.record(T.string(),T.unknown())).describe("unparsed ResolvedStep[]")}),i$=T.object({limit:T.number().max(10).optional(),afterTime:T.number().optional()}),Mg=sh.array(),s$=T.object({applied:T.boolean().optional(),appliedAt:T.coerce.date().optional()}),a$=Qt.extend({chunks:Zc.array(),description:T.string().describe("Input to pass to AI"),type:T.union([T.literal("locator"),T.literal("assertion"),T.literal("ai-action")]),softTokenLimit:T.number(),hardTokenLimit:T.number()}),kg=ss.extend({id:T.string()}),l$=T.object({runGroupId:T.string().uuid().optional()}),_g=T.object({runGroupId:T.string().uuid()});import{z as Le}from"zod";var Dg=Le.object({orgId:Le.string(),cacheKeys:Le.string().array()}),p$=Le.object({keyParams:Dg,clientMetadata:Le.string(),lockAcquisitionTimeoutMs:Le.number().optional()}),Fg=Le.object({acquired:Le.boolean(),acquiredByMetadata:Le.string(),keyPrefix:Le.string()}),u$=Le.object({keyPrefix:Le.string(),result:Le.string(),ttlMs:Le.number()}),m$=Le.union([Le.object({keyPrefix:Le.string()}),Dg]),qR=Le.object({remainingTtlMs:Le.number(),value:Le.string().nullish()}),h$=Le.object({results:Le.record(Le.string(),qR),activeLocks:Le.string().array()}),Ug=0,Bg=5*60*1e3;import{z as un}from"zod";var zg="test",Hg="module",_t=(t=>(t.TEST=`${zg}.yaml`,t.MODULE=`${Hg}.yaml`,t))(_t||{}),Ie=(t=>(t.TEST=`momentic/${zg}`,t.MODULE=`momentic/${Hg}`,t))(Ie||{}),v$=xt.merge(Lr),fd=Lt.extend({steps:un.array(un.record(un.string(),un.unknown())),schemaVersion:un.string()}),x$=fd.extend({fileType:un.literal(Ie.MODULE)}),T$=un.object({test:un.string().describe("YAML for the test, including metadata and steps"),modules:un.record(un.string(),un.string()).describe("Map of module name to YAML for the module")});import{z as at}from"zod";var KR=at.object({version:at.string(),json:at.record(at.unknown()),hash:at.string()}),jg=at.record(at.unknown()),A$=at.object({newSvgs:at.array(KR),metadata:jg.optional()}),YR=at.object({version:at.string(),json:at.record(at.unknown()).nullish(),hash:at.string(),description:at.string().nullish(),metadata:jg.nullish()}),$g=at.record(at.string().describe("icon hash"),YR);import{validator as N$}from"@exodus/schemasafe";var Gg=n=>{n.extraHeaders&&(n.extraHeaders=Object.fromEntries(Object.entries(n.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};import{z as G$}from"zod";import{z as Xe}from"zod";var q$=Xe.object({repositoriesIndexed:Xe.boolean(),indexingInProgress:Xe.boolean(),indexesOutdated:Xe.boolean()}),Wg=(s=>(s.Queued="queued",s.InProgress="in_progress",s.Completed="completed",s.Waiting="waiting",s.Requested="requested",s.Pending="pending",s))(Wg||{}),Vg=(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))(Vg||{}),K$=Xe.object({name:Xe.string(),status:Xe.nativeEnum(Wg),conclusion:Xe.nativeEnum(Vg).nullable()}),Sd=Xe.object({sha:Xe.string(),message:Xe.string(),author:Xe.object({name:Xe.string().optional(),email:Xe.string().optional(),date:Xe.coerce.date().optional()}),committer:Xe.object({name:Xe.string().optional(),email:Xe.string().optional(),date:Xe.coerce.date().optional()})});import{z as ke}from"zod";var yd=ke.object({assertion:ke.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),JR=ke.object({instruction:ke.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:yd.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.")}),qg=JR.extend({subSteps:ke.lazy(()=>qg.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),Kg=ke.object({name:ke.string().describe("Short name describing the test plan"),description:ke.string().nullish().transform(n=>n??void 0).describe("Longer form description of the high level goal of the test plan")}),Yg=Kg.extend({id:ke.string(),createdAt:ke.coerce.date(),updatedAt:ke.coerce.date(),updatedBy:ke.string(),createdBy:ke.string(),test:ke.object({id:ke.string(),name:ke.string()}).nullish().transform(n=>n??void 0)}),Z$=Yg.extend({testGenRuns:ke.tuple([]).or(ke.tuple([ke.object({id:ke.string(),startedAt:ke.coerce.date(),status:ke.nativeEnum(oe)})]))}),Jg=ke.object({preConditions:yd.array().nullish().transform(n=>n??[]),postConditions:yd.array().nullish().transform(n=>n??[]),steps:qg.array().nullish().transform(n=>n??[])}),Q$=Yg.extend({plan:Jg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),XR=Kg.extend({plan:Jg.nullish().transform(n=>n??{preConditions:[],postConditions:[],steps:[]})}),eG=XR.array().nullish().transform(n=>n??[]);var iG=90*24*60*60*1e3,sG=14*24*60*60*1e3,aG=7*24*60*60*1e3;import{z as Oe}from"zod";var ZR=Oe.object({step:Pe,status:Oe.nativeEnum(Re),startedAt:Oe.coerce.date(),finishedAt:Oe.coerce.date().optional(),healMetadata:Oe.object({healType:Oe.nativeEnum(Vi).or(Oe.literal("AI")),healedAt:Oe.coerce.date()}).optional(),beforeSnapshotId:Oe.string().uuid().optional(),afterSnapshotId:Oe.string().uuid().optional(),message:Oe.string().optional()}),hG=ZR.extend({finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)}),QR=Oe.object({startedAt:Oe.coerce.date()}).merge(Ag).merge(ha),gG=QR.extend({finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)}),eA=Rg.merge(Eg).extend({status:Oe.nativeEnum(oe),startedAt:Oe.coerce.date(),attempts:Oe.number()}),fG=eA.extend({finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)}),tA=xg.merge(Tg).extend({id:Oe.string().uuid().optional(),startedAt:Oe.coerce.date(),cliVersion:Oe.string()}),as=tA.extend({updatedAt:Oe.coerce.date().optional().transform(n=>n??new Date),finishedAt:Oe.coerce.date().optional().transform(n=>n??new Date)});import nA from"semver";import{z as rA}from"zod";var wG=rA.string().refine(n=>nA.valid(n),{message:"must be a valid semver string"});var ka=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};function bd(n){let e={parentChain:[]};return _a(n,e),e}function _a(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||_a({...n,steps:l.steps},e)&&i)return!0;if(_a({...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),_a({...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 Xg(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!!oA([n],t,i).result}function oA(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 bd({steps:n,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:r,parentChain:o}}function Zg(n,e){e(n);for(let t in n){let r=n[t];r&&(Array.isArray(r)?Da(r,e):typeof r=="object"&&Zg(r,e))}}function Da(n,e){for(let t of n)t&&(Array.isArray(t)?Da(t,e):typeof t=="object"&&Zg(t,e))}import{cloneDeep as Qg}from"lodash-es";import{v4 as wd}from"uuid";async function Dt(n){let e=new Map,t=new Set,r=Qg(n.stepLists.steps),o=await Hr({...n,steps:r,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t}),i={stepsToSave:{steps:o.stepsToSave,beforeSteps:void 0,afterSteps:void 0},cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates};for(let s of["beforeSteps","afterSteps"]){let a=Qg(n.stepLists[s]);if(!a)continue;let l=await Hr({...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 Hr({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?wd():d.id,d.type){case"PRESET_ACTION":{let u=d.command;u.id=l?wd():u.id,tf(u),"cache"in u&&u.cache&&(r&&(c.cachesToSave=c.cachesToSave.concat(ef({id:u.id,orgId:r.orgId,testId:r.testId,value:Ar.parse(u),moduleIdParents:o,moduleStepParents:i,skipIntermediateEntries:e.skipCacheIntermediateEntries}))),delete u.cache),u.thoughts&&delete u.thoughts,c.stepsToSave.push({...d,command:u});break}case"RESOLVED_MODULE":{let u=l?wd():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 Hr({...e,steps:d.steps,cacheCreationParams:r?{...r}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,u],moduleIdParents:[...o,m],skipCacheIntermediateEntries:l});c.moduleUpdates=c.moduleUpdates.concat(f),c.cachesToSave=c.cachesToSave.concat(h),t.has(m)||(t.add(m),c.moduleUpdates.push({...Lt.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 Hr({...e,steps:d.steps});try{d.steps=Pt.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 zo({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=Ar.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=sA(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}=zo({...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}=zo({...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(!bc.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}=zo({...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}=zo({...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 nf(n,e){return e?`${e}:${n}`:n}function sA(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 ef(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:nf(n.id,s),moduleId:i,organizationId:n.orgId,value:n.value})}return r.push({key:nf(n.id,e.join(":")),organizationId:n.orgId,value:n.value,testId:n.testId}),r}function tf(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 rf(n){let e=new Set;return Da(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 of(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 Fa({logger:n,cacheStorage:e,orgId:t,testId:r,originalSteps:o,updatedSteps:i}){let s=iA(o,i);if(Object.keys(s).length>0){n.info({changes:s},"Updating steps caches post-run success");try{let{cachesToSave:a}=await Dt({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 je(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"},vd={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable"},xd={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable"};function aA(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?xd[n.condition]:vd[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 TV={CONTENT:"The page"};function lA(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 Td(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 cA(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 jr(n){switch(n.type){case"SUCCESS":return n.condition?.assertion?`Check success condition: ${n.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${n.goal}`;case"NAVIGATE":return`Go to URL: ${je(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: ${ut(n.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${n.deltaY?`${n.deltaY}px`:"1 page height"}${n.target?` in the container of: ${ut(n.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${ut(n.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${n.deltaX?`${n.deltaX}px`:"1 page width"}${n.target?` in the container of: ${ut(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: ${ut(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 ${ut(n.target)}`;case"BLUR":return`Focus ${ut(n.target)}`;case"DRAG":return`Drag ${ut(n.fromTarget)} onto ${ut(n.toTarget)}`;case"MOUSE_DRAG":return n.target?.type==="description"&&n.target.elementDescriptor?`Click and drag ${ut(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: ${ut(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: ${ut(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=lA(n.choice);return n.target.type==="coordinates"?t=` from element at coordinates: ${ut(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: ${je(n.code,30)}`;case"AI_ASSERTION":return`Assertion: '${n.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${n.target?`for element: ${ut(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 ${ut(n.target)} ${aA(n.assertion)}`;case"PAGE_CHECK":return`Check the page ${cA(n.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${Td(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 sf(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 dA}from"lodash-es";import{cloneDeep as AV,unset as IV}from"lodash-es";function mn(n){switch(n.type){case"AI_ACTION":return`AI action: ${je(n.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${je(n.text,100)}`;case"PRESET_ACTION":return jr(n.command);case"MODULE":return`Module: ${n.id}`;case"RESOLVED_MODULE":return`Module: ${n.name}`;case"CONDITIONAL":return"Conditional step";case"IFRAME":return"Frame step";case"SECTION":return`Section${n.description?`with goal: ${je(n.description,100)}`:""}`;default:return(t=>{throw new Error("You missed a case in the switch above")})(n)}}var af=1e3,lf=3e6,pA="[FAILED]";async function cf(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 Ua(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?$r(p):mn(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=`${pA} ${m.description}`,o&&(c=d);try{let h=ch.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 cf(n,e,p.afterScreenshot,p.afterSnapshot),i&&(m.beforeScreenshot=await cf(n,e,p.beforeScreenshot,p.beforeSnapshot))),l.push(m)}return{results:l,failureIndex:c}}function $r(n){let e=mn(n);switch(n.type){case"AI_ACTION":case"AI_ACTION_DYNAMIC":e+=`
|
|
16
|
+
`;for(let t=0;t<n.results.length;t++)e+=Ze(`Sub-step ${t} in AI action:
|
|
17
|
+
`,2),e+=`${Ze($r(n.results[t]),2)}
|
|
18
|
+
`,e+=Ze(`${"=".repeat(10)}
|
|
19
19
|
`,2);return e;case"PRESET_ACTION":return e;case"MODULE":{e+=`
|
|
20
|
-
`;for(let t=0;t<
|
|
21
|
-
`,2),e+=`${
|
|
22
|
-
`,e+=
|
|
20
|
+
`;for(let t=0;t<n.results.length;t++)e+=Ze(`Sub-step ${t} in module:
|
|
21
|
+
`,2),e+=`${Ze($r(n.results[t]),2)}
|
|
22
|
+
`,e+=Ze(`${"=".repeat(10)}
|
|
23
23
|
`,2);return e}case"CONDITIONAL":{e+=`
|
|
24
|
-
`,
|
|
25
|
-
`,2),e+=`${
|
|
26
|
-
`,e+=
|
|
27
|
-
`,2)),e+=
|
|
28
|
-
`,2);for(let t=0;t<
|
|
29
|
-
`,2),e+=`${
|
|
30
|
-
`,e+=
|
|
24
|
+
`,n.assertion&&(e+=Ze(`Conditional check:
|
|
25
|
+
`,2),e+=`${Ze($r(n.assertion),2)}
|
|
26
|
+
`,e+=Ze(`${"=".repeat(10)}
|
|
27
|
+
`,2)),e+=Ze(`${n.assertion?"Branch steps":"Else branch steps"}
|
|
28
|
+
`,2);for(let t=0;t<n.results.length;t++)e+=Ze(`Sub-step ${t} in conditional branch:
|
|
29
|
+
`,2),e+=`${Ze($r(n.results[t]),2)}
|
|
30
|
+
`,e+=Ze(`${"=".repeat(10)}
|
|
31
31
|
`,2);return e}case"IFRAME":{e+=`
|
|
32
|
-
`;for(let t=0;t<
|
|
33
|
-
`,2),e+=`${
|
|
34
|
-
`,e+=
|
|
32
|
+
`;for(let t=0;t<n.results.length;t++)e+=Ze(`Sub-step ${t} in frame step:
|
|
33
|
+
`,2),e+=`${Ze($r(n.results[t]),2)}
|
|
34
|
+
`,e+=Ze(`${"=".repeat(10)}
|
|
35
35
|
`,2);return e}case"SECTION":{e+=`
|
|
36
|
-
`;for(let t=0;t<
|
|
37
|
-
`,2),e+=`${
|
|
38
|
-
`,e+=
|
|
39
|
-
`,2);return e}default:return(
|
|
36
|
+
`;for(let t=0;t<n.results.length;t++)e+=Ze(`Sub-step ${t} in section:
|
|
37
|
+
`,2),e+=`${Ze($r(n.results[t]),2)}
|
|
38
|
+
`,e+=Ze(`${"=".repeat(10)}
|
|
39
|
+
`,2);return e}default:return(r=>{throw new Error("You missed a case in the switch above")})(n)}}function Ze(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),
|
|
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 uf(n,e){try{if(!n)return n;if(typeof n=="string")return je(n,3e4);if(typeof n=="object"){let{jsonString:t}=Po(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 Ed(n,e){for(let t=0;t<n.length;t++){let r=n[t];try{if(r.data){let{jsonString:o}=Po(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":df(r);break;case"CONDITIONAL":r.assertion&&df(r.assertion),Ed(r.results,e);break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"IFRAME":case"MODULE":case"SECTION":{Ed(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 df(n){let e=n.command;"cache"in e&&e.cache&&(e.cache=void 0)}function pf(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 Ba(n,e){let t=dA(n);if(Ed(t,e),t.length>af)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,af);let r=pf(t,e);if(r.length>lf)for(e.error({serializedLength:r.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");r.length>lf;)t.pop(),r=pf(t,e);try{return Nt.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 qV}from"lodash-es";var uA=/^(?!.*\S+\s+\S+).*$/,mA=/^[a-zA-Z0-9\s.,;:'"!?()\- \u00C0-\u00FF]+$/,hA=/style="([^"]*)/g,gA=/data-[\w-]+/g,fA=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 mf(n){let e=fA(n),t=e.type==="AI_ASSERTION"?e.assertion:e.description;return!t||t==="NONE"?{thoughts:"NONE",category:"NO_DESCRIPTION_PROVIDED"}:uA.test(t)&&mA.test(t)?{thoughts:"The target description is too short. Please provide more details.",category:"FEW_WORDS"}:hA.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"}:gA.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 hf(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 zf}from"lodash-es";import vA from"diff-lines";import Ha,{gte as xA}from"semver";var gf={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 ff={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 SA=["target","fromTarget","toTarget"];function Sf(n){for(let e of SA){if(n[e]===void 0)continue;let t=n[e];t.elementDescriptor!==void 0?t.type="description":n[e]={type:"description",elementDescriptor:""}}}var yf={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 Sf(e.command),e;case"AI_ACTION":{let t=e.commands;for(let r of t??[])Sf(r);return e}default:return e}})};import{v4 as yA}from"uuid";var bf={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=yA()),e;default:return e}})};import{v4 as wf}from"uuid";var vf={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??wf(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??wf()}})),delete e.commands),e;default:return e}})};var xf={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 bA}from"uuid";var Tf={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=bA()),e))};import{v4 as Ef}from"uuid";var Cf={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=Ef())}return e.id=Ef(),e})};var Rf={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 wA}from"uuid";var Af={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=wA()),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 If={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var Pf={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async n=>n.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Lf(t),e})};function Lf(n){n&&Object.keys(n).forEach(e=>{if(typeof n[e]=="object"&&n[e]){Lf(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 Of={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 Nf={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 Mf={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 kf={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 _f={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 za=new Set(["CLICK","TYPE","SELECT_OPTION"]),Df={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||za.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||za.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||za.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||za.has(m))&&(p.target={elementDescriptor:u??""})})}),e}),stopOnFailure:!0};var Ff={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 Uf={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 Gr=[_f,Ff,Uf,Df,gf,ff,yf,bf,vf,xf,Tf,Cf,Rf,Af,If,Pf,Of,Nf,Mf,kf];if(De!==Gr[Gr.length-1].toVersion)throw new Error("Please bump LATEST_SCHEMA_VERSION in types package after adding a migration");Gr.forEach((n,e)=>{if(!Ha.valid(n.toVersion)||!Ha.valid(n.fromVersion))throw new Error(`Migration '${n.name}' has invalid version`);if(!Ha.gt(n.toVersion,n.fromVersion))throw new Error(`Migration '${n.name}' has toVersion <= fromVersion`);if(e===0)return;if(Gr[e-1].toVersion!==n.fromVersion)throw new Error(`Migration '${n.name}' at index ${e} is not contiguous with previous migration`)});function TA(n){return n.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}var ls=async({metadata:n,steps:e,logger:t,toVersion:r})=>{let o=e,{schemaVersion:i,id:s}=n,a=Gr.findIndex(d=>Ha.gt(d.toVersion,i));if(a===-1)return{steps:o,newVersion:i};let l=i;for(let d=a;d<Gr.length;d++){if(r&&xA(l,r)){t.debug("Stopping migration early because toVersion was reached");break}let p=Gr[d],u={id:s,migration:p.name,toVersion:p.toVersion};try{o=await Bf(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=vA(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 Bf(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)||TA(i)&&(r[o]=await Bf(i,e))}return t}async function Hf({rawSteps:n,metadata:e,logger:t,callbacks:r}){hf(e,"defaultOnCloud");let o={},{resolvedSteps:i,newSchemaVersion:s}=await ja({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 ja({rawSteps:c,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o});a[l]=d}return{resolvedTest:a,moduleIds:Array.from(Object.keys(o))}}async function Wr(n,e,t){let{newVersion:r,steps:o}=await ls({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 La(`Failed to parse test steps while migrating test: ${i}`,n.id,"entity",{cause:i})}}async function ja({rawSteps:n,migrationMetadata:e,logger:t,callbacks:r,resolvedModuleCache:o={}}){let{newVersion:i,steps:s}=await Wr(e,n,t),a=[];for(let l of s)a.push(await cs({step:l,callbacks:r,logger:t,resolvedModuleCache:o}));return{resolvedSteps:a,newSchemaVersion:i}}async function cs({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{...zf(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 ls({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=>cs({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]=zf(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 cs({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 cs({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 cs({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 EA(n){return typeof n=="object"&&n!==null}function Gn(n){if(Array.isArray(n))return n.map(Gn);if(EA(n)){let e={};return Object.entries(n).forEach(([t,r])=>{r!==void 0&&(e[t]=Gn(r))}),e}return n}import{cloneDeep as CA}from"lodash-es";import{stringify as jf}from"yaml";async function $f({test:n,processedModuleNames:e=new Set,createNewCacheIds:t=!1}){let r={id:n.id,name:n.name,description:n.description,baseUrl:n.baseUrl,schemaVersion:n.schemaVersion,advanced:n.advanced,retries:n.retries,envs:n.envs,disabled:n.disabled,labels:n.labels},o={},i=await RA({originalStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},modules:o,processedModuleNames:e,createNewCacheIds:t}),s={fileType:Ie.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:jf(s),modules:o}}async function RA({originalStepLists:n,modules:e,processedModuleNames:t,createNewCacheIds:r}){let o=CA(n);Object.values(o).forEach(a=>{AA(a??[])});let{stepsToSave:i,moduleUpdates:s}=await Dt({stepLists:o,createNewCacheIds:r});for(let a of s)t.has(a.name)||(e[a.name]=IA(a),t.add(a.name));return i}function AA(n){bd({steps:n,onPresetAction:e=>{e.aiSuggested=void 0,e.index=void 0,e.command.thoughts=void 0},onConditional:e=>{e.aiSuggested=void 0,e.index=void 0},onSimpleStepContainer:e=>{e.aiSuggested=void 0,e.index=void 0}})}function IA(n){let e=Lt.parse(n),t={fileType:Ie.MODULE,...e,schemaVersion:De,steps:n.steps};return jf(t)}async function te(n,e){return new Promise((t,r)=>{if(e?.aborted){r(e.reason);return}e?.addEventListener("abort",i);let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},n);function i(){clearTimeout(o),e?.removeEventListener("abort",i),r(e?.reason)}})}async function ds({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 Vr({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 ds({promiseGenerator:n,signal:s.signal,codePath:t,logger:r})}finally{i=!0,o?.removeEventListener("abort",a),clearTimeout(l)}}function $a(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(jn.parse(r));break}case"IFRAME":case"SECTION":{let r={...t,steps:$a(t.steps)};e.push(ve.parse(r));break}case"CONDITIONAL":{let r={...t,blocks:t.blocks.map(o=>({assertion:o.assertion,steps:$a(o.steps)})),elseSteps:t.elseSteps?$a(t.elseSteps):void 0};e.push(Pr.parse(r));break}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function Ga(n){return $a([n])[0]}import PA from"picomatch";var Gf=(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||PA(o)(n);break}case"REGEX":{r=new RegExp(e.regex).test(n);break}}return t?.negated?!r:r},Wa=(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}},Ho=n=>{try{return new URL(n),!0}catch{return!1}},Wf=n=>!n.toLowerCase().startsWith("http"),jo=(n,e)=>{try{return new URL(n,e),!0}catch{return!1}};function qr(n,e){try{return!!new URL(n).origin.trim()}catch(t){return e?.error({url:n,err:t},"Invalid URL in check"),!1}}import $o from"yaml";import{z as Yf}from"zod";import{execSync as LA}from"child_process";function Kr(n,e){let t=e.hooks?.postSave;if(!t)return;let r;t.includes("$1")?r=t.replaceAll("$1",n):r=`${t} ${n}`,y.debug({postSaveCommand:r},"Executing post-save hook command");try{LA(r,{encoding:"utf-8"})}catch(o){y.warn({err:o,postSaveCommand:r},"Failed to execute post-save hook command, continuing...")}}import{diff as Vf}from"deep-object-diff";import pr from"fs";import{cloneDeep as OA}from"lodash-es";import Cd from"path";import{v4 as NA}from"uuid";import ps from"yaml";function Yr({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=ps.parse(s),l;if(n.name&&n.name!==a.name){let m=`${Me(n.name)}.${_t.MODULE}`;if(l=Cd.join(Cd.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=Gn({fileType:Ie.MODULE,...md.parse(c),steps:ve.array().parse(n.steps)}),p=Vf(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=ps.stringify(d);pr.writeFileSync(i,u,"utf-8"),l&&pr.renameSync(i,l),Kr(l||i,r.config)}function qf({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=Wn(i,o),a={...s,...e},l=Gn({fileType:Ie.MODULE,...md.parse(a),steps:s.steps}),c=Vf(l,s);if(c&&Object.keys(c).length===0){y.debug(`Skipping save for module ${n} since there are no changes`);return}let d=ps.stringify(l);pr.writeFileSync(i,d,"utf-8"),Kr(i,r.config)}async function Kf({name:n,description:e,enabled:t,steps:r,folder:o,project:i}){let s=Me(n),a=Cd.join(o,`${s}.module.yaml`),l=NA(),{stepsToSave:c}=await Dt({stepLists:{steps:r}}),d={fileType:Ie.MODULE,schemaVersion:De,moduleId:l,name:n,description:e,enabled:t,steps:c.steps},p=ps.stringify(d);return pr.writeFileSync(a,p,"utf-8"),Kr(a,i.config),{moduleId:l,name:n,description:e,enabled:t,steps:r}}function Wn(n,e){let t=pr.readFileSync(n,"utf-8"),r=ps.parse(t);try{return fd.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 Rd(n,e,t,r){let o=Wn(n.fullFilePath,t),{resolvedSteps:i}=await ja({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 Wn(l,t)}}}),s={...o,steps:i};return r&&(r[n.id]=OA(s)),s}async function Va(n,e){let t={};return await Promise.all(Object.values(n.modules).map(async r=>{await Rd(r,n,e,t)})),Array.from(Object.values(t))}async function Jf({test:n,name:e,folder:t}){let r=await $f({test:n});if(Object.keys(r.modules).length)throw new Error("A brand new test should not contain any modules in it");let i=`${Me(e)}.${_t.TEST}`,s=Jr.join(t,i);return hn.writeFileSync(s,r.test,"utf-8"),s}function Ad(n,e,t){let r=Jr.join(t.rootDir,n);if(!hn.existsSync(r))throw new Error(`Test not found at path '${n}' in project '${t.rootDir}'`);let o=hn.readFileSync(r,"utf-8"),i=$o.parse(o),s,a;if(e.name&&e.name!==i.name){let u=`${Me(e.name)}.${_t.TEST}`;if(s=Jr.join(Jr.dirname(n),u),a=Jr.join(t.rootDir,s),hn.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:Ie.TEST,...tn.parse(c),beforeSteps:i.beforeSteps??void 0,steps:i.steps,afterSteps:i.afterSteps??void 0},p=$o.stringify(d);return hn.writeFileSync(r,p,"utf-8"),a&&hn.renameSync(r,a),Kr(r,t.config),{newRelativeTestPath:s}}function Vn({relativeTestPath:n,steps:e,schemaVersion:t,project:r,forceSaveOnNoDiffs:o}){let i=Jr.join(r.rootDir,n);if(!hn.existsSync(i))throw new Error(`Test not found at path '${n}' in project '${r.rootDir}'`);let s=hn.readFileSync(i,"utf-8"),a=$o.parse(s),l=tn.parse({...a,schemaVersion:t}),c=Gn({fileType:Ie.TEST,...l,beforeSteps:ve.array().or(Yf.undefined()).parse(e.beforeSteps),steps:ve.array().parse(e.steps),afterSteps:ve.array().or(Yf.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=$o.stringify(c);hn.writeFileSync(i,p,"utf-8"),y.debug(`Saving test ${l.name} to ${i}`),Kr(i,r.config)}function qa(n,e){let t=Jr.join(e.rootDir,n);if(!t)throw new Error(`Could not find test with path ${n} in Momentic project (${e.rootDir})`);let r;try{r=hn.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=$o.parse(r)}catch(i){throw new Error(`Could not parse test file ${t} as YAML: ${i}`)}return xt.parse(o)}function Xr(n,e,t){let r=t.project.rootDir,o;try{o=hn.readFileSync(n,"utf-8")}catch(s){throw e.error({err:s,projectRoot:r},s.message),new Error(s.message)}let i=$o.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${n} is missing steps`);return i}async function us(n,e,t){let r=Xr(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 Hf({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 Wn(l,a)}}});return i}import kA from"@dotenvx/dotenvx";import _A from"fs";import Xf from"path";function Qf(n,e){return(n.config.environments??[]).map(t=>ms(t.name,n,e))}function Zf(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 ms(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={[Ve]:Zf(r.baseUrl)};if(r.envVariables){let s={};for(let[a,l]of Object.entries(r.envVariables))if(typeof l=="string"){let c=Zf(l);c&&(s[a]=c)}else{let c=l.fromFile,d;try{d=_A.readFileSync(Xf.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:Xf.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 uP,readFileSync as mP,readdirSync as hP,writeFileSync as gP}from"fs";var wS=jx(uS(),1);var gs=n=>{if(typeof n!="string")throw new TypeError("invalid pattern");if(n.length>65536)throw new TypeError("pattern is too long")};var $A={"[: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]},fs=n=>n.replace(/[[\]\\-]/g,"\\$&"),GA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),mS=n=>n.join(""),hS=(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,x,v]]of Object.entries($A))if(n.startsWith(f,i)){if(p)return["$.",!1,n.length-t,!0];i+=f.length,v?o.push(S):r.push(S),a=a||x;continue e}}if(l=!1,p){g>p?r.push(fs(p)+"-"+fs(g)):g===p&&r.push(fs(g)),p="",i++;continue}if(n.startsWith("-]",i+1)){r.push(fs(g+"-")),i+=2;continue}if(n.startsWith("-",i+1)){p=g,i+=2;continue}r.push(fs(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[GA(g),!1,d-t,!1]}let u="["+(c?"^":"")+mS(r)+"]",m="["+(c?"":"^")+mS(o)+"]";return[r.length&&o.length?"("+u+"|"+m+")":r.length?u:m,a,d-t,!0]};var gn=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/\[([^\/\\])\]/g,"$1"):n.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");var WA=new Set(["!","?","+","*","@"]),gS=n=>WA.has(n),VA="(?!(?:^|/)\\.\\.?(?:$|/))",Ka="(?!\\.)",qA=new Set(["[","."]),KA=new Set(["..","."]),YA=new Set("().*{}+?[]^$\\!"),JA=n=>n.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),Ld="[^/]",fS=Ld+"*?",SS=Ld+"+?",Go=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&&gS(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(gS(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&&KA.has(this.#r[0]))){let h=qA,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?VA:f?Ka:""}let p="";return this.isEnd()&&this.#e.#p&&this.#s?.type==="!"&&(p="(?:$|\\/)"),[d+c+p,gn(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,gn(this.toString()),!1,!1]}let s=!r||e||t||!Ka?"":this.#m(!0);s===i&&(s=""),s&&(i=`(?:${i})(?:${s})*?`);let a="";if(this.type==="!"&&this.#o)a=(this.isStart()&&!t?Ka:"")+SS;else{let l=this.type==="!"?"))"+(this.isStart()&&!t&&!e?Ka:"")+fS+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&s?")":this.type==="*"&&s?")?":`)${this.type}`;a=o+i+l}return[a,gn(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+=(YA.has(l)?"\\":"")+l;continue}if(l==="\\"){a===e.length-1?i+="\\\\":o=!0;continue}if(l==="["){let[c,d,p,u]=hS(e,a);if(p){i+=c,s=s||d,a+=p-1,t=t||u;continue}}if(l==="*"){r&&e==="*"?i+=SS:i+=fS,t=!0;continue}if(l==="?"){i+=Ld,t=!0;continue}i+=JA(l)}return[i,gn(e),!!t,s]}};var Wo=(n,{windowsPathsNoEscape:e=!1}={})=>e?n.replace(/[?*()[\]]/g,"[$&]"):n.replace(/[?*()[\]\\]/g,"\\$&");var Tt=(n,e,t={})=>(gs(e),!t.nocomment&&e.charAt(0)==="#"?!1:new Ht(e,t).match(n)),XA=/^\*+([^+@!?\*\[\(]*)$/,ZA=n=>e=>!e.startsWith(".")&&e.endsWith(n),QA=n=>e=>e.endsWith(n),eI=n=>(n=n.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(n)),tI=n=>(n=n.toLowerCase(),e=>e.toLowerCase().endsWith(n)),nI=/^\*+\.\*+$/,rI=n=>!n.startsWith(".")&&n.includes("."),oI=n=>n!=="."&&n!==".."&&n.includes("."),iI=/^\.\*+$/,sI=n=>n!=="."&&n!==".."&&n.startsWith("."),aI=/^\*+$/,lI=n=>n.length!==0&&!n.startsWith("."),cI=n=>n.length!==0&&n!=="."&&n!=="..",dI=/^\?+([^+@!?\*\[\(]*)?$/,pI=([n,e=""])=>{let t=vS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},uI=([n,e=""])=>{let t=xS([n]);return e?(e=e.toLowerCase(),r=>t(r)&&r.toLowerCase().endsWith(e)):t},mI=([n,e=""])=>{let t=xS([n]);return e?r=>t(r)&&r.endsWith(e):t},hI=([n,e=""])=>{let t=vS([n]);return e?r=>t(r)&&r.endsWith(e):t},vS=([n])=>{let e=n.length;return t=>t.length===e&&!t.startsWith(".")},xS=([n])=>{let e=n.length;return t=>t.length===e&&t!=="."&&t!==".."},TS=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",yS={win32:{sep:"\\"},posix:{sep:"/"}},gI=TS==="win32"?yS.win32.sep:yS.posix.sep;Tt.sep=gI;var lt=Symbol("globstar **");Tt.GLOBSTAR=lt;var fI="[^/]",SI=fI+"*?",yI="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",bI="(?:(?!(?:\\/|^)\\.).)*?",wI=(n,e={})=>t=>Tt(t,n,e);Tt.filter=wI;var nn=(n,e={})=>Object.assign({},n,e),vI=n=>{if(!n||typeof n!="object"||!Object.keys(n).length)return Tt;let e=Tt;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:lt})};Tt.defaults=vI;var ES=(n,e={})=>(gs(n),e.nobrace||!/\{(?:(?!\{).)*\}/.test(n)?[n]:(0,wS.default)(n));Tt.braceExpand=ES;var xI=(n,e={})=>new Ht(n,e).makeRe();Tt.makeRe=xI;var TI=(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};Tt.match=TI;var bS=/[?*]|[+@!]\(.*?\)|\[|\]/,EI=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={}){gs(e),t=t||{},this.options=t,this.pattern=e,this.platform=t.platform||TS,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]==="?"||!bS.test(i[2]))&&!bS.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]),x=!S&&t[0]===""&&t[1]===""&&t[2]==="?"&&typeof t[3]=="string"&&/^[a-z]:$/i.test(t[3]),v=f?3:g?0:void 0,b=x?3:S?0:void 0;if(typeof v=="number"&&typeof b=="number"){let[E,C]=[e[v],t[b]];E.toLowerCase()===C.toLowerCase()&&(t[b]=E,b>v?t=t.slice(b):v>b&&(e=e.slice(v)))}}let{optimizationLevel:i=1}=this.options;i>=2&&(e=this.levelTwoFileOptimize(e)),this.debug("matchOne",this,{file:e,pattern:t}),this.debug("matchOne",e.length,t.length);for(var 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===lt){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 ES(this.pattern,this.options)}parse(e){gs(e);let t=this.options;if(e==="**")return lt;if(e==="")return"";let r,o=null;(r=e.match(aI))?o=t.dot?cI:lI:(r=e.match(XA))?o=(t.nocase?t.dot?tI:eI:t.dot?QA:ZA)(r[1]):(r=e.match(dI))?o=(t.nocase?t.dot?uI:pI:t.dot?mI:hI)(r):(r=e.match(nI))?o=t.dot?oI:rI:(r=e.match(iI))&&(o=sI);let i=Go.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?SI:t.dot?yI:bI,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"?EI(d):d===lt?lt:d._src});return c.forEach((d,p)=>{let u=c[p+1],m=c[p-1];d!==lt||m===lt||(m===void 0?u!==void 0&&u!==lt?c[p+1]="(?:\\/|"+r+"\\/)?"+u:c[p]=r:u===void 0?c[p-1]=m+"(?:\\/|"+r+")?":u!==lt&&(c[p-1]=m+"(?:\\/|\\/"+r+"\\/)"+u,c[p+1]=lt))}),c.filter(d=>d!==lt).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 Tt.defaults(e).Minimatch}};Tt.AST=Go;Tt.Minimatch=Ht;Tt.escape=Wo;Tt.unescape=gn;import{fileURLToPath as nP}from"node:url";var Vo=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,RS=new Set,Od=typeof process=="object"&&process?process:{},AS=(n,e,t,r)=>{typeof Od.emitWarning=="function"?Od.emitWarning(n,e,t,r):console.error(`[${t}] ${e}: ${n}`)},Ya=globalThis.AbortController,CS=globalThis.AbortSignal;if(typeof Ya>"u"){CS=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(r,o){this._onabort.push(o)}},Ya=class{constructor(){e()}signal=new CS;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=Od.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",e=()=>{n&&(n=!1,AS("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",e))}}var CI=n=>!RS.has(n),v3=Symbol("type"),ur=n=>n&&n===Math.floor(n)&&n>0&&isFinite(n),IS=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?qo:null:null,qo=class extends Array{constructor(e){super(e),this.fill(0)}},Nd=class n{heap;length;static#e=!1;static create(e){let t=IS(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]}},Ss=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:x,noDeleteOnStaleGet:v,allowStaleOnFetchRejection:b,allowStaleOnFetchAbort:E,ignoreFetchAbort:C}=e;if(t!==0&&!ur(t))throw new TypeError("max option must be a nonnegative integer");let R=t?IS(t):Array;if(!R)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 R(t),this.#S=new R(t),this.#m=0,this.#u=0,this.#T=Nd.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=!!x,this.allowStaleOnFetchRejection=!!b,this.allowStaleOnFetchAbort=!!E,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=!!v,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 M="LRU_CACHE_UNBOUNDED";CI(M)&&(RS.add(M),AS("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.","UnboundedCacheWarning",M,n))}}getRemainingTTL(e){return this.#a.has(e)?1/0:0}#P(){let e=new qo(this.#e),t=new qo(this.#e);this.#b=e,this.#C=t,this.#N=(i,s,a=Vo.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?Vo.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=Vo.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=()=>{};#N=()=>{};#y=()=>!1;#L(){let e=new qo(this.#e);this.#p=0,this.#E=e,this.#M=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.#k=(t,r,o)=>{if(e[t]=r,this.#t){let i=this.#t-e[t];for(;this.#p>i;)this.#F(!0)}this.#p+=e[t],o&&(o.entrySize=r,o.totalCalculatedSize=this.#p)}}#M=e=>{};#k=(e,t,r)=>{};#_=(e,t,r,o)=>{if(r||o)throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");return 0};*#A({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#u;!(!this.#D(t)||((e||!this.#y(t))&&(yield t),t===this.#m));)t=this.#S[t]}*#I({allowStale:e=this.allowStale}={}){if(this.#c)for(let t=this.#m;!(!this.#D(t)||((e||!this.#y(t))&&(yield t),t===this.#u));)t=this.#f[t]}#D(e){return e!==void 0&&this.#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-(Vo.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=Vo.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=Vo.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.#k(p,d,l),l&&(l.set="add"),c=!1;else{this.#z(p);let u=this.#o[p];if(t!==u){if(this.#x&&this.#d(u)){u.__abortController.abort(new Error("replaced"));let{__staleWhileFetching:m}=u;m!==void 0&&!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.#M(p),this.#k(p,d,l),this.#o[p]=t,l){l.set="replace";let m=u&&this.#d(u)?u.__staleWhileFetching:u;m!==void 0&&(l.oldValue=m)}}else l&&(l.set="update")}if(o!==0&&!this.#b&&this.#P(),this.#b&&(c||this.#N(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.#M(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 Ya,{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,x=r.ignoreFetchAbort&&g!==void 0;if(r.status&&(S&&!f?(r.status.fetchAborted=!0,r.status.fetchError=s.signal.reason,x&&(r.status.fetchAbortIgnored=!0)):r.status.fetchResolved=!0),S&&!x&&!f)return p(s.signal.reason);let v=m;return this.#o[t]===m&&(g===void 0?v.__staleWhileFetching?this.#o[t]=v.__staleWhileFetching:this.#O(e,"fetch"):(r.status&&(r.status.fetchUpdated=!0),this.set(e,g,l.options))),g},d=g=>(r.status&&(r.status.fetchRejected=!0,r.status.fetchError=g),p(g)),p=g=>{let{aborted:f}=s.signal,S=f&&r.allowStaleOnFetchAbort,x=S||r.allowStaleOnFetchRejection,v=x||r.noDeleteOnFetchRejection,b=m;if(this.#o[t]===m&&(!v||b.__staleWhileFetching===void 0?this.#O(e,"fetch"):S||(this.#o[t]=b.__staleWhileFetching)),x)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(x=>g(x===void 0?void 0:x),f),s.signal.addEventListener("abort",()=>{(!r.ignoreFetchAbort||r.allowStaleOnFetchAbort)&&(g(void 0),r.allowStaleOnFetchAbort&&(g=x=>c(x,!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 Ya}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:x}=t;if(!this.#x)return S&&(S.fetch="get"),this.get(e,{allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,status:S});let v={allowStale:r,updateAgeOnGet:o,noDeleteOnStaleGet:i,ttl:s,noDisposeOnSet:a,size:l,sizeCalculation:c,noUpdateTTL:d,noDeleteOnFetchRejection:p,allowStaleOnFetchRejection:u,allowStaleOnFetchAbort:h,ignoreFetchAbort:m,status:S,signal:x},b=this.#a.get(e);if(b===void 0){S&&(S.fetch="miss");let E=this.#U(e,b,v,g);return E.__returned=E}else{let E=this.#o[b];if(this.#d(E)){let $=r&&E.__staleWhileFetching!==void 0;return S&&(S.fetch="inflight",$&&(S.returnedStale=!0)),$?E.__staleWhileFetching:E.__returned=E}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),E;let R=this.#U(e,b,v,g),L=R.__staleWhileFetching!==void 0&&r;return S&&(S.fetch=C?"stale":"refresh",L&&C&&(S.returnedStale=!0)),L?R.__staleWhileFetching:R.__returned=R}}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.#M(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 DI,win32 as jd}from"node:path";import{fileURLToPath as FI}from"node:url";import{lstatSync as UI,readdir as BI,readdirSync as zI,readlinkSync as HI,realpathSync as jI}from"fs";import*as $I from"node:fs";import{lstat as WI,readdir as VI,readlink as qI,realpath as KI}from"node:fs/promises";import{EventEmitter as Bd}from"node:events";import MS from"node:stream";import{StringDecoder as RI}from"node:string_decoder";var PS=typeof process=="object"&&process?process:{stdout:null,stderr:null},AI=n=>!!n&&typeof n=="object"&&(n instanceof hr||n instanceof MS||II(n)||PI(n)),II=n=>!!n&&typeof n=="object"&&n instanceof Bd&&typeof n.pipe=="function"&&n.pipe!==MS.Writable.prototype.pipe,PI=n=>!!n&&typeof n=="object"&&n instanceof Bd&&typeof n.write=="function"&&typeof n.end=="function",qn=Symbol("EOF"),Kn=Symbol("maybeEmitEnd"),mr=Symbol("emittedEnd"),Ja=Symbol("emittingEnd"),ys=Symbol("emittedError"),Xa=Symbol("closed"),LS=Symbol("read"),Za=Symbol("flush"),OS=Symbol("flushChunk"),fn=Symbol("encoding"),Ko=Symbol("decoder"),tt=Symbol("flowing"),bs=Symbol("paused"),Yo=Symbol("resume"),nt=Symbol("buffer"),Et=Symbol("pipes"),rt=Symbol("bufferLength"),Md=Symbol("bufferPush"),Qa=Symbol("bufferShift"),ht=Symbol("objectMode"),$e=Symbol("destroyed"),kd=Symbol("error"),_d=Symbol("emitData"),NS=Symbol("emitEnd"),Dd=Symbol("emitEnd2"),Ln=Symbol("async"),Fd=Symbol("abort"),el=Symbol("aborted"),ws=Symbol("signal"),Zr=Symbol("dataListeners"),jt=Symbol("discarded"),vs=n=>Promise.resolve().then(n),LI=n=>n(),OI=n=>n==="end"||n==="finish"||n==="prefinish",NI=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),tl=class{src;dest;opts;ondrain;constructor(e,t,r){this.src=e,this.dest=t,this.opts=r,this.ondrain=()=>e[Yo](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Ud=class extends tl{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,_I=n=>!n.objectMode&&!!n.encoding&&n.encoding!=="buffer",hr=class extends Bd{[tt]=!1;[bs]=!1;[Et]=[];[nt]=[];[ht];[fn];[Ln];[Ko];[qn]=!1;[mr]=!1;[Ja]=!1;[Xa]=!1;[ys]=null;[rt]=0;[$e]=!1;[ws];[el]=!1;[Zr]=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[ht]=!0,this[fn]=null):_I(t)?(this[fn]=t.encoding,this[ht]=!1):(this[ht]=!1,this[fn]=null),this[Ln]=!!t.async,this[Ko]=this[fn]?new RI(this[fn]):null,t&&t.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[nt]}),t&&t.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[Et]});let{signal:r}=t;r&&(this[ws]=r,r.aborted?this[Fd]():r.addEventListener("abort",()=>this[Fd]()))}get bufferLength(){return this[rt]}get encoding(){return this[fn]}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[ht]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[Ln]}set async(e){this[Ln]=this[Ln]||!!e}[Fd](){this[el]=!0,this.emit("abort",this[ws]?.reason),this.destroy(this[ws]?.reason)}get aborted(){return this[el]}set aborted(e){}write(e,t,r){if(this[el])return!1;if(this[qn])throw new Error("write after end");if(this[$e])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[Ln]?vs:LI;if(!this[ht]&&!Buffer.isBuffer(e)){if(MI(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(NI(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[ht]?(this[tt]&&this[rt]!==0&&this[Za](!0),this[tt]?this.emit("data",e):this[Md](e),this[rt]!==0&&this.emit("readable"),r&&o(r),this[tt]):e.length?(typeof e=="string"&&!(t===this[fn]&&!this[Ko]?.lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[fn]&&(e=this[Ko].write(e)),this[tt]&&this[rt]!==0&&this[Za](!0),this[tt]?this.emit("data",e):this[Md](e),this[rt]!==0&&this.emit("readable"),r&&o(r),this[tt]):(this[rt]!==0&&this.emit("readable"),r&&o(r),this[tt])}read(e){if(this[$e])return null;if(this[jt]=!1,this[rt]===0||e===0||e&&e>this[rt])return this[Kn](),null;this[ht]&&(e=null),this[nt].length>1&&!this[ht]&&(this[nt]=[this[fn]?this[nt].join(""):Buffer.concat(this[nt],this[rt])]);let t=this[LS](e||null,this[nt][0]);return this[Kn](),t}[LS](e,t){if(this[ht])this[Qa]();else{let r=t;e===r.length||e===null?this[Qa]():typeof r=="string"?(this[nt][0]=r.slice(e),t=r.slice(0,e),this[rt]-=e):(this[nt][0]=r.subarray(e),t=r.subarray(0,e),this[rt]-=e)}return this.emit("data",t),!this[nt].length&&!this[qn]&&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[qn]=!0,this.writable=!1,(this[tt]||!this[bs])&&this[Kn](),this}[Yo](){this[$e]||(!this[Zr]&&!this[Et].length&&(this[jt]=!0),this[bs]=!1,this[tt]=!0,this.emit("resume"),this[nt].length?this[Za]():this[qn]?this[Kn]():this.emit("drain"))}resume(){return this[Yo]()}pause(){this[tt]=!1,this[bs]=!0,this[jt]=!1}get destroyed(){return this[$e]}get flowing(){return this[tt]}get paused(){return this[bs]}[Md](e){this[ht]?this[rt]+=1:this[rt]+=e.length,this[nt].push(e)}[Qa](){return this[ht]?this[rt]-=1:this[rt]-=this[nt][0].length,this[nt].shift()}[Za](e=!1){do;while(this[OS](this[Qa]())&&this[nt].length);!e&&!this[nt].length&&!this[qn]&&this.emit("drain")}[OS](e){return this.emit("data",e),this[tt]}pipe(e,t){if(this[$e])return e;this[jt]=!1;let r=this[mr];return t=t||{},e===PS.stdout||e===PS.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,r?t.end&&e.end():(this[Et].push(t.proxyErrors?new Ud(this,e,t):new tl(this,e,t)),this[Ln]?vs(()=>this[Yo]()):this[Yo]()),e}unpipe(e){let t=this[Et].find(r=>r.dest===e);t&&(this[Et].length===1?(this[tt]&&this[Zr]===0&&(this[tt]=!1),this[Et]=[]):this[Et].splice(this[Et].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[Zr]++,!this[Et].length&&!this[tt]&&this[Yo]();else if(e==="readable"&&this[rt]!==0)super.emit("readable");else if(OI(e)&&this[mr])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[ys]){let o=t;this[Ln]?vs(()=>o.call(this,this[ys])):o.call(this,this[ys])}return r}removeListener(e,t){return this.off(e,t)}off(e,t){let r=super.off(e,t);return e==="data"&&(this[Zr]=this.listeners("data").length,this[Zr]===0&&!this[jt]&&!this[Et].length&&(this[tt]=!1)),r}removeAllListeners(e){let t=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[Zr]=0,!this[jt]&&!this[Et].length&&(this[tt]=!1)),t}get emittedEnd(){return this[mr]}[Kn](){!this[Ja]&&!this[mr]&&!this[$e]&&this[nt].length===0&&this[qn]&&(this[Ja]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Xa]&&this.emit("close"),this[Ja]=!1)}emit(e,...t){let r=t[0];if(e!=="error"&&e!=="close"&&e!==$e&&this[$e])return!1;if(e==="data")return!this[ht]&&!r?!1:this[Ln]?(vs(()=>this[_d](r)),!0):this[_d](r);if(e==="end")return this[NS]();if(e==="close"){if(this[Xa]=!0,!this[mr]&&!this[$e])return!1;let i=super.emit("close");return this.removeAllListeners("close"),i}else if(e==="error"){this[ys]=r,super.emit(kd,r);let i=!this[ws]||this.listeners("error").length?super.emit("error",r):!1;return this[Kn](),i}else if(e==="resume"){let i=super.emit("resume");return this[Kn](),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[Kn](),o}[_d](e){for(let r of this[Et])r.dest.write(e)===!1&&this.pause();let t=this[jt]?!1:super.emit("data",e);return this[Kn](),t}[NS](){return this[mr]?!1:(this[mr]=!0,this.readable=!1,this[Ln]?(vs(()=>this[Dd]()),!0):this[Dd]())}[Dd](){if(this[Ko]){let t=this[Ko].end();if(t){for(let r of this[Et])r.dest.write(t);this[jt]||super.emit("data",t)}}for(let t of this[Et])t.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[ht]||(e.dataLength=0);let t=this.promise();return this.on("data",r=>{e.push(r),this[ht]||(e.dataLength+=r.length)}),await t,e}async concat(){if(this[ht])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[fn]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,t)=>{this.on($e,()=>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[qn])return t();let i,s,a=p=>{this.off("data",l),this.off("end",c),this.off($e,d),t(),s(p)},l=p=>{this.off("error",a),this.off("end",c),this.off($e,d),this.pause(),i({value:p,done:!!this[qn]})},c=()=>{this.off("error",a),this.off("data",l),this.off($e,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($e,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(kd,t),this.off($e,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(kd,t),this.once($e,t),{next:r,throw:t,return:t,[Symbol.iterator](){return this}}}destroy(e){if(this[$e])return e?this.emit("error",e):this.emit($e),this;this[$e]=!0,this[jt]=!0,this[nt].length=0,this[rt]=0;let t=this;return typeof t.close=="function"&&!this[Xa]&&t.close(),e?this.emit("error",e):this.emit($e),this}static get isStream(){return AI}};var GI=jI.native,Ts={lstatSync:UI,readdir:BI,readdirSync:zI,readlinkSync:HI,realpathSync:GI,promises:{lstat:WI,readdir:VI,readlink:qI,realpath:KI}},US=n=>!n||n===Ts||n===$I?Ts:{...Ts,...n,promises:{...Ts.promises,...n.promises||{}}},BS=/^\\\\\?\\([a-z]:)\\?$/i,YI=n=>n.replace(/\//g,"\\").replace(BS,"$1\\"),JI=/[\\\/]/,on=0,zS=1,HS=2,On=4,jS=6,$S=8,Qr=10,GS=12,rn=15,xs=~rn,zd=16,kS=32,Es=64,Sn=128,nl=256,ol=512,_S=Es|Sn|ol,XI=1023,Hd=n=>n.isFile()?$S:n.isDirectory()?On:n.isSymbolicLink()?Qr:n.isCharacterDevice()?HS:n.isBlockDevice()?jS:n.isSocket()?GS:n.isFIFO()?zS:on,DS=new Map,Cs=n=>{let e=DS.get(n);if(e)return e;let t=n.normalize("NFKD");return DS.set(n,t),t},FS=new Map,rl=n=>{let e=FS.get(n);if(e)return e;let t=Cs(n.toLowerCase());return FS.set(n,t),t},il=class extends Ss{constructor(){super({max:256})}},$d=class extends Ss{constructor(e=16*1024){super({maxSize:e,sizeCalculation:t=>t.length+1})}},WS=Symbol("PathScurry setAsCwd"),gt=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;#N;#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?rl(e):Cs(e),this.#n=t&XI,this.nocase=i,this.roots=o,this.root=r||this,this.#N=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=US(a.fs)}depth(){return this.#v!==void 0?this.#v:this.parent?this.#v=this.parent.depth()+1:this.#v=0}childrenCache(){return this.#N}resolve(e){if(!e)return this;let t=this.getRootString(e),o=e.substring(t.length).split(this.splitSep);return t?this.getRoot(t).#M(o):this.#M(o)}#M(e){let t=this;for(let r of e)t=t.child(r);return t}children(){let e=this.#N.get(this);if(e)return e;let t=Object.assign([],{provisional:0});return this.#N.set(this,t),this.#n&=~zd,t}child(e,t){if(e===""||e===".")return this;if(e==="..")return this.parent||this;let r=this.children(),o=this.nocase?rl(e):Cs(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|=Sn),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)===$S}isDirectory(){return(this.#n&rn)===On}isCharacterDevice(){return(this.#n&rn)===HS}isBlockDevice(){return(this.#n&rn)===jS}isFIFO(){return(this.#n&rn)===zS}isSocket(){return(this.#n&rn)===GS}isSymbolicLink(){return(this.#n&Qr)===Qr}lstatCached(){return this.#n&kS?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!==Qr||this.#n&nl||this.#n&Sn)}calledReaddir(){return!!(this.#n&zd)}isENOENT(){return!!(this.#n&Sn)}isNamed(e){return this.nocase?this.#b===rl(e):this.#b===Cs(e)}async readlink(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=await this.#e.promises.readlink(this.fullpath()),r=(await this.parent.realpath())?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}readlinkSync(){let e=this.#y;if(e)return e;if(this.canReadlink()&&this.parent)try{let t=this.#e.readlinkSync(this.fullpath()),r=this.parent.realpathSync()?.resolve(t);if(r)return this.#y=r}catch(t){this.#d(t.code);return}}#k(e){this.#n|=zd;for(let t=e.provisional;t<e.length;t++){let r=e[t];r&&r.#_()}}#_(){this.#n&Sn||(this.#n=(this.#n|Sn)&xs,this.#A())}#A(){let e=this.children();e.provisional=0;for(let t of e)t.#_()}#I(){this.#n|=ol,this.#D()}#D(){if(this.#n&Es)return;let e=this.#n;(e&rn)===On&&(e&=xs),this.#n=e|Es,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|=nl,e==="ENOENT"&&(t|=Sn),(e==="EINVAL"||e==="UNKNOWN")&&(t&=xs),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=Hd(e),o=this.newChild(e.name,r,{parent:this}),i=o.#n&rn;return i!==On&&i!==Qr&&i!==on&&(o.#n|=Es),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?rl(e.name):Cs(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&xs|Hd(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&Sn))try{return this.#W(await this.#e.promises.lstat(this.fullpath())),this}catch(e){this.#U(e.code)}}lstatSync(){if(!(this.#n&Sn))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:x,uid:v}=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=x,this.#s=v;let b=Hd(e);this.#n=this.#n&xs|b|kS,b!==on&&b!==On&&b!==Qr&&(this.#n|=Es)}#$=[];#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.#k(r)}this.#V(r.slice(0,r.provisional))})}#j;async readdir(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();if(this.#j)await this.#j;else{let r=()=>{};this.#j=new Promise(o=>r=o);try{for(let o of await this.#e.promises.readdir(t,{withFileTypes:!0}))this.#B(o,e);this.#k(e)}catch(o){this.#F(o.code),e.provisional=0}this.#j=void 0,r()}return e.slice(0,e.provisional)}readdirSync(){if(!this.canReaddir())return[];let e=this.children();if(this.calledReaddir())return e.slice(0,e.provisional);let t=this.fullpath();try{for(let r of this.#e.readdirSync(t,{withFileTypes:!0}))this.#B(r,e);this.#k(e)}catch(r){this.#F(r.code),e.provisional=0}return e.slice(0,e.provisional)}canReaddir(){if(this.#n&_S)return!1;let e=rn&this.#n;return e===on||e===On||e===Qr}shouldWalk(e,t){return(this.#n&On)===On&&!(this.#n&_S)&&!e.has(this)&&(!t||t(this))}async realpath(){if(this.#L)return this.#L;if(!((ol|nl|Sn)&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(!((ol|nl|Sn)&this.#n))try{let e=this.#e.realpathSync(this.fullpath());return this.#L=this.resolve(e)}catch{this.#I()}}[WS](e){if(e===this)return;e.isCWD=!1,this.isCWD=!0;let t=new Set([]),r=[],o=this;for(;o&&o.parent;)t.add(o),o.#P=r.join(this.sep),o.#R=r.join("/"),o=o.parent,r.push("..");for(o=e;o&&o.parent&&!t.has(o);)o.#P=void 0,o.#R=void 0,o=o.parent}},sl=class n extends gt{sep="\\";splitSep=JI;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 jd.parse(e).root}getRoot(e){if(e=YI(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 Jo(e,this).root}sameRoot(e,t=this.root.name){return e=e.toUpperCase().replace(/\//g,"\\").replace(BS,"$1\\"),e===t}},al=class n extends gt{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)}},ll=class{root;rootPath;roots;cwd;#e;#t;#i;nocase;#r;constructor(e=process.cwd(),t,r,{nocase:o,childrenCacheSize:i=16*1024,fs:s=Ts}={}){this.#r=US(s),(e instanceof URL||e.startsWith("file://"))&&(e=FI(e));let a=t.resolve(e);this.roots=Object.create(null),this.rootPath=this.parseRootPath(a),this.#e=new il,this.#t=new il,this.#i=new $d(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 gt||(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 gt||(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 gt||(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 gt||(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 gt||(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 gt||(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 gt||(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(x=>x?.isUnknown()?x.lstat():x).then(x=>x?.shouldWalk(l,s)?c(x,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 gt||(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 gt||(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 gt||(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 gt||(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,x=!1)=>{if(f)return a.emit("error",f);if(o&&!x){let v=[];for(let b of S)b.isSymbolicLink()&&v.push(b.realpath().then(E=>E?.isUnknown()?E.lstat():E));if(v.length){Promise.all(v).then(()=>h(null,S,!0));return}}for(let v of S)v&&(!i||i(v))&&(a.write(r?v:v.fullpath())||(u=!0));d--;for(let v of S){let b=v.realpathCached()||v;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 gt||(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[WS](t)}},Jo=class extends ll{sep="\\";constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,jd,"\\",{...t,nocase:r}),this.nocase=r;for(let o=this.cwd;o;o=o.parent)o.nocase=this.nocase}parseRootPath(e){return jd.parse(e).root.toUpperCase()}newRoot(e){return new sl(this.rootPath,On,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")||e.startsWith("\\")||/^[a-z]:(\/|\\)/i.test(e)}},Xo=class extends ll{sep="/";constructor(e=process.cwd(),t={}){let{nocase:r=!1}=t;super(e,DI,"/",{...t,nocase:r}),this.nocase=r}parseRootPath(e){return"/"}newRoot(e){return new al(this.rootPath,On,void 0,this.roots,this.nocase,this.childrenCache(),{fs:e})}isAbsolute(e){return e.startsWith("/")}},Rs=class extends Xo{constructor(e=process.cwd(),t={}){let{nocase:r=!0}=t;super(e,{...t,nocase:r})}},M3=process.platform==="win32"?sl:al,VS=process.platform==="win32"?Jo:process.platform==="darwin"?Rs:Xo;var ZI=n=>n.length>=1,QI=n=>n.length>=1,Zo=class n{#e;#t;#i;length;#r;#s;#w;#c;#p;#a;#l=!0;constructor(e,t,r,o){if(!ZI(e))throw new TypeError("empty pattern list");if(!QI(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]===lt}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 eP=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",Qo=class{relative;relativeChildren;absolute;absoluteChildren;platform;mmopts;constructor(e,{nobrace:t,nocase:r,noext:o,noglobstar:i,platform:s=eP}){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 Zo(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 Gd=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()]))}},Wd=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)])}},Vd=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())}},As=class n{hasWalkedCache;matches=new Wd;subwalks=new Vd;patterns;follow;dot;opts;constructor(e,t){this.opts=e,this.follow=!!e.follow,this.dot=!!e.dot,this.hasWalkedCache=t?t.copy():new Gd}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===lt){(!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===lt?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 tP=(n,e)=>typeof n=="string"?new Qo([n],e):Array.isArray(n)?new Qo(n,e):n,cl=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=tP(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 As(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 As(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()}},Is=class extends cl{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}},Ps=class extends cl{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 rP=typeof process=="object"&&process&&typeof process.platform=="string"?process.platform:"linux",yn=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=nP(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||rP,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"?Jo:t.platform==="darwin"?Rs:t.platform?Xo:VS;this.scurry=new l(this.cwd,{nocase:t.nocase,fs:t.fs})}this.nocase=this.scurry.nocase;let r=this.platform==="darwin"||this.platform==="win32",o={...t,dot:this.dot,matchBase:this.matchBase,nobrace:this.nobrace,nocase:this.nocase,nocaseMagicOnly:r,nocomment:!0,noext:this.noext,nonegate:!0,optimizationLevel:2,platform:this.platform,windowsPathsNoEscape:this.windowsPathsNoEscape,debug:!!this.opts.debug},i=this.pattern.map(l=>new 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 Zo(l,d,0,this.platform)})}async walk(){return[...await new Is(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 Is(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 Ps(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 Ps(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 qd=(n,e={})=>{Array.isArray(n)||(n=[n]);for(let t of n)if(new Ht(t,e).hasMagic())return!0;return!1};function dl(n,e={}){return new yn(n,e).streamSync()}function YS(n,e={}){return new yn(n,e).stream()}function ei(n,e={}){return new yn(n,e).walkSync()}async function qS(n,e={}){return new yn(n,e).walk()}function pl(n,e={}){return new yn(n,e).iterateSync()}function JS(n,e={}){return new yn(n,e).iterate()}var oP=dl,iP=Object.assign(YS,{sync:dl}),sP=pl,aP=Object.assign(JS,{sync:pl}),lP=Object.assign(ei,{stream:dl,iterate:pl}),KS=Object.assign(qS,{glob:qS,globSync:ei,sync:lP,globStream:YS,stream:iP,globStreamSync:dl,streamSync:oP,globIterate:JS,iterate:aP,globIterateSync:pl,iterateSync:sP,Glob:yn,hasMagic:qd,escape:Wo,unescape:gn});KS.glob=KS;import eo,{dirname as ey}from"path";import{cwd as Zd}from"process";import ty from"yaml";import{z as ue}from"zod";import XS from"fs";import Ls from"path";import cP from"yaml";import{z as Kd}from"zod";var ZS=!1,Yd=[`**/*.${_t.TEST}`,`**/*.${_t.MODULE}`],Jd=Kd.string().refine(n=>/^[a-zA-Z0-9-]+$/.test(n)),Xd=50,dP=Kd.object({fileType:Kd.nativeEnum(Ie)});function be(n,e){let t={project:n,tests:{},modules:{}},r=n.config.include??Yd,o=Array.from(n.config.exclude??[]).concat(og),i=ei(r,{absolute:!1,cwd:n.rootDir,ignore:o,dotRelative:!1,maxDepth:Xd,nodir:!0});for(let s of i)pP(n.rootDir,s,t,e);return ZS=!0,t}function pP(n,e,t,r){let o=Ls.join(n,e),i;try{i=XS.readFileSync(o,"utf-8")}catch(p){r.warn(`Could not read possible Momentic file at ${o}, skipping: ${p}`);return}let s;try{if(s=cP.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=dP.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=XS.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:Ls.sep,fullPathSegments:o.split(Ls.sep),relativePathSegments:e.split(Ls.sep),fileName:Ls.basename(o),lastModified:c.mtime,createdAt:c.birthtime};switch(l){case Ie.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:
|
|
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:Ie.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 Ie.MODULE:try{let p=Lt.parse(s);t.modules[p.moduleId]={type:Ie.MODULE,name:p.name,id:p.moduleId,description:p.description??void 0,...d};let u=d.fileName.replace(".module.yaml","");!ZS&&Me(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 ti="momentic.config.yaml",QS="momentic.workspace.yaml",fP=ue.object({projects:ue.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),SP=ue.union([ue.string(),ue.object({fromFile:ue.string(),json:ue.boolean().optional()})]),yP=ue.object({name:Jd,baseUrl:ue.string(),envFile:ue.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:ue.record(ue.string(),SP).optional(),inheritFromShell:ue.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Nr.optional()}),bP=ue.object({postSave:ue.string().optional()}),wP=ue.object({name:Jd,include:ue.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:ue.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:ue.string().optional(),reporterDir:ue.string().optional(),outputDir:ue.string().optional(),retries:ue.number().optional().describe("number of retries per test"),parallel:ue.number().optional().describe("degree of parallelism"),environments:ue.array(yP).optional(),gitMainBranch:ue.string().optional(),gitProtectedBranches:ue.string().array().optional(),ai:hd.extend({aiPageFiltering:ue.boolean().optional().describe("rag v2 flag")}).optional(),browser:Nr.extend({autoExpandIframes:ue.boolean().optional(),disableSecondaryCacheResolution:ue.boolean().optional(),showZeroOpacityElements:ue.boolean().optional(),globalLocatorRedirect:ue.boolean().optional(),visualActions:ue.boolean().optional()}).optional(),advanced:lg.optional(),hooks:bP.optional()});function ny(n,e){let t;try{t=mP(n,"utf-8")}catch(o){y.warn(`Could not read possible Momentic ${e} file at ${n}: ${o}`);return}let r;try{if(r=ty.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 Qd(n){let e=ny(n,"project configuration");if(e!==void 0)try{return wP.parse(e)}catch(t){y.warn(`Possible Momentic project configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function vP(n){let e=ny(n,"workspace configuration");if(e!==void 0)try{return fP.parse(e)}catch(t){y.warn(`Possible Momentic workspace configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function xP(){let n=[],e=Zd(),t=eo.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=eo.basename(e);if(Na.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 hP(e))if(s.endsWith(ti)){let a=eo.join(e,s),l=Qd(a);l&&n.push({configFilePath:a,config:l,rootDir:ey(a)})}if(n.length)return n;if(e=eo.dirname(e),e===t)break}return n}function $t(n={}){let{configFilePath:e,nameFilter:t}=n,r=ep(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 TP(n){let e=vP(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${ti}`)),r=ei(t,{absolute:!1,cwd:Zd(),dotRelative:!1,maxDepth:Xd,nodir:!0}),o=[];for(let i of r){let s=eo.join(Zd(),i),a=Qd(s);a&&o.push({configFilePath:s,config:a,rootDir:ey(s)})}return o}function ep(n){if(n){n=eo.resolve(n);let t=Qd(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:eo.dirname(n)}]}if(uP(QS)){let t=TP(QS);if(t)return t}return xP()}function ni(n,e){let t=ty.stringify(n);gP(e,t)}import ri from"fs";import tp from"path";import{z as np}from"zod";var ry="golden/visual-diff",oy="reports",iy="test-results";var EP=np.object({width:np.number(),height:np.number()}),oi=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=tp.join(e.rootDir,e.config.goldenFileDir??ry);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=tp.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ri.mkdirSync(tp.dirname(o),{recursive:!0}),ri.writeFileSync(o,r.buffer),ri.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(ri.existsSync(o)){let s=ri.readFileSync(o),a=EP.parse(JSON.parse(ri.readFileSync(i,"utf-8")));return{buffer:s,width:a.width,height:a.height}}else throw new A("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var ii=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 CP from"simple-git";var Te=CP();function ul(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 Ee(n,e){try{return(await e).trim()}catch(t){n.error({err:t},"Failed to run git command");return}}function RP(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps"}async function AP(n){let[e,t,r,o]=await Promise.all([Ee(n,Te.show(["--no-patch","--format=%ci"])),Ee(n,Te.listRemote(["--get-url","origin"])),Ee(n,Te.show(["-s","--pretty=%B"])),Ee(n,Te.show(["-s","--pretty=%an"]))]);return{gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:t,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:`${process.env.GITHUB_RUN_ID}:${process.env.GITHUB_RUN_ATTEMPT}`}}async function IP(n){let[e,t,r]=await Promise.all([Ee(n,Te.listRemote(["--get-url","origin"])),Ee(n,Te.show(["-s","--pretty=%B"])),Ee(n,Te.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 PP(n){let[e,t,r,o]=await Promise.all([Ee(n,Te.show(["--no-patch","--format=%ci"])),Ee(n,Te.listRemote(["--get-url","origin"])),Ee(n,Te.show(["-s","--pretty=%B"])),Ee(n,Te.show(["-s","--pretty=%an"]))]),i=t?.includes("github.com"),s=t?.includes("gitlab.com"),a=t?ul(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 LP(n){let[e,t,r]=await Promise.all([Ee(n,Te.show(["--no-patch","--format=%ci"])),Ee(n,Te.show(["-s","--pretty=%B"])),Ee(n,Te.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),s=o?.includes("gitlab.com"),a=o?ul(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 OP(n){let[e,t,r]=await Promise.all([Ee(n,Te.show(["--no-patch","--format=%ci"])),Ee(n,Te.show(["-s","--pretty=%B"])),Ee(n,Te.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),s=o?.includes("gitlab.com"),a=o?ul(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 NP(n,e){let[t,r,o,i,s,a,l,c]=await Promise.all([Ee(n,Te.revparse(["HEAD"])),Ee(n,Te.revparse(["--short","HEAD"])),Ee(n,Te.revparse(["--abbrev-ref","HEAD"])),Ee(n,Te.listRemote(["--get-url","origin"])),Ee(n,Te.show(["--no-patch","--format=%ci"])),Ee(n,Te.show(["-s","--pretty=%B"])),Ee(n,Te.show(["-s","--pretty=%an"])),e?Ee(n,Te.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0)]),d=c?await Ee(n,Te.show(["--no-patch","--format=%ci",c])):void 0,p=i?.includes("github.com"),u=i?.includes("gitlab.com"),m=i?ul(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=RP();if(!t)return NP(n,e);switch(t){case"GithubActions":return AP(n);case"GitlabCI":return IP(n);case"CircleCI":return PP(n);case"Buildkite":return LP(n);case"AzureDevOps":return OP(n)}}async function _P(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 si(n,e,t){let r=await MP(t),o=await kP(n,r.gitMainBranch),i={...r,...o},s=await _P(n,e,i);return{...r,...o,...s}}import WM from"http";import{z as ip}from"zod";var H="v1",Os="2.5.1";var gr=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var sy=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 F(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(sy(p));a=()=>c(sy(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 ml=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 rp=["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 ay(n){return new Array(n).fill(0).map(()=>rp[Math.floor(Math.random()*rp.length)]).join("-")}var DP=9e4,FP=15e3,bn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function UP(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var op=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Os&&(e[cg]=Os),e}async sendRequest(e,t,r=3,o=DP){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 bn&&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),FP);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 UP(c);throw new bn(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)}}},Ft=class extends op{apiKey;constructor(e){super(e),this.apiKey=e.apiKey}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`}}};var ct=class extends Ft{constructor(e){super(e)}getAppUrl(){return this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${H}/auth/check`,{method:"GET",noLog:!0},10,5e3);return Pg.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${H}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return Cg.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${H}/tests/export`,{method:"POST",body:e},3,3e4);return wg.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${H}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${H}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return vg.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${H}/tests/queue`,{method:"POST",body:e},3,1e4);return bg.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${H}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return Ig.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${H}/environments`,{method:"GET"},3,5e3);return Lg.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${H}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return Fg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${H}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${H}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${H}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${H}/result-cache/entry`,{method:"POST",body:e},3,5e3)}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${H}/suites/queue`,{method:"POST",body:e},3,5e3);return Og.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${H}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return lh.array().parse(r)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${H}/test-fragments/`,{method:"POST",body:e},3,1e4)}catch(r){t.error({err:r},"Failed to upload proposed steps")}}async uploadSnapshotScreenshot(e,t,r){try{await this.sendRequest(`/${H}/snapshots/${t}/screenshot`,{method:"POST",body:r,noLog:!0},3,1e4)}catch(o){e.error({err:o},"Failed to upload screenshot")}}async generateConsoleLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${H}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return ss.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${H}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return ss.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${H}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return ss.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${H}/billing/events`,{method:"POST",body:t,noLog:!0},10,1e4)}catch(r){e.error({err:r},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${H}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return Ng.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${H}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${H}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return Mg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${H}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return kg.parse(e)}async startProcessingResultsUpload(e,t){let r=await this.sendRequest(`/${H}/results/uploads/${e}/process`,{method:"POST",noLog:!0,body:t},3,1e4);return _g.parse(r)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${H}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return $g.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${H}/knowledge-base/icons`,{method:"POST",body:e,noLog:!0},3,5e3)}catch(r){t.error({err:r},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,r,o){let i=new URLSearchParams;i.set("base",r),i.set("head",o);let s=await this.sendRequest(`/${H}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return Sd.parse(s)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${H}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return Sd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${H}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return ip.record(ip.string(),ip.string()).parse(e)}};import{randomUUID as ly}from"crypto";var hl=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??ly(),properties:od({},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??ly(),properties:od({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function ai(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var gl=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 ai(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 ai(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 ai(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 li=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 BP,en as zP}from"@faker-js/faker";var ci="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 BP({locale:zP}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${ci}/tools/ai/generate`,{method:"POST",body:t}).catch(r=>{throw r instanceof bn?new Error(r.rawError):new Error(`Failed to send AI generation: ${r.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${ci}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof bn?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${ci}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof bn?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${ci}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof bn?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${ci}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof bn?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${ci}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof bn?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};import{z as HP}from"zod";var di=class extends Ft{agentConfig;constructor(e,t){super(t),this.agentConfig=e}async rankChunksWithAi(e,t){let r={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return Th.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${H}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Os,...e},signal:t.abortSignal});return xh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${H}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return HP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${H}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return Sg.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${H}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return gd.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return fg.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return gd.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${H}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return gg.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${H}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let r=await this.sendRequest(`/${H}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Nc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${H}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return yg.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${H}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return Oc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${H}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Gc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${H}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return vh.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${H}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return dm.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${H}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return pm.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${H}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Wu.parse(r)}};var pi=class extends Ft{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${H}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return Vu.parse(r)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var fl=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:r,id:o}=await this.client.generateTestResultsUploadUrl(),i=await ai(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 ui({orgId:n,client:e,gitMetadata:t,alwaysSaveCache:r,noCache:o}){return o?new ka:new sp(n,e,t,r)}var sp=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[dg]=r),o&&(this.cacheHeaders[pg]=o),s&&(this.cacheHeaders[ug]=s.toISOString()),a&&(this.cacheHeaders[mg]=a),l&&(this.cacheHeaders[hg]=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{steps:t,beforeSteps:r,afterSteps:o}=e.stepLists,i=await this.client.getStepCacheForTest({testId:e.testId,steps:t,schemaVersion:e.schemaVersion},this.cacheHeaders);if(!this.writeCaches){e.logger.debug("Skipping cache last used at update because branch is protected");return}for(let a of[t,r,o])a&&zo({steps:a,stepCacheEntries:i,logger:e.logger});let{cachesToSave:s}=await Dt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:s,testId:e.testId},this.cacheHeaders)}};import VM from"path";import{Server as SM}from"socket.io";import{cloneDeep as jP}from"lodash-es";var $P={showOverlay:!1},ap=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:jP($P)}),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 ap;function cy(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(),x=g.toEditorDisplayCopy();JSON.stringify(x)===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:x,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=x}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 GP=n=>()=>{let{sessionId:e}=n.metadata;Sr[e]?.abort?.abort()},dy={event:"cancelApiTest",createHandler:GP};import{CookieJar as cL}from"tough-cookie";import{randomUUID as ZP}from"crypto";import{faker as WP}from"@faker-js/faker";import VP from"assert";import qP from"axios";import KP from"moment";import*as YP from"otpauth";import JP from"pg";async function py(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=Ra(r,e);t.push(...o)}),t}var XP=Object.getPrototypeOf(async function(){}).constructor;async function uy(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 XP("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(qP,KP,i.fakerInstance??WP,VP,JP,d,p,YP,py,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 F(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 my({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:s=ar}){let a=ZP(),l=await uy(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 QP,randomUUID as eL}from"crypto";import tL from"fetch-retry";var nL=tL(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}}),hy=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,gy=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function fy({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=ar,retries:i=2,signal:s,logger:a}){if(!hy)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!gy)throw new Error("Missing lambda auth secret.");let p=QP("sha256",gy).update(n).digest("hex");for(;d<=i;){d++,s?.throwIfAborted();let m={id:eL(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await F(nL(hy,{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=Oh.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 Yn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await fy(n);else if(n.localTools)e=await my({...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: ${
|
|
54
|
-
${
|
|
55
|
-
${C.feedback}`,
|
|
56
|
-
${
|
|
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
|
|
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 rL}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 Yn({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 A("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 mi(n){return Sy(n)}async function Sy({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 Sy({obj:c,bannedKeys:e,context:r,prefixPath:d,replacements:i,allowList:l?void 0:t,...s})}return i}function yy(n,e){for(let{path:t,original:r}of e)rL(n,t,r)}import oL from"fetch-retry";var qX=process.env.MAILINATOR_API_KEY,KX=oL(global.fetch,{retryOn:function(n,e,t){return n>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(n){return 500}});import sL from"fetch-cookie";import{cloneDeep as aL}from"lodash-es";var iL=3e4;async function Sl({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??iL/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(Ho(n.url)&&(l=n.url),t&&jo(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new A("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 F((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 A("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 A("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 by(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,s=aL(i);await mi({obj:s,orgId:o,bannedKeys:["code"],...e});let a=await lL(n);return s.envKey&&a.data&&r.setVariable(s.envKey,a.data),a}async function lL(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 Yn({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=sL(fetch,s),d=await Sl({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 wy(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 cL,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await by({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:Ia(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 vy(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,testName:l,environmentVariables:c}=await lp({testId:o,orgId:i,logger:n.logger,storage:t,authorization:n.authorization}),d={type:"api-test",orgId:await n.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new Ot({baseUrl:s||"",currentUrl:s||"",variablesFromEnvironment:c,envName:a,testName:l})};return Sr[r]=d,d}async function lp({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 Ft({...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?.[Ve];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,testName:i.name,environmentVariables:d,localCodeEvalTools:s}}var dL=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:x}=await lp({testId:p,orgId:d,logger:m,storage:a,authorization:o}),v={context:f,logger:m,localTools:S,signal:g.signal,flagStore:await c(d)},C=await wy({inputs:{steps:r,orgId:d,baseUrl:x},fixtures:v,callbacks:{test:{onFinished:()=>{s.emit("apiTestFinished")}},step:{onStarted:R=>{s.emit("apiStepStarted",R)},onFinished:R=>{s.emit("apiStepFinished",R)}}}});t({result:C})},xy={event:"executeApiTest",createHandler:dL};var pL=({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{}}},Ty={event:"cancel",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 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})}}},Ey={event:"fetchA11yTree",createHandler:uL};var mL=({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})}}},Cy={event:"fetchDom",createHandler:mL};var hL=({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]}},Ry={event:"disconnect",createHandler:hL};function sn(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=gL(t);fL(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await SL(i,e,r,o)}catch(s){n.logger.error({result:n.result,err:s},"Error hoisting scalar result metadata")}})())}function gL(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 fL(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 SL(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import Ns from"os";import yL from"v8";var Ay,Nn,bL=Ns.platform(),wL=Ns.cpus().map(n=>({model:n.model,speed:n.speed}));function Iy(n){let e=()=>{try{let t=!1,r=vL(),o=xL();r.freeMemory<1e6&&(t=!0);let i=yL.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:wL,platform:bL}}function vL(){let n=Ns.totalmem(),e=Ns.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function xL(){let n=Ns.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,!Nn)return Nn=t,null;let r={user:t.user-Nn.user,nice:t.nice-Nn.nice,sys:t.sys-Nn.sys,idle:t.idle-Nn.idle,irq:t.irq-Nn.irq,total:t.total-Nn.total};return Ay={measurementTime:e,intervalMs:e-Nn.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},Nn=t,Ay}import{hostname as AL}from"os";async function Ly(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 te(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=>TL(S.locator,n),options:{disableCache:i,useSelector:!!e.useSelector,iframeUrl:e.iframeUrl,disableGlobalLocatorRedirect:!0,source:Or(e)}});if(u={success:f.success,data:f.data,err:f.err,newTarget:h,elementInteractedDisplayString:g},!f.success){u=f,m=Math.min(m*2,1e4);continue}return u}catch(h){if(l?.throwIfAborted(),c)return{success:!0,thoughts:`The element described does not exist on the page: ${h.message}`};if(a.warn({err:h},"Element assertion ended in error, retrying..."),!(h instanceof A)||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 TL(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:je(a,500,!0)},!Py(a,r.value,r.operation,!!r.negated)){let l=r.negated?cr[r.operation]:dr[r.operation];o=!1,i=new A("AssertionFailureError",`The content ${l} '${r.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{s={elementOuterHtml:je(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 A("AssertionFailureError",`The element does not have an attribute named ${r.attr}: ${l}`),o=!1;break}if(!Py(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 A("AssertionFailureError",`The attribute ${r.attr} ${l}: ${a}`):new A("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new A("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},Rn*1e3);break}case"EDITABLE":{o=await n.isEditable({timeout:Rn*1e3});break}case"EXISTS":{o=!0;break}case"ENABLED":{o=await n.isEnabled({timeout:Rn*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?vd[r.condition]:xd[r.condition];i=new A("AssertionFailureError",`The element ${a}`)}break}}return{success:o,data:s,err:i}}function Py(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 EL}from"jimp";async function Ms(n,e){let t=await n.screenshot(e),r=await EL.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as Oy}from"jimp";import cp from"jpeg-js";import CL from"pixelmatch";async function Ny({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 q=>Ms(o,{locator:q.locator,...l}),options:{disableCache:!!r,useSelector:!!t.useSelector,iframeUrl:t.iframeUrl,disableGlobalLocatorRedirect:!0}})).result:c=await Ms(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 $=`${c.width}x${c.height}`,q=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${$}) does not match saved screenshot dimensions (${q}) - 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 Oy.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await Oy.fromBuffer(d.buffer),h={width:d.width,height:d.height},g,f=u.width*u.height,S=h.width*h.height,x=Math.abs(u.height-h.height),v=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},E=t.threshold??.1,R=CL(cp.decode(d.buffer).data,cp.decode(c.buffer).data,b.data,c.width,c.height,{threshold:E,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,M=R>E*100,L=`Visual diff of ${R.toFixed(2)}% detected, which is ${M?"over":"under"} the threshold of ${E*100}%.`;if(g&&(L+=` The ${g} screenshot was cropped since it was taller by ${x} pixels and wider by ${v} pixels.`),M)throw new A("ActionFailureError",L);return{fail:M,thoughts:L,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:cp.encode(b,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var RL=5e3;async function yl({timeout:n=Rn,...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 My(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 te(a,e.signal),a=Math.min(Math.floor(a*1.5),RL);else return i}return i=await My(e),i}async function My({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(ky,{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(ky,{value:n.value,negated:!!n.negated,returnHtml:!0},"checking page content"));if(!i){let l=n.negated?cr.CONTAINS:dr.CONTAINS;s=new A("AssertionFailureError",`The page ${l} '${n.value}'.`),o=a}}catch(a){s=new A("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 ky({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 dp=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(([v,b])=>`${v}:${b}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let x=Date.now();for(;Date.now()-x<ag;){p?.throwIfAborted();let v=await i.getCacheResult(g);if(v){r.debug({cacheResult:v},"Got result from module execution cache"),u=bl(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(v),m=!0;break}else r.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let b=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${AL()};runId:${d}`},p);if(b.acquired){h=b.keyPrefix,r.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else r.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await te(2500+Math.random()*1e4,p)}}try{if(!u)u=await IL(n);else if(e.autoAuth){let f=Aa.safeParse(u.data);if(!f.success)throw new A("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,x=e.advanced?.cacheInvalidation;if(x&&x.type==="PAGE_CHECK"){let v={type:"CONTENT",value:x.substring},b=await yl({timeout:Rn,assertion:v,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),dp(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await PL({step:e,result:u,browser:a.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},IL=async n=>{let{step:e,tracer:t}=n.moduleParams,r=bl(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 bl(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 _y({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 Yn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:s,flagStore:o})}return a}catch(l){throw s?.throwIfAborted(),new A("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function PL({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let s=n.cacheConfig?.cacheExpiryMs;(!s||s===Ug)&&(s=n.defaultCacheTtl??Bg);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:uf(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 A?a=`${o}`:a=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=bl(n,{},"FAILED");return l.message=a,l.startedAt=r,l.finishedAt=i,l}return{...Ga(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 Dy}from"crypto";import{cloneDeep as OL}from"lodash-es";function wl(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var vl=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=rs(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=Dy(),S=Dy();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 x,v,b,E=Ta();try{let C=await o.executePresetCommand(E,t,e.command,i,l?.advanced.disableAICaching??!1);C.beforeScreenshotOverride&&(g=C.beforeScreenshotOverride),b=C.afterScreenshotOverride;let{proposedStep:R}=NL({work:n.work,step:e,newTargets:C.newTargets,logger:p}),M=new Date,L=o.browser.url();v={beforeUrl:m,afterUrl:L,startedAt:h,finishedAt:M,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},x={...e,message:C.thoughts??ML(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:L,finishedAt:M,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[v],details:E.details,proposedStep:R},"assertion"in e.command&&(x.message=C.thoughts||"Assertion passed.")}catch(C){p.error({message:C.message,stack:C.stack},`Failed executing preset step ${jr(e.command)}`);let R=o.browser.url(),M=new Date,L=C instanceof Error?C.message:`${C}`;C instanceof A&&C.getLastScreenshotBuffer()&&(b=C.getLastScreenshotBuffer()),v={beforeUrl:m,afterUrl:R,startedAt:h,finishedAt:M,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:L},x={...e,startedAt:h,finishedAt:M,beforeUrl:m,afterUrl:R,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:L,failureReason:C instanceof A?C.reason:void 0,results:[v],details:E.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 v.beforeSnapshot=f,x.beforeSnapshot=f,v.afterSnapshot=S,x.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))),x};function NL({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;of(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={...OL(e),command:s};return wl(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 Fy({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 Mn({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 Uy({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 te(250),c++;let d=(await t.getOpenPages()).map(u=>u.url),p=t.url();if(d.length!==e.length)for(let u=d.length-1;u>=e.length;u--){let m=d[u];if(qr(m,o)&&m!==n&&m!==p){o.info({beforePages:e,afterPages:d,beforeUrl:n},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(u)});break}}}}var By="MOMENTIC_RUN_ID",zy="FINAL_SCREENSHOT_URL";import{cloneDeep as $L}from"lodash-es";async function Hy(n){let{step:e,tracer:t}=n.conditionalParams,{logger:r,controller:o}=n.fixtures,i=new Date,s=Ga(e),a=e.elseSteps,l=!0,c=[],d,p=Ta();for(let f=0;f<e.blocks.length;f++){r.info(`Evaluating condition ${f} in conditional step`);let S=e.blocks[f];try{let x=await vl({...n,presetParams:{tracer:t,step:S.assertion}});c.push(x),r.info(`Condition ${f} resolved to true, executing the corresponding ${S.steps.length} steps`),l=!1,a=S.steps,d=x}catch(x){r.info({err:x},`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 jy}from"crypto";var $y=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await _L(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=jy();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=jy();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},_L=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 A("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 pp}from"crypto";var Gy=15,DL=7,Wy=async n=>{let{controller:e}=n.fixtures;await e.browser.waitForDOMStability();let t=await e.browser.screenshot({}),r=await FL(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=pp();r.beforeSnapshot=i,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,i,t));let s=pp();return r.afterSnapshot=s,n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(n.fixtures.logger,s,o)),r},FL=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,x=0,v,b;for(;;){if(S>Gy)return u.message=`Exceeded the maximum number of commands allowed per AI step (${Gy})`,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 E=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:p,langfuseSessionId:d,lastError:b}),{evaluation:C,reasoning:R,summary:M}=E;p.info(E,"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: ${R}`,u.status="SUCCESS",L&&c.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:`${M}
|
|
54
|
+
${R}`}),u;case"RIGHT_TRACK":{v=void 0,S===0?c.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:R}):L&&c.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:R});break}case"WRONG_TRACK":{if(v=`${R}
|
|
55
|
+
${C.feedback}`,x++,x>=DL)return u.message=`Our AI agent requires additional information to achieve this goal:
|
|
56
|
+
${R}
|
|
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: ${R}`,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:v},`Generating new sub-command ${S} within AI action`);let q,N;try{({command:q,reasoning:N}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:r?.advanced.disableAICaching??!1,logger:p,actionHint:v,langfuseSessionId:d})),p.info({command:q,reasoning:N},"Got proposed command")}finally{clearTimeout($)}if(q.type==="FAILURE")return clearTimeout($),u.status="FAILED",u.message=`Our AI agent determined that no supported actions can fulfill the goals: ${N}`,u;let _={id:pp(),type:"PRESET_ACTION",command:q},O={substepIndex:S+1,message:N||"Generated new command."};c.onDynamicCommandGenerated?.({...O,step:_,parentStepId:e.id}),p.info({commandId:q.id},`Executing sub-command ${S} within AI step: ${jr(q)}`);let Y=await t.startSubSteps(),ie=(await n.executeStepList({...n,options:{...n.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[_],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 se=await i.browser.screenshot({clearHighlights:!0,retries:1});u.results.push(ie),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${se.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:jr(q),elementInteracted:ie.results[0]?.elementInteracted,thoughts:N});let J={substepIndex:S,output:{...ie,message:ie.message??"Successfully executed preset action."},step:_,parentStepId:e.id};if(c.onDynamicCommandExecuted?.(J),await t.finish({output:ua.parse(ie),step:ie,message:ie.message}),ie.status==="FAILED")if(u.status="FAILED",u.message=ie.message,x<3)x++,b=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${ie.message}`;else return u;else if(ie.status==="CANCELLED")return u.status="CANCELLED",u.message=ie.message,u;S++}};async function qy(n){let{results:e}=n.failureRecoveryParams,t=e[e.length-1],r=BL(t);if(r)return n.fixtures.logger.info({failedResult:t,isNotEligible:r},"Skipping failure recovery because of ineligible failure"),null;try{return await UL(n)}catch(o){return n.fixtures.logger.error({err:o},"Error during failure recovery attempt"),null}}async function Vy({screenshot:n,controller:e,currentPageState:t,newStep:r,patch:o,logger:i}){if(r.aiSuggested=!0,r.type==="PRESET_ACTION"&&"cache"in r.command&&r.command.cache&&"target"in r.command.cache&&"target"in r.command&&r.command.target?.type==="description")try{let 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 UL(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 Ua(i,e.debugDataStorage,s,{numScreenshots:3,addIndices:!0}),h=l.map(v=>mn(v)),g=await o.runFailureRecovery({currentUrl:d,currentScreenshot:p,failedResults:m,currentPageState:u,nextStepsSerialized:h});if(g.scenario==="INELIGIBLE"||!g.patch)return null;let f=[];if(g.patch.op==="add"){let v=g.patch.value;if(!v)throw new Error("No value in add patch in failure recovery");await Vy({screenshot:p,controller:o,currentPageState:u,newStep:v,patch:g.patch,logger:i}),f=[v,a]}else if(g.patch.op==="replace"){let v=g.patch.value;if(!v)throw new Error("No value in replace patch in failure recovery");await Vy({screenshot:p,controller:o,currentPageState:u,newStep:v,patch:g.patch,logger:i}),f=[v]}else if(g.patch.op==="remove"&&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(),x;if(f.length){x=await yr(n.work,()=>n.executeStepList({...n,fixtures:{...n.fixtures},listParams:{steps:f,containerName:"AI-recovered step list",tracer:S}}));for(let v of x.results)v.aiSuggested&&v.type==="PRESET_ACTION"&&(v.message=`AI suggested step: ${v.command.thoughts}`)}else x={status:"SUCCESS",results:[],proposedSteps:[]};return wl(t,{type:"FAILURE_RECOVERY",thoughts:g.reasoning}),t.state.failureRecoveryDisabled=!0,x}function BL(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":Qm.some(t=>e.includes(t))?"User fault and likely irrecoverable":"":"No error message available"}async function Ky(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 xl}from"crypto";import zL from"fast-json-patch";import{cloneDeep as HL}from"lodash-es";async function Yy(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=HL(c.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:x}=await Ua(p,u,e.results,{numScreenshots:4}),v=await d.runSectionAutohealing({results:x,errorMessage:e.terminalResult?.message,goal:c.description});S=zL.applyPatch(S,v.patches).newDocument;let b=Ot.fromSnapshot({snapshot:a,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await jL({logger:p,controller:d,tracer:l,context:b,restartConfig:h,startingUrl:s});let E=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(E.results),E.status==="SUCCESS")return{successfulHealing:{proposedStep:{...c,steps:S},listResult:E,context:b},healingAttempts:t};e=E}return{healingAttempts:t}}async function jL({logger:n,controller:e,tracer:t,restartConfig:r,context:o,startingUrl:i}){switch(r.type){case"NAVIGATE_URL":{let s={id:xl(),type:"PRESET_ACTION",command:{id:xl(),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:xl(),type:"PRESET_ACTION",command:{id:xl(),type:"NAVIGATE",url:i}},a=await t.startStep({logger:n,step:s});await e.executePresetCommand(null,a,s.command,o,!1);break}}}function Jy(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"&&nm(e.command.type))}}async function Xy(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&&Jy(e.autohealingConfig.trigger,p.terminalResult)){let g=await t.startSubSteps(),f=await Yy({...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 kn(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",x,v=0;for(v;v<r.length;v++){let b=r[v],E,C=mn(b);if(b.skipped)continue;if(g.fastForwardingToStep&&m){let xe=JSON.stringify(p);if(b.id===m.fromStepId&&xe===JSON.stringify(m.parentStepIdChain))g.fastForwardingToStep=!1;else if(!Xg(b,p,m.fromStepId,m.parentStepIdChain))continue}let R=new Date,M=d.child({step_id:b.id});M.track({type:"execution:step_start",step_type:b.type==="RESOLVED_MODULE"?"MODULE":b.type,command_type:"command"in b?b.command.type:void 0}),i.info({step:b},`Executing step ${v+1}/${r.length} in ${t}: ${C}`);let L=await o.startStep({logger:i,step:b}),$=$L(b),q=s.toRedactedDisplayCopy(),N=a.browser.url(),_=a.executeAbortController.signal,O=ns(b.type);g.asyncTasks.push(c.reportCreditsUsed(i,b.type,O,{testId:n.inputs.testMetadata?.id,testName:n.inputs.testMetadata?.name,suiteId:n.inputs.suiteMetadata?.id,suiteName:n.inputs.suiteMetadata?.name}));let Y,B;switch(b.type){case"PRESET_ACTION":{Y="Preset action",B=await br(b,async()=>await vl({...n,presetParams:{tracer:L,step:b}}),_),"proposedStep"in B&&B.proposedStep&&(E=B.proposedStep,B.proposedStep=void 0);break}case"AI_ACTION":{Y="AI action",B=await br(b,()=>$y({...n,aiStepParams:{step:b,tracer:L},executeStepList:kn}),_);break}case"AI_ACTION_DYNAMIC":{Y="AI action",B=await br(b,()=>Wy({...n,aiStepParams:{step:b,tracer:L},executeStepList:kn}),_);break}case"RESOLVED_MODULE":{Y=`Module (${b.name})`,B=await br(b,async()=>{let xe=await _y({orgId:u,step:b,context:s,logger:i,flagStore:a.flagStore,codeEvalTools:l,signal:_});return dp({...n,executeStepList:kn,moduleParams:{step:b,resolvedInputs:xe,tracer:L}})},_);break}case"CONDITIONAL":{Y="Conditional step",B=await br(b,()=>Hy({...n,conditionalParams:{step:b,tracer:L},executeStepList:kn}),_);break}case"IFRAME":{Y="Frame step",B=await br(b,()=>Ky({...n,frameParams:{step:b,tracer:L},executeStepList:kn}),_);break}case"SECTION":{Y="Section";let xe=await br(b,()=>Xy({...n,sectionParams:{step:b,tracer:L},executeStepList:kn}),_);"proposedStep"in xe&&xe.proposedStep&&(E=xe.proposedStep,xe.proposedStep=void 0),B=xe;break}default:return(_e=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(b)}B.beforeUrl=B.beforeUrl??N,B.beforeTestContext=q,b.envKey&&s.setVariable(b.envKey,B.data);let ie=a.browser.url();s.setCurrentUrl(ie),B.afterUrl=B.afterUrl??ie,B.afterTestContext=s.toRedactedDisplayCopy(),e.push(B),await GL({startedAt:R,stepTypeName:Y,result:B,callbacks:n.callbacks,analytics:M,globalWorkRef:n.work,tracer:L});let se;if(B.status==="FAILED"&&!g.state.failureRecoveryDisabled&&m?.fromStepId===void 0&&h?.toStepId===void 0){let xe=await qy({...n,executeStepList:kn,failureRecoveryParams:{failedStep:$,nextSteps:r.slice(v+1),results:e,tracer:L}});xe&&xe.status==="SUCCESS"&&(se=xe.proposedSteps,e.push(...xe.results))}if(se?f.push(...se):E?f.push(E):f.push(b),g.fastForwardingToStep&&m&&m.fromStepId===b.id&&JSON.stringify(p)===JSON.stringify(m.parentStepIdChain)&&(g.fastForwardingToStep=!1),B.status!=="SUCCESS"&&!se||a.closed){S=B.status,x=B;break}else if(h&&b.id===h.toStepId&&JSON.stringify(p)===JSON.stringify(h.parentStepIdChain)){a.setClosed();break}}return{status:S,results:e,terminalResult:x,proposedSteps:f}}async function GL({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:ua.parse(t)})}import{randomUUID as Zy}from"crypto";async function Qy({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:Zy(),type:"PRESET_ACTION",status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:r.message,startedAt:t,finishedAt:new Date,results:[],command:{id:Zy(),type:"NAVIGATE",url:n.baseUrl}};return{status:e.aborted||r.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var Tl=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=Iy(l);if(n.options.reinitializeBrowser){let h=await Qy({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 WL(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...")}}},WL=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",x=a,v=[],b=f||i!==void 0||s!==void 0||void 0,E={results:v,state:{failureRecoveryDisabled:b,autoHealingDisabled:b},asyncTasks:[]},C=!1;i?.fromStepId&&i.fromStepId===s?.toStepId?(S="filtered step",E.fastForwardingToStep=!0):i?.fromStepId?(S="partial steps list from step",E.fastForwardingToStep=!0):s?S="partial steps list until step":(S="entire test",C=!0);let R;if(C&&l&&l.length>0){let{status:O,results:Y}=await eb(l,"beforeSteps",n);if(O!=="PASSED")return g&&tb({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:E,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:O}),E.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({beforeResults:Y,results:[]}))),{status:O,beforeResults:Y,results:[]}}p.debug({stepsToExecute:x,fromStep:i,toStep:s},`Starting step execution for ${S}`);let M=await e.startStepList(),{status:L,terminalResult:$,proposedSteps:q}=await kn({...n,work:E,listParams:{steps:x,containerName:S,results:v,tracer:M}}),N;if(C&&c&&c.length>0){p.debug("Starting step execution for after step list");try{let{results:O}=await eb(c,"afterSteps",n);N=O}catch(O){p.error({err:O},"Failed to execute after steps list, continuing...")}}if(g&&tb({tracer:e,debugDataStorage:n.fixtures.debugDataStorage,work:E,controller:u,storage:h,context:m,runId:t,runAttemptId:r,logger:p,status:L}),await Promise.allSettled(E.asyncTasks),E.asyncTasks.push(Promise.resolve(n.callbacks.test.onSaveFinalRunResults?.({results:v,beforeResults:R,afterResults:N}))),L==="FAILED")return{status:"FAILED",results:v,beforeResults:R,afterResults:N,failedStepResult:$};if(L==="CANCELLED")return{status:"CANCELLED",results:v,beforeResults:R,afterResults:N};let _;if(q&&E.state.healingDetails&&o){let O=ay(3);await n.callbacks.test.onProposedTestSteps?.({name:O,testId:o.id,orgId:n.inputs.orgId,runId:n.inputs.runId,steps:q,details:E.state.healingDetails,purpose:"AUTO_HEALING"}),_={orgId:n.inputs.orgId,name:O}}return{proposedTest:_,status:"PASSED",results:v,beforeResults:R,afterResults:N}};async function eb(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 kn({...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 tb({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=sf(d.logsPerPage),u=sd(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 Fy({codePath:"test-complete-final",storage:o,screenshotBuff:m,logger:i}),g=await F(r.browser.html(),{milliseconds:2e3});s.setVariable(zy,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 El({settings:n,customHeaders:e,envVariables:t,envName:r,testName:o,baseUrl:i,logger:s,localTools:a,orgId:l,flagStore:c}){let d=ya.parse(n);e&&(d.extraHeaders={...d.extraHeaders,...e});let p=new Ot({baseUrl:i,envName:r,testName:o,variablesFromEnvironment:t,currentUrl:i});await mi({obj:d,context:p,bannedKeys:[],allowList:oh,localTools:a,logger:s,orgId:l,flagStore:c});try{return ya.parse(d)}catch(u){throw new A("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${u.message}`)}}import{cloneDeep as tM}from"lodash-es";var nb={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);
|
|
3791
|
-
`;)l++,
|
|
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}`;!
|
|
3794
|
-
`;else{let
|
|
3789
|
+
`};import{execSync as bN}from"child_process";import{randomUUID as aw}from"crypto";import{existsSync as Dl,mkdirSync as wN,readFileSync as vN,writeFileSync as xN}from"fs";import{Jimp as lw}from"jimp";import TN from"js-beautify";import{cloneDeep as EN}from"lodash-es";var rb={"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(rb);var ob=rb;var ib={"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(ib);var sb=ib;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)},hi,ks,to,up=class{constructor(...e){hi.set(this,new Map),ks.set(this,new Map),to.set(this,new Map);for(let t of e)this.define(t)}define(e,t=!1){for(let[r,o]of Object.entries(e)){r=r.toLowerCase(),o=o.map(a=>a.toLowerCase()),an(this,to,"f").has(r)||an(this,to,"f").set(r,new Set);let i=an(this,to,"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,ks,"f").set(r,a),s=!1,l)continue;let c=an(this,hi,"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,hi,"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,hi,"f").get(r)??null}getExtension(e){return typeof e!="string"?null:(e=e?.split?.(";")[0],(e&&an(this,ks,"f").get(e.trim().toLowerCase()))??null)}getAllExtensions(e){return typeof e!="string"?null:an(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 an(this,to,"f").values())Object.freeze(e);return this}_getTestState(){return{types:an(this,hi,"f"),extensions:an(this,ks,"f")}}};hi=new WeakMap,ks=new WeakMap,to=new WeakMap;var mp=up;var ab=new mp(sb,ob)._freeze();import{homedir as Bp,hostname as CN,platform as RN}from"os";import{basename as AN,extname as IN,join as Si,resolve as PN}from"path";import{chromium as dw,devices as LN}from"playwright";import{addExtra as ON}from"playwright-extra";import NN from"puppeteer-extra-plugin-recaptcha";import{v4 as MN}from"uuid";import{rmSync as Kb}from"fs";import{basename as VO,join as qO}from"path";import{errors as KO}from"playwright-core";var Jn={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 qL=new Set(["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]),KL=new Set(["a","e","i","o","u","y"]);function lb(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())qL.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"&&!KL.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 cb(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 oO}from"crypto";import{cloneDeep as yp}from"lodash-es";import{randomUUID as eO}from"crypto";var db=new Set(["about:blank","chrome-error://chromewebdata/"]);var Ut="data-momentic-id";var hp=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],gp=1e4,_s=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 YL}from"crypto";var JL="v1";function Cl(n,e){if(n.tagName.toLowerCase()==="svg"&&!ZL(n))try{let t=pb(n,e),r=XL(JSON.stringify(t));return{version:JL,json:t,hash:r}}catch{return}}function XL(n){return YL("md5").update(n).digest("hex")}function pb(n,e){let t=n.tagName.toLowerCase(),r=QL(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=pb(s,e);a&&o.children.push(a)}}return o}function ZL(n){let e=n.computedStyles.display,t=n.computedStyles.visibility,r=n.computedStyles.opacity;return e==="none"||t==="hidden"||r==="0"}function QL(n){let e={},t=n.attributes;for(let r of Object.keys(t))Jn.visualAttributesForSvgSerialization.includes(r)&&(e[r]=t[r]);return t.id&&n.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var no={r:147,g:196,b:125,a:.55},hb={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},Rl=["display","opacity","visibility","height","position"];function gb({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=tO({allDocuments:o,stringConstants:r,frameIndex:c,devicePixelRatio:e,backendIdToNode:i,frameIndexToIframeNode:s,logger:t});a.roots.push(d)}),a}function tO({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,R)=>{c[C]=R});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??[],x=u.nodeType??[],v=u.pseudoType??{index:[],value:[]},b=u.inputChecked??{index:[]},E=e[a.frameId];for(let C=0;C<h.length;C++){let R=h[C],M=x[C],L=g[C]??[],$=f[C]!==void 0&&f[C]>=0?f[C]:void 0,q=$!==void 0?h[$]:void 0,N=q!==void 0?i[q]:void 0,_=v.index.indexOf(C),O=_!==-1?e[v.value[_]]:void 0,Y=c[C],B;Y?B=p[Y]??[]:B=[];let ie=S[C]!==void 0?e[S[C]]?.toLowerCase():void 0;if(!ie){s.warn({backendNodeId:R,frameId:E,frameIndex:r,nodeBounds:B},"DOM node has no tag name");continue}let se={backendNodeId:R,psuedoType:O,nodeType:M,frameIndex:r,parentFrameId:E,ownedFrameId:void 0,bounds:{x:B[0]??null,y:B[1]??null,width:B[2]??null,height:B[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:q??null,tagName:ie,parent:N??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};N&&N.childrenBackendIds.push(R);let J=m.index.indexOf(C);if(J!==-1){let _e=m.value[J];o[_e]=se;let me=n[_e]?.frameId;se.ownedFrameId=me!==void 0?e[me]:void 0}for(let _e of Object.keys(se.bounds)){let me=_e;se.bounds[me]!==null&&(se.bounds[me]/=t)}let xe=Y!==void 0?d[Y]??[]:[];for(let _e=0;_e<xe.length&&!(_e>=Rl.length);_e++){let me=xe[_e];if(me===void 0||isNaN(me))continue;let Rt=e[me];if(Rt===void 0)continue;let yt=Rl[_e];se.computedStyles[yt]=Rt}for(let _e=0;_e<L.length;_e+=2){let me=L[_e],Rt=L[_e+1];if(!me||!Rt)continue;let yt=e[me],Tn=e[Rt];!yt||!Tn||(se.attributes[yt]=Tn)}b.index.includes(C)&&(se.attributes.checked="true"),i[se.backendNodeId]=se}return i[h[0]]}function Sp(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=`${Sp(t,e)}${s}`}return n.mPathSelector=r,r}function ub({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:(zr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e,originalNode:n},"Filtering out click candidate since it has a significantly different area"),!1):(zr({logger:r,logKey:t,maxCount:5,intervalMs:3e3},{candidate:e},"Filtering out click candidate since it does not intersect with the original node"),!1)}function Al(n,e,t){let r=Object.values(e.backendIdToNode),o,i=eO();for(let c of r)if(c.attributes?.[Ut]===n){o=c;break}if(!o)return[];let s=[],a=e.backendIdToNode[o.parentBackendNodeId??-1];for(;a&&(a?.momenticIgnored||!ub({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&&ub({originalNode:o,candidate:p,logKey:i,logger:t})?s.push(p):p&&l.push(p)}}return s}function mb(n,e){return n.parentBackendNodeId!==null?e.backendIdToNode[n.parentBackendNodeId]:n.frameIndex===0?void 0:e.frameIndexToIframeNode[n.frameIndex]}var nO=["html","#document","#document-fragment"];function fb({node:n,domGraph:e}){let t=[],r=n,o=mb(n,e);if(!o)return[n.tagName];let i=()=>{if(r=o,o=mb(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++,nO.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 Sb(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 yb(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,Ut);if(!i)throw new Error(`Could not find attribute ${Ut} for object ${e}`);return i}function bb(n){let e=[];for(let t=0;t<n.domGraph.roots.length;t++){let r=n.domGraph.roots[t],o=rO({root:r,domGraph:n.domGraph,existingHashes:n.existingHashes,flagStore:n.flagStore,logger:n.logger});e=e.concat(o)}return e}function rO(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=Cl(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 iO=["focusable","keyshortcuts","controls","live","relevant","orientation"],sO=["selected","readonly","modal","required","invalid"],aO=["id","name","role","content"],wb=["absolute","fixed","sticky"],lO=["path"],cO=["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"],Tb=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],Eb=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],dO=["menulistpopup","statictext","inlinetextbox"],pO=80,vb=100,Il=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],uO=["cite"],mO={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"]},hO={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},xb={indentLevel:0},bp=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&&!lb(t)?t:""),this.role=this.role||(e.domNode.attributes.role??""),yO(this.properties,e.domNode)}wO(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&&lO.includes(this.domNode.tagName))return!1;if(cO.includes(this.role.toLowerCase()))return!0;if(this.domNode?.computedStyles.display==="contents"||this.ignoredReasons.some(t=>Eb.includes(t)))return!1;if(this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||Jn.alwaysInterestingTruthyPropertyNames.some(t=>!!this.properties[t]))return!0;let e=this.properties.class;return typeof e=="string"&&e.split(" ").some(t=>Ib(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=xb){let t=Object.assign({},xb,e),{indentLevel:r,noChildren:o,noProperties:i,noId:s,noContent:a,condensedMode:l}=t,c=yp(this.properties),d=" ".repeat(r),p=this.role||"",u=this.tagName??"unknown",m=this.name;p==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(E=>!E.superseded&&E.type==="contents")&&this.children.length>0&&(m="");let g=this.nameSources?.find(E=>!E.superseded);if(g&&!g.nativeSource&&g.type==="relatedElement"){let E=g.attributeValue?.relatedNodes??[];E.length===1&&E[0].text&&E[0].text===m&&(m="")}let f=Il.includes(this.role)||uO.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 x=a??!1;(c.multiline||c.contenteditable)&&this.children.length>0&&(x=!0),p&&p!=="generic"&&p!==u&&!(mO[p]??[]).includes(u)&&(S+=` role=${JSON.stringify(p)}`),m&&(S+=` name=${JSON.stringify(m)}`),this.content&&!x&&(S+=` content=${JSON.stringify(this.content)}`);let v=Date.now();if(Object.keys(c).length>0&&!i){if(Date.now()-v>1e3)throw new Error(`Serialization for the HTML element with tag ${u} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(c).forEach(([E,C])=>{if(!iO.includes(E)){{if(sO.includes(E)&&(!C||C==="false"))return;if(E==="value"&&x&&(c.type==="text"||this.role==="textbox"))return;if(E==="level"&&`${C}`=="1")return;if(E==="url"&&c.src&&u==="img")return;if(E==="url"&&c.href&&u==="a")return;if(E==="editable"&&C==="plaintext")return;if(E==="type"&&C===u)return;if(l&&!hO[E])return}typeof C=="string"?S+=` ${E}="${je(C,vb,!0)}"`:typeof C=="boolean"?C?S+=` ${E}`:S+=` ${E}={false}`:typeof C<"u"&&(S+=` ${E}={${je(JSON.stringify(C),vb,!0)}}`)}})}if(u==="::before"||u==="::after"){let E="";for(let C of this.children)E+=C.serialize({...e,indentLevel:r,neighbors:0});return E}let b=e.maxLevel!==void 0&&r/2>=e.maxLevel;if(this.children.length===0||o||b)S+=` />
|
|
3794
|
+
`;else{let E="";for(let R of this.children)E+=R.serialize({...e,indentLevel:r+2,neighbors:0});let C=E.trim();C.length<=pO&&!C.includes(`
|
|
3795
3795
|
`)?S+=`>${C}</${u}>
|
|
3796
3796
|
`:S+=`>
|
|
3797
|
-
${
|
|
3798
|
-
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let
|
|
3797
|
+
${E}${d}</${u}>
|
|
3798
|
+
`}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let E=this.parent.children.findIndex(M=>M.id===this.id),C=E>0?this.parent.children[E-1]?.serialize({...e,neighbors:0}):"",R=E<this.parent.children.length-1?this.parent.children[E+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
|
|
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
|
+
${R||""}`}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:yp(this.internalProperties),parentFrame:this.parentFrame});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=yp(this.properties),e}},wp=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(Il.includes(i.role)&&s)return l}let o=r(t);return new n(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function gO(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 fO(n,e,t,r){return n.bounds.x===null||n.bounds.y===null||n.bounds.height===null||n.bounds.width===null||n.bounds.width===0||n.bounds.height===0?!0:n.bounds.x+n.bounds.width<e.leftBound||n.bounds.x>e.rightBound?(zr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport horizontally"),!1):n.bounds.y+n.bounds.height<e.upperBound||n.bounds.y>e.lowerBound?(zr({logger:t,logKey:r,maxCount:5,intervalMs:3e3},{domNode:n,logKey:r},"Filtering out node since it is not in the viewport vertically"),!1):n.computedStyles.display==="none"?(t.debug({domNode:n},"Filtering out node since it has display none"),!1):!0}async function Cb({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=(N,_={})=>{},g=n.backendDOMNodeId,f=dO.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 N=await F(p.send({method:"DOM.describeNode",params:{backendNodeId:g}}),{milliseconds:750,fallback:()=>{u.debug("Timeout getting node from CDP while processing a11y tree")}});if(N&&N.node.nodeName.toLowerCase()==="slot"&&N.node.distributedNodes?.length)u.debug({redirectedDomNode:S,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:n,cdpResult:N},"Redirecting node to assigned slot");else return h("Filtering out node since it doesn't exist in the DOM",{cdpResult:N}),[]}catch(N){return h("Filtering out node since it doesn't exist in the DOM",{err:N}),[]}if(S&&e&&l&&c&&n.backendDOMNodeId&&!fO(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 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 x=n.name?.value?typeof n.name.value=="string"?n.name.value:`${n.name.value}`:"",v=n.value?.value?typeof n.value.value=="string"?n.value.value:`${n.value.value}`:"",b=new bp({domNode:S,id:parseInt(n.nodeId),role:n.role?.value||"",name:x,nameSources:n.name?.sources,content:v,properties:n.properties,children:[],ignoredReasons:n.ignoredReasons?.filter(N=>Tb.includes(N.name)||Eb.includes(N.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+gO(n),backendNodeID:n.backendDOMNodeId,ignoredByCDP:n.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},parentFrame:r.type==="root"?void 0:r}),E=r,C=s[t],R=t;if(S?.tagName.toLowerCase()==="iframe"&&S.ownedFrameId){let N=r.childFrames.find(Y=>Y.frameId===S.ownedFrameId),_=o[N?.frameId??""]?.root,O=s[N?.frameId??""];if(N&&_&&O){n.childIds&&n.childIds.length>0&&u.debug("Replacing existing node's children with children from the iframe");let Y=_;n.childIds=Y.childIds,E=N,C=O,R=N.frameId}}let M=S?.childrenBackendIds?.length??0,L=n.childIds?.length??0;if(M>L){let N=n.childIds?.map(O=>C.get(parseInt(O))).filter(Boolean).map(O=>O?.backendDOMNodeId).filter(O=>O!==void 0)??[],_=0;for(let O of S?.childrenBackendIds??[]){if(N.includes(O)){_=(n.childIds?.findIndex(J=>C.get(parseInt(J))?.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),ie={nodeId:B.toString(),parentId:n.nodeId,ignored:!1,backendDOMNodeId:O,frameId:R,role:{type:"string",value:"graphics-symbol"}};C.set(B,ie),n.childIds||(n.childIds=[]),n.childIds.splice(_,0,B.toString()),_++}}for(let N of n.childIds??[]){if(!N)continue;let _=C.get(parseInt(N));if(!_)continue;let O=await Cb({node:_,parent:b,domGraph:i,axGraph:o,frameId:R,frameContext:E,inputNodeMap:s,cdpClient:p,logger:u,callId:m,filterByViewport:l,showZeroOpacityElements:a,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 N=b.name,_=b.children[0]?.name;(N===_||!_)&&(b.children=[])}let $=[];for(let N=b.children.length-1;N>=0;N--){let _=b.children[N];if(_.role!=="StaticText"){$.push(_);continue}if(N===0||b.children[N-1].role!=="StaticText"){$.push(_);continue}b.children[N-1].name+=_.name}if(b.children=$.reverse(),b.role==="generic"&&b.children.length===1){let N=b.children[0];if(b.name&&!Il.includes(N.role)&&b.name===N.name)return S&&(S.momenticIgnored=!0),b.children}if(!b.isInteresting()&&n.parentId)return S&&(S.momenticIgnored=!0),b.children;for(let N of b.children)N.parent=b;return bO(b),S&&d&&Sp(S,i),[b]}function Rb({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:Il.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=Cl(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=Rb({node:u,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:r,callId:o,startId:c,useMPaths:s,domGraph:i,selectorToNodeMap:a,iconKnowledgeBase:l});return c}async function Ab({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=oO(),h=b=>{let E=b.allNodes.filter(R=>!R.ignoredReasons?.find(L=>Tb.includes(L.name))),C=new Map;return E.forEach(R=>{C.set(parseInt(R.nodeId),R)}),C},g={};Object.entries(n).forEach(([b,E])=>{g[b]=h(E)});let f=await Cb({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={},x={},v={};return Rb({node:f[0],a11yIdNodeMap:S,dataMomenticIdMap:x,selectorToNodeMap:v,domGraph:e,logger:r,callId:m,useMPaths:l,iconKnowledgeBase:d}),new wp(f[0],S,x,v)}function SO(n,e,t){if(n==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(i=>i.length<50&&!Jn.bannedClassSubstrings.some(s=>i.includes(s))).slice(0,3).join(" ");let r=e.split(" "),o=[];for(let i of r)if(Ib(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 yO(n,e){if(!e)return;Object.entries(e.attributes).forEach(([i,s])=>{if(Jn.relevantElementAttributes.includes(i)&&!aO.includes(i)&&!n[i]&&!i.startsWith("aria")){let a=SO(i,s,e);a!==null&&(n[i]=a)}});let t,r=[];if(e.computedStyles.position&&wb.includes(e.computedStyles.position))t=e.computedStyles.position;else if(e.attributes.style){for(let i of wb)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 bO(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(je(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=>je(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 wO(n){let e=n.properties.class,t=typeof e=="string"&&e.includes("cm-content");n.internalProperties.inCodeMirrorEditor=n.internalProperties?.inCodeMirrorEditor||t}function Ib(n){if(Jn.bannedClassSubstrings.some(e=>n.includes(e)))return!1;if(Jn.alwaysInterestingClassNames.includes(n))return!0;for(let e of Jn.alwaysInterestingClassPrefixes)if(n.startsWith(e))return!0;return!1}var Pl=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 F(i.newCDPSession(s),{milliseconds:o*d,fallback:()=>{throw new A("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${s.url()})`)}});break}catch(p){await te(500),l=p}if(!a)throw l;let c=new n(a,e,t,r,o);try{await F(c.registerHandlers(a),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(d){throw c.cdpFullyDead=!0,new A("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 F(this.cdpInitializingPromise,{milliseconds:r});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new A("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 F(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 F(this.contextGetter().newCDPSession(r),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${r.url()})`),new A("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 F(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 F(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 vO,rmSync as Pb,statSync as xO}from"fs";import*as Tp from"node:fs";import TO from"nodejs-file-downloader";import{tmpdir as EO}from"os";import vr,{basename as CO,dirname as RO}from"path";var Ep="file://",xp=vr.join(EO(),"momentic","downloads"),vp=1e4,AO=50*1024*1024;async function Lb(n){let{uri:e}=n;return e.startsWith(Ep)?PO(n):e.startsWith("http")?OO(n):LO(n)}function IO(n,e){let t=vr.join(xp,n,e.slice(Ep.length)),r=vr.join(xp,n),o=t.startsWith(r);if(!Tp.existsSync(t)||!o)throw new A("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function PO({uri:n,orgId:e}){let t=IO(e,n);return{filePath:t,cleanup:()=>{Pb(RO(t),{recursive:!0,force:!0})}}}async function LO({uri:n}){let e=vr.resolve(n);if(!Tp.existsSync(e))throw new A("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 OO({uri:n,logger:e,orgId:t}){let r=new URL(n);r.search&&(r.search="");let o=CO(r.href),i=Rp(o),s=vr.extname(i);if($h.includes(s))throw new Error(`Downloading files with extension ${s} is not allowed.`);let a=Cp(t),l=new TO({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:vp}),{downloadStatus:c,filePath:d}=await F(l.download(),{milliseconds:vp,message:`Download timed out after ${vp}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=xO(d).size;if(u>AO)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:u,filePath:d,fileName:i},"Downloaded file to disk");let m;return{filePath:d,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>Pb(a,{recursive:!0,force:!0}),10*60*1e3)}}}function Ob(n,e){return`${Ep}${n}/${e}`}function Cp(n){let e=Math.random().toString(36).substring(4),t=vr.join(xp,n,e);return vO(t,{recursive:!0}),t}function Rp(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 wn(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 Nb(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 F(t,{milliseconds:3e3});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),r}async function Mb(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 F(r,{milliseconds:3e3})}catch(r){t.warn({err:r},"Failed to import indexedDB data")}}}async function kb(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 F(t,{milliseconds:3e3})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function _b(n,e,t,r,o){try{await NO(n,e,t,r)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function NO(n,e,t,r){let o=r.text();o.length>_s&&(o=o.slice(0,_s)+"...(TRUNCATED)");let i=[];for(let s of r.args())try{let a=await s.jsonValue(),l=JSON.stringify(a);l.length>_s?i.push(l.slice(0,_s)+"...(TRUNCATED)"):(typeof a!="object"||Object.keys(a).length>0)&&i.push(a)}catch{}Ap(n,t,e,{url:n.url(),location:r.location(),type:r.type(),text:r.text(),args:i})}function Ap(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>gp&&(i[t]=i[t].slice(Math.floor(gp/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 ds({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]",_O=1e4;async function zb(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 Hb(n,e,t,r){try{await DO(n,e,t)}catch(o){o.message.includes("browser has been closed")||r.warn({err:o,pageId:n},"Error handling new network request, skipping...")}}function ro(n){return n<0?0:n}function Db(n){return{timings:{blocked:ro(n.domainLookupStart),dns:ro(n.domainLookupEnd-n.domainLookupStart),connect:ro(n.connectEnd-n.connectStart),send:ro(n.responseStart-n.requestStart),wait:0,receive:ro(n.responseEnd-n.responseStart),ssl:ro(n.connectEnd-n.secureConnectionStart)},total:ro(n.responseEnd)}}async function DO(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 Bb(t),url:i.toString(),method:t.method(),queryString:s,postData:await UO(t)},l={pageref:n,_resourceType:t.resourceType(),startedDateTime:new Date(o.startTime).toISOString(),request:a,timings:Db(o).timings};Fb(e,l,r);let c=await t.response();if(c){await c.finished();let h={};try{h=await BO(c)}catch{}let g={...await Bb(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}=Db(p);l.time=m,l.timings=u,Fb(e,l,r)}function Fb(n,e,t){n.harEntries||(n.harEntries={}),n.harEntries[t]=e}function Ub(n){try{return new Date(n).toISOString()}catch{return}}function FO(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=_n(i),e.value=_n(s);continue}i==="Domain"&&(e.domain=_n(s)),i==="Expires"&&(e.expires=Ub(s)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=Ub(Date.now()+ +s*1e3)),i==="Path"&&(e.path=_n(s)),i==="Secure"&&(e.secure=!0)}return e}async function Bb(n){let e=await n.allHeaders(),t=e.cookie?.split(";").map(FO)??[];return{headers:Object.entries(e).map(([r,o])=>({name:_n(r),value:_n(o)})),cookies:t}}async function UO(n){let e=n.postData();if(!e)return;let t=await n.headerValue("content-type"),r={mimeType:t??"application/octet-stream",text:_n(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:_n(i),value:s?_n(s):void 0})}return r}async function BO(n){return{mimeType:await n.headerValue("content-type")??void 0,text:_n(await n.text()),encoding:await n.headerValue("content-encoding")??void 0}}function _n(n){return n.length>_O?kO:n}function jb(){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 Ge({root:n,fn:e,arg:t,timeout:r,waitForPageLoad:o,codePath:i}){return await o(),await F(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 Ip(){return window.lastCursorPos}import{errors as zO}from"playwright-core";async function oo({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(os(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 zO.TimeoutError)t.warn({err:c,rootUrl:(await r.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),a=await HO(c,i.locator,r,t);else throw c}throw a instanceof A?a:new A("ActionFailureError",`Failed to interact with targeted element. Error: ${a.message}`,{errOptions:{cause:a}})}async function HO(n,e,t,r){return n.message.includes("attempt #")?jO(n,e,t,r):$O(n)}async function jO(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 wn(e,r);if(a&&(s=`Target element HTML: ${je(a,100,!0)}`),i.includes("element is not enabled"))return new A("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 wn(d,r);p&&(l=`Covering element HTML: ${je(p,100,!0)}`)}return new A("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 A("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 A("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 $O(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 A("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 $b(n){try{return await GO(n)}catch(e){n.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function GO({locator:n,logger:e}){let[t,r]=await n.evaluate(l=>[l.id,l.tagName.toLowerCase()],{timeout:1e3}),o=await wn(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 Wb=["date","datetime-local","month","time","week"],Gb={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function Vb(n){try{await F(WO(n),{milliseconds:3e3})}catch(e){n.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function WO({root:n,text:e,options:t,logger:r,callbacks:o}){let i=(await Ge({root:n,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:1e3,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!Gb[i])return;Gb[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 Ll({locator:n,callbacks:e,logger:t,timeoutMs:r=1e3}){try{await Pp(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 F(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 Pp(n,e=1e3){let t=await n.state.getRoot();await Ge({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 Op(n){let e=n.flagStore.isBooleanFlagEnabled("visual_actions");return oo({action:"clicking element",targetingResult:n.targetingResult,logger:n.logger,retryTimeoutMs:n.retryTimeoutMs,callbacks:n.browserCallbacks,func:async t=>Lp({...n,targetingResult:t,useVisualClick:e})})}async function YO(n,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw n;try{return await JO(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 JO(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"),Lp({...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 tN(s,a,t);if(l)return Lp({...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 XO(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 Vr({promiseGenerator:async()=>a.boundingBox(),timeoutMs:3e3,logger:t}):null}catch(m){throw new A("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 eN({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 ZO(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 $b({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(rN(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..."),YO(c,{...n,targetingResult:{...i,locator:i}})}}async function Lp(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 KO.TimeoutError?new A("ActionFailureError",`Download did not complete in ${l}ms`):new A("ActionFailureError",`Download failed: ${c.message}`)}})());try{await Ll({locator:s.locator,callbacks:r,logger:t,timeoutMs:1e3})}catch(l){t.warn({err:l},"Error highlighting locator in click, continuing...")}if(i?await XO(n):await ZO(n),e?.waitForDownload)if(a){if(!o?.createIsolatedFolder)throw new A("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 F(a,{milliseconds:e.downloadTimeoutMs??3e4});if(l instanceof Error)throw l;return{downloadedFile:await nN(l,o.createIsolatedFolder,t)}}else throw new Error("No download promise or error but the step requested to wait for a download")}async function QO(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 A("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 eN({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 QO(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 tN(n,e,t){let r=await n.evaluate(a=>a.getAttribute("data-momentic-id"));if(!r)return;let o=Al(r,e,t);if(!o.length){t.error("No candidates found for parent-based locator redirection");return}let i=parseInt(o[0].attributes?.[Ut]??"");if(isNaN(i))return;n=n.page().locator(`[data-momentic-id="${i}"]`);let s=await wn(n,t);return t.warn({candidateMomenticId:i,serializedHtml:s},"Trying new locator based on parent-direction after covering error"),n}async function nN(n,e,t){t.info("Download detected, saving file to disk");let r=await n.path(),o=Rp(n.suggestedFilename()),i=e();await n.saveAs(qO(i,o)),Kb(r,{force:!0}),setTimeout(()=>{Kb(i,{recursive:!0,force:!0})},5*60*1e3);let s=Ob(VO(i),o);return t.debug({uri:s,downloadFolder:i},"Saved download to isolated folder"),s}function rN(n){return n.message.includes("locator.click: Timeout")&&n.message.includes("click action done")}import{platform as oN}from"os";var iN={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 sN(){let n=oN();return n==="win32"?"win32":n==="darwin"?"darwin":"linux"}function Yb(n){return JSON.stringify(n.split("+").sort())}function Ol(n){let e=sN(),t=Yb(n);for(let r of Object.values(iN))if(Object.values(r).some(o=>Yb(o)===t))return r[e];return process.platform==="darwin"?n=n.replaceAll("Control","Meta"):n=n.replaceAll("Meta","Control"),n}async function Np({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 Ge({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 Ge({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:a.waitForPageLoad,timeout:2e3,codePath:"computing page height"}),[m,h,g]=await Ge({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 F(e.evaluate(()=>document.body.scrollHeight),{milliseconds:1e3}),[x,v,b]=await F(e.evaluate(()=>{let E=document.activeElement;if(!E)return[void 0,void 0,void 0];let C=E.getBoundingClientRect();return[E.scrollTop,C.x,C.y]}),{milliseconds:1e3});if(S===u&&x===m&&v===h&&b===g)break;u=S,m=x,h=v,g=b,await te(500)}}catch(f){l.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Mp(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 te(500)}throw new Error(`Failed to get tab titles after all retries: ${r?.message}`)}var gi="<empty>";function aN(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 Xb(n){let e=n.adFrameStatus?.adFrameType;return e==="child"||e==="root"||aN(n.url)}async function lN(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 fi({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(Xb(p.frame))return null;try{return await Zb({cdpClient:n,rawFrameTree:p,indices:[u],parent:r,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),null}}),d=await Promise.all(c);return r.childFrames=d.filter(p=>p!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),r}async function Zb({cdpClient:n,rawFrameTree:e,indices:t,parent:r,warnings:o,logger:i}){let s=e.frame.id,a=await lN(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(Xb(h.frame))return null;try{return await Zb({cdpClient:n,rawFrameTree:h,indices:[...t,g],parent:p,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${g} of frame with url ${e.frame.url}): ${f}`),null}});return p.childFrames=(await Promise.all(m)).filter(h=>h!==null),p}async function cN(n){try{return await n.owner().count()===1}catch{return!1}}async function dN(n){try{return await n.count()===1}catch{return!1}}async function Dn(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,gi]){let u=o.frameLocator(p===gi?"iframe":`iframe[${p}]`);if(await cN(u)){d=!0,o=u,i.push(p);break}}if(!d)throw new A("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,gi]){let d=o.locator(c===gi?"iframe":`iframe[${c}]`);if(await dN(d)){s=d,i.push(c);break}}if(!s)throw new A("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 A("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${n.url}'`);return await a.dispose(),{frame:l,mPathSelectorTokens:i}}function Jb(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 Qb({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===gi?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===gi?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 Dn(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=Jb(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 Dn(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=Jb(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 Dn(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 Dn(r,n)).frame,handle:r,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${s.length} frames with indices ${t.indices}`),new An("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}])}function Nl(n){return n.type==="auto"?JSON.stringify({type:"auto",frameId:n.handle.frameId}):JSON.stringify(n)}function kp(n){for(;n.parent.type==="frame";)n=n.parent;return n.parent}function ew(n){let e=kp(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 tw(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 nw({frame:n,logger:e,signal:t}){let r;try{r=await n.frameElement(),await pN({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 pN({frameElementHandle:n,logger:e,signal:t}){let r=await n.boundingBox();if(!r){e.warn("Active frame element has null bounding box, skipping scroll");return}await Vr({promiseGenerator:async()=>n.evaluate(async(i,{x: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 rw({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 F(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 Fn}from"crypto";import uN from"js-beautify";var mN=["Dead"],Ml=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:Fn(),type:"PRESET_ACTION",command:Hn(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=Hn(i);s={id:Fn(),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=Hn(i);s={id:Fn(),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=Hn(i);s={id:Fn(),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=uN.html(p,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),p=cb(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,...ze(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(mN.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let p=Hn("TYPE");i={id:Fn(),type:"PRESET_ACTION",command:{...p,target:void 0,value:t,clearContent:!1}}}else{let p=Hn("PRESS");i={id:Fn(),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:Fn(),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:Fn(),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=Hn(c);d.deltaY=Math.abs(i);let p={id:Fn(),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=Hn(c);d.deltaX=Math.abs(i);let p={id:Fn(),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 kl=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=kp(e),{frame:o,mPathSelectorTokens:i}=await Dn(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 fi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await Qb({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(Nl(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:Nl(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await nw({frame:r.frame,logger:e,signal:t}),this.activeFrameCache=r,r}async executeFunctionInAllFrames(e,t){let r=this.pageGetter(),o=await fi({cdpClient:this.cdpClient,page:r,logger:this.logger}),i=[F(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(Dn(l,r).then(({frame:d})=>F(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 fi({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 A("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:()=>fi({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:Br,filterByViewport:!1}),Math.random()<.1){let r=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:r&&r.length>4e5?"REDACTED_DUE_TO_SIZE":r},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:r}){if(r.backendNodeId===void 0)throw new Error(`Node with a11y id ${r.id} has no backend node ID: ${r.getNodeOnlySerializedForm()}`);if(this.flagStore.isBooleanFlagEnabled("visual_actions")){let o=this.domGraph?.backendIdToNode[r.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${r.backendNodeId}`);let i=fb({node:o,domGraph:this.domGraph});return Sb(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 yb(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(`[${Ut}="${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 fi({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 A&&c.reason==="UserInfrastructureError")throw c;l%3===0&&this.logger.debug({attempt:l,err:c},"Failed to resolve active frame, retrying..."),await te(500,t)}finally{l++}if(s)return{source:"url",frame:s.frame,handle:s.handle,frameIdentifierStringified:Nl(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 Dn(a,o)});break}}else if(r.trim()===p.trim()){s.push({handle:a,matchType:"url",...await Dn(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 A("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 Ab({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 Dn(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 Ge({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:Rl},timeout:3e3}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await te(500,t),r.debug({err:s},"Error fetching DOM tree"),i++}if(!o||!o.documents.length)throw new A("InternalWebAgentError","Got empty DOM snapshot with no documents");return gb({snapshot:o,devicePixelRatio:e,logger:r})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let r=ew(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 _p(n){let e=[],t="";for(let r of n)r==="+"&&t?(e.push(t),t=""):t+=r;return e.push(t),e}function ow(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 Fp=Si(Bp(),"momentic","chromium"),kN=Si(Bp(),"video"),Fl=process.env.TWO_CAPTCHA_KEY,Up=ON(dw);Up.use(NN({provider:{id:"2captcha",token:Fl},visualFeedback:!0}));var Un=class n{static USER_AGENT=LN["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(Gg(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:nb.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("**/*",ow(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"&&RN()==="darwin"&&bN("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 Pl.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),await this.initializeScreencast(),this.stateManager=new kl({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||No,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,x,v,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 E=a.localChromeExtensionPaths?.map(R=>R.startsWith("~")?Si(Bp(),R.slice(1)):R);if(E?.length){if(a.browserType==="Chrome for Testing")throw new A("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let $ of E){let q=Si($,"manifest.json");if(!Dl(q))throw new A("UserConfigurationError",`Chrome extension path ${q} does not exist.`)}let R=Si(Fp,`momentic-session-${Date.now()}`);if(!Dl(R))try{wN(R,{recursive:!0})}catch($){throw new A("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Fp} folder: ${$}`)}let M=[...f],L=E.map($=>PN($)).join(",");M.push(`--disable-extensions-except=${L}`),g?.deviceScaleFactor&&M.push(`--force-device-scale-factor=${g.deviceScaleFactor}`,`--device-scale-factor=${g.deviceScaleFactor}`),g.viewport&&M.push(`--window-size=${g.viewport.width},${g.viewport.height}`),x=await dw.launchPersistentContext(Si(Fp,`momentic-session-${Date.now()}`),{...h,...g,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:M,baseURL:e}),t.debug({sharedContextOptions:g,sharedBrowserOptions:h,userBrowserSettings:a,chromeArgs:M,flags:o.getAllFlags()},"Browser initialization context args (persistent)"),v=x.pages()[0]}else if(c){S=await Up.connectOverCDP(c);let R=S.contexts()[0];if(!R)throw new Error("Failed to get browserbase default context");let M=R.pages()[0];if(!M)throw new Error("Failed to get browserbase default page");x=R,v=M}else{S=await Up.launch({...h,args:f});let R={...g,baseURL:e,recordVideo:d?{dir:kN}:void 0};x=await S.newContext(R),t.debug({contextArgs:R,sharedBrowserOptions:h,chromeArgs:f,userBrowserSettings:a,flags:o.getAllFlags()},"Browser initialization context args (standard)"),v=await x.newPage()}let C=new n({browser:S,context:x,page:v,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 Mp(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=aw(),o=`${e}-${r}`,i=Date.now(),s=!1,a=async()=>{try{await F(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()||!qr(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();if(this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete"),this.properties.recordVideo){let r=e.video();r&&this.videos.push(r)}try{this.handleNewPageEventHelper(e)}catch(r){this.logger.warn({err:r},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=aw(),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=>{_b(e,o,this.debugData,s,this.logger)}),e.on("request",s=>{Hb(t,this.debugData,s,this.logger),this.recordRequest(s)});let i=async()=>{await zb(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=bb({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=ze(this.logger),i={pageUrl:e.url(),firstSeenTime:Date.now(),hostname:CN()};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"||!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(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 F(Pp(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 Ge({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 te(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),Ge({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 te(250),this.screenshot({...e,retries:t-1})}finally{Date.now()-o>1e3&&this.logger.warn({pageUrl:i,duration:Date.now()-o},"Screenshot took longer than expected"),r&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:r,timeout:o,respectActiveFrame:i,clearHighlights: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 lw.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&&xN(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 lw.fromBuffer(l)).crop({x:m,y:h,w:g,h:f}).getBuffer("image/jpeg")}catch(S){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${h}) with size (${g}, ${f}): ${S}`)}return"dispose"in e&&await e?.dispose(),l}getViewport(){return this.viewport}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:r=this.pageLoadTimeout}){Wf(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,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 te(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 A("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(db.has(a))throw new A("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 Ge({root:e,fn:()=>{let r=document.activeElement?.textContent??void 0;return r&&r.length>100&&(r=r.slice(0,100)+"...[TRUNCATED]"),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:r}:void 0},arg:void 0,timeout:1e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},r=!1){let o=await this.getActivePageOrFrame();await Vb({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(r){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await te(250),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}t.clearContent&&(t.forceClearContent||i?.tag==="input"||i?.tag==="textarea"?(process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25)):this.logger.warn({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...")),await this.page.keyboard.type(e,{delay:t.delay??Qu}),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 Ll({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 kb(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 Mb(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 Nb(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 A("ActionFailureError",`Failed to save auth state: ${r?.message}`)}async getOpenPages(e){return Mp(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||!hp.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 Ge({fn:r=>window.evaluateHybridSelector(r),arg:{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:{ldistThreshold:.05,requireBoundingBox:!0,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0}},root:e,timeout:2e3,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating Momentic cache"})}async resolveTargetWithCssSelectors({root:e,target:t}){if(!t.generatedSelectors||t.generatedSelectors.length<2||!t.nodeOnlySerializedHtml)throw new Ur("Insufficient data to resolve target using CSS selectors");return Ge({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 A("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let s=this.stateManager.a11yIdToNodeMap[e];if(!s)throw new A("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:x}=await this.stateManager.getAutoFrameDetailsFromHandle(f);c=S,d=x,l=x.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:tw(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 te(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:Br,signal:a});break}catch(m){if(m instanceof Ur)break;a?.throwIfAborted(),u&&s.debug({err:m},`Could not resolve target through CSS selectors only (x${d})`),await te(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=ze(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 Ur("Insufficient data to resolve target using primary methods (missing node HTML)");let o=this.userControlledBrowserSettings.hybridSelectorMode,i=async()=>{if(t.hybridSelector&&o)return this.resolveTargetWithHybridSelector({root:e,target:t,logger:r})},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 An(`CSS selector evaluation returned no eligible elements:
|
|
3803
3803
|
${l.value?.logs.join(`
|
|
3804
|
-
`)}`,[]);else throw new
|
|
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
|
|
3808
|
-
`),c=0,d=[],p=0,u=[],m=[],h=!1;for(;c<l.length;){h&&(
|
|
3809
|
-
`),tokenLength:p}),d=[],p=0,u=m.length?[m[m.length-1].id]:[],h=!1);let g=l[c],f=
|
|
3810
|
-
`),tokenLength:p}),
|
|
3811
|
-
${
|
|
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
|
-
${
|
|
3804
|
+
`)}`,[]);else throw new An(`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 A("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:EN(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 An(`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 wn(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 A("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 te(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 Ge({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(`[${Ut}="${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 wn(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&&hp.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=MN(),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=Wb.some(s=>s===o.toLowerCase());return await Op({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 Op({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(),Gf(a,t,r)){s=!0;break}await te(500,this.abortSignal)}if(!s)throw new A("ActionFailureError",`The active page URL ${r?.negated?"still does":"does not"} ${Td(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 A("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 te(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,2e3):500),await this.page.mouse.up()}async mouseDrag(e,t,r,o){o&&await this.hover({locator:o});let i=await(await this.getActivePageOrFrame()).evaluate(Ip);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await te(250),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await oo({func:async t=>{await this.scrollIntoView(t.locator);let r=await t.locator.boundingBox({timeout:1e3});if(!r)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(r.x+r.width/2,r.y+r.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await oo({func:t=>t.locator.focus({timeout:2e3}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await Ge({fn:()=>{let r=document.activeElement;r&&r.nodeType===1&&r.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:1e3,codePath:"blurring the active element"});return}await this.highlight(e.locator),await oo({func:t=>t.locator.blur({timeout:2e3}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,r=!1){await this.highlight(e.locator),await oo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new A("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=Ol(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=Ol(e);r!==e&&(this.logger.debug({keyString:e,convertedKey:r},"Converted platform dependent keys"),e=r)}for(let r of _p(e))await this.page.keyboard.down(r)}async keyUp(e,t){if(t.convertMeta){let r=Ol(e);r!==e&&(this.logger.debug({keyString:e,convertedKey:r},"Converted platform dependent keys"),e=r)}for(let r of _p(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 F(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 A("ActionFailureError",`Getting page content failed after ${r} attempts. Error: ${a}`)}async getViewportOffsetDetails(e){let[t,r,o,i,s]=await Ge({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 te(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 te(r.hoverSeconds?Math.min(r.hoverSeconds*1e3,8e3):500),await this.page.mouse.up()}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y)}async mouseDragUsingVisualCoordinates(e,t,r,o){await this.hoverUsingVisualCoordinates(o);let i=await(await this.getActivePageOrFrame()).evaluate(Ip);i||(this.logger.debug("Could not get current mouse position before mouse drag action, defaulting to 0,0"),i={left:0,top:0}),await this.page.mouse.down(),await this.page.mouse.move(e+i.left,t+i.top,{steps:r}),await te(250),await this.page.mouse.up()}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:3e3}),r=await F(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 x=0;x<a.length;x++)if(l[x]===e){p=c.indexOf(x);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 Np({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 Np({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 F(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 A("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 te(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 A("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(!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=Ra(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:Fl,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 te(2500);let a=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:Fl,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&&rw({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];qr(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 Vr({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 A("UserInfrastructureError",`The page with URL ${je(i,50)} did not load within the configured timeout (${o}ms): ${a}`);if(!a.message.includes("detached"))throw a}try{await Vr({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 TN.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 Ge({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 A("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 Ge({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=jb(),s={code:e,fragment:t,context:r},{result:a}=await F(this.page.evaluate(i,s),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new A("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 A("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:hb,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[Ut],s=parseInt(i??"");if(!i||isNaN(s))throw new Error("No data-momentic-id was found on the DOM node");let a=e.locator(`[${Ut}="${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=Al(`${i}`,this.stateManager.domGraph,this.logger);for(let p of d){let u=parseInt(p.attributes?.[Ut]??"");if(isNaN(u))continue;let m=e.locator(`[${Ut}="${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 F(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 wn(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:x}=await e.evaluate(b=>{let E=window;if(!E.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return E.performTargetRedirection(b)},void 0,{timeout:1e3}),v=Date.now()-o;if(h){t.warn({error:h,serializedElement:g,duration:v,force:S,logs:x},"Got error from target redirection with bounding box");return}else{if(u)return t.debug({newDataMomenticId:u,serializedElement:g,duration:v,force:S,logs:x},"Redirected target to new element with bounding box with data-momentic-id"),{locator:p.locator(`[data-momentic-id="${u}"]`),hints:{clickableXY:f,force:S}};if(m)return t.debug({newMPathSelector:m,serializedElement:g,duration:v,force:S,logs:x},"Redirected target to new element with bounding box with mPath"),{locator:p.locator(m),hints:{clickableXY:f,force:S}};if(f)return t.debug({point:f,serializedElement:g,duration:v,force:S,logs:x},"Chose specific visible point on original element"),{locator:e,hints:{clickableXY:f,force:S}};if(S)return t.debug({serializedElement:g,duration:v,force:S,logs:x},"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!!Fl}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,Ap(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${r}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Dl(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()||AN(e),o=vN(e),i=IN(e),s=cd[i];this.page.once("filechooser",async l=>{this.logger.info({filePath:e,fileName:r},"File chooser triggered");try{if(!Dl(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:ab.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 JN from"fetch-cookie";import{cloneDeep as XN}from"lodash-es";import{CookieJar as ZN}from"tough-cookie";import{z as Bt}from"zod";var Toe=Bt.object({doubleClick:Bt.boolean().optional(),rightClick:Bt.boolean().optional(),force:Bt.boolean().optional(),waitForDownload:Bt.boolean().optional(),delayMs:Bt.number().optional(),downloadTimeoutMs:Bt.number().optional(),relativePosition:Bt.object({x:Bt.number(),y:Bt.number()}).optional()}),Eoe=Bt.object({repeat:Bt.number().optional(),convertMeta:Bt.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:Bt.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 yi=3.1783027;function _N(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 Ds(n){return Math.ceil(zp(n)/yi)}function zp(n){let e=0;if(typeof n=="string"){let t=n;t=t.replaceAll(`
|
|
3807
|
+
`,""),t=t.replaceAll(" ","");let r=_N(t);return t.length-r+yi*r}if(typeof n>"u")return 0;if(typeof n=="number")return String(n).length;if(Array.isArray(n))return n.forEach(t=>{e+=zp(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*yi:e+=85*yi:e+=zp(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 uw={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},mw={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:15e3,maxLineLength:500},pw=/<(\S+) id="(\d+)".*?>/g,DN=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,hw=["h1","h2","section","footer","nav","aside","form","label","dialog"],FN=[...hw,"span","div","h3"],UN=["table","select","form","ul","ol","menu","pre","code","dialog"],BN=["table","form","dialog","nav","section","ul","select"];function Hp(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)),zN(n)}function zN({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=Ds(g);p+=f,g.length>s&&(g=g.slice(0,s));let v=Array.from(g.matchAll(pw)).map(O=>O&&O.length>=3?{tagName:O[1],id:O[2]}:void 0).filter(O=>!!O),E=Array.from(g.matchAll(DN)).map(O=>O&&(O[2]||O[4])).filter(O=>!!O);E.reverse();let C=g.replace(/ id="[0-9]+"/g,"");d.push(C);for(let O of v)u.push(O.id),m.push(O);for(let O of E){let Y=m[m.length-1];Y&&Y.tagName===O&&m.pop()}let R=m.some(O=>UN.includes(O.tagName)),M=l[c+1]??"",L=Ds(M),q=Array.from(M.matchAll(pw)).map(O=>O&&O.length>2?O[1]:void 0).filter(O=>!!O),N=q.some(O=>hw.includes(O)),_=q.some(O=>FN.includes(O));p+L>=i&&(h=!0),p>=r&&(N&&!R||E.some(O=>BN.includes(O)))&&(h=!0),p>=o&&_&&!R&&(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 jp=4e4,$p=8e4;async function io(n){let{serializedTree:e,logger:t,flagStore:r,softTokenLimit:o=jp}=n;if(Ds(e)<o)return e;let s=r.isBooleanFlagEnabled("rag_v2"),a;s?a=Hp({serializedTree:e,options:mw,logger:t,maxCharacterLength:1e6}):a=Hp({serializedTree:e,options:uw,logger:t,maxCharacterLength:3e6});try{return s?await F(HN({...n,chunks:a.chunks}),{milliseconds:2e4}):await F($N({...n,chunkResult:a}),{milliseconds:15e3})}catch(l){t.warn({err:l},"Error executing page filtering, attempting AI keyword fallback");try{return await jN({...n,chunks:a.chunks})}catch(c){return t.warn({err:c},"Error executing page filtering using keyword matching, using naive truncation"),e.slice(0,$p*yi)}}}async function HN({chunks:n,generator:e,description:t,type:r,logger:o,signal:i,tree:s,softTokenLimit:a=jp,hardTokenLimit:l=$p}){let c=await e.rankChunksWithAi({chunks:n,description:t,type:r,softTokenLimit:a,hardTokenLimit:l},{abortSignal:i,logger:o,loggerTags:ze(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 jN(n){let{type:e,description:t,generator:r,tree:o,logger:i,hardTokenLimit:s=$p}=n;if(!t.trim())throw new Error("Empty description passed to page filtering");let a=await r.getExtractedKeywords({goal:t},{logger:n.logger,loggerTags:ze(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 $N(n){let{description:e,generator:t,tree:r,logger:o,signal:i,chunkResult:s,softTokenLimit:a=jp}=n,l=await t.rankChunksWithRag({description:e,chunks:s.chunks,tokenLimit:a},{abortSignal:i,logger:o,loggerTags:ze(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 Wp(n,e){if(!n.description)throw new A("ActionFailureError","Cannot locate element with empty description");return Mn({action:async()=>GN(n,e),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:e.browser,logger:e.logger})}async function GN(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=WN(g,s));let{serializedTree:f,tree:S}=await xr(d,{filterByViewport:o,abortSignal:m,skipWait:i,logger:c}),x,v=Date.now(),b;for(;!x&&Date.now()-v<3e3;){m.throwIfAborted();try{x=await d.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(O){b=O}}if(!x)throw new A("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 E=f,C=!1;E=await io({type:"locator",description:g,serializedTree:f,flagStore:e.flagStore,tree:S,logger:c,generator:u}),E!==f&&(C=!0);let M=`data:image/jpeg;base64,${x.toString("base64")}`,L=await u.getElementLocation({browserState:E,goal:g,screenshot:M,source:s},{disableCache:t,abortSignal:m,loggerTags:ze(c)});c.debug({usedRag:C,result:L},"Got locator result");let $=L.id>0;if(a?.details?.push({type:"AI_LOCATION",matched:$,pageState:E,ragUsed:C,thoughts:L.thoughts}),!$)throw new A("ActionFailureError",`Could not find any relevant element: ${L.thoughts}`);let{resolution:q,target:N,frameConfig:_}=await d.createTargetFromA11yId({id:L.id,description:g,targetSource:"AI",logger:c});if(q.a11yNode?.properties?.hidden&&q.a11yNode?.properties?.hidden!=="false")throw new A("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: ${q.displayString}`);return{thoughts:L.thoughts,target:N,resolution:q,frameConfig:_,screenshot:M}}var gw="<select> element:",fw="text input or contenteditable element:",Sw="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:",yw="Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:",Gp=[gw,fw,Sw,yw];function bw(n,e){if(n===e)return!0;for(let t of Gp){if(!n.startsWith(t))continue;let r=n.slice(t.length).trim();if(Gp.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===r)||r===e.trim())return!0}return!!Gp.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===n.trim())}function WN(n,e){if(!n||!e)return n;switch(e){case"SELECT_OPTION":return`${gw} ${n}`;case"TYPE":return`${fw} ${n}`;case"NEGATED_CHECK":return`${Sw}
|
|
3811
|
+
${n}`;case"ELEMENT_CHECK":return`${yw}
|
|
3812
|
+
${n}`;default:return n}}var VN=15;async function Vp({command:n,fixtures:e}){if(!n.assertion.trim())throw new A("ActionFailureError","Assertion command is missing the assertion content");let{browser:t,logger:r}=e,o=n.timeout?n.timeout*1e3:t.smartWaitingTimeout,i=qN(o),s=0,a=Date.now(),l,c,d;try{await Mn({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<VN&&(!p||p-a<o);){e.abortSignal.throwIfAborted(),s!==0&&(r.info(`Waiting ${i}ms before retrying AI check`),await te(i,e.abortSignal)),p=Date.now();try{let u=await Mn({action:async()=>{let m=await ww(t,r,e.abortSignal);return c&&c.serializedTree===m.serializedTree&&c.screenshotBuff.equals(m.screenshotBuff)?!1:(c=m,vw({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 Mn({action:async()=>vw({command:n,state:await ww(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 A("AssertionFailureError",u,{lastScreenshotBuffer:c?.screenshotBuff})}return l}async function ww(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 vw({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 io({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},x=await(n.contextChoice==="VISION_ONLY"?(v,b)=>l.getVisualAssertionResult(v,b):(v,b)=>l.getAssertionResult(v,b))(f,{useConsensus:r,attemptNumber:i,disableCache:!!n.disableCache,logger:a,abortSignal:c,loggerTags:ze(a)});if((x.result||o)&&x.relevantElements&&(d.relevantElementsSerialized=x.relevantElements.map(v=>s.getSerializedFormFromA11yId(v)).filter(v=>!!v),await KN(x.relevantElements,s,a)),!x.result)throw new A("AssertionFailureError",x.thoughts);return{succeedImmediately:!1,thoughts:x.thoughts,urlAfterCommand:h,afterScreenshotOverride:m}}function qN(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 KN(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 F(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 YN=3e4;async function xw({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??YN/1e3,i=new AbortController,s=Object.fromEntries(Object.entries(n.headers||{}).filter(([p,u])=>p&&u)),a;if(Ho(n.url)&&(a=n.url),t&&jo(n.url,t)&&(a=new URL(n.url,t).toString()),!a)throw new A("ActionFailureError",`Invalid URL: ${n.url}`);let c=await F((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 A("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!c.ok){let p;try{p=await c.json()}catch{throw new A("ActionFailureError",`GraphQL request failed with status ${c.status}: ${await c.text()}`)}throw p?.errors?.length&&p?.errors[0]?.message?new A("ActionFailureError",`GraphQL request failed with status ${c.status}: ${p.errors[0].message}`):new A("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 Ul(n){try{return new RegExp(n)}catch(e){throw new A("UserConfigurationError",`The provided regex expression was invalid: ${e}`)}}async function Tw(n){let e=n.postData();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:n.postDataJSON()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function Ew(n){let e=await n.text();if(e){if((await n.headerValue("content-type"))?.includes("json"))try{return{json:await n.json()}}catch{return{}}else if((await n.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function Cw(n){return{request:{url:n.url(),method:n.method(),headers:await n.allHeaders(),...await Tw(n)}}}async function Rw(n,e){let t=await e.response();if(t)return n.response={status:t.status(),headers:await t.allHeaders(),...await Ew(t)},n}async function Aw(n){let e=n.request(),t=n.status(),r=n.headers(),o=await Ew(n);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await Tw(e)},response:{status:t,headers:r,...o},status:t,headers:r,...o}}var bi=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 io({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:{...ze(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 io({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:{...ze(s)},langfuseSessionId:a})}catch(h){throw new A("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 Wp(e,this.getControllerFixtures())}async locateElementWithSelector(e,t){return Mn({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 A("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 Mn({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")&&ld(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.flagStore.isBooleanFlagEnabled("visual_actions")&&os(i)){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}throw i}throw r instanceof A?r:new A("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 A("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)&&!hc(o))throw new A("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&&!bw(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&&Ju(f);if(!f){let x=new Date;m.debug({targetHealingInProgress:p,cacheBustedBeforeAction:g},"Prompting AI for an updated element location"),g&&await te(this.browser.smartWaitingTimeout,this.executeAbortController.signal),h--;let v=await Wp({description:o.elementDescriptor,disableCache:l,iframeUrl:s.iframeUrl,source:u},this.getControllerFixtures(t));v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let b=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,m),E=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()-x.getTime()}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=ze(m);let R=v.resolution.pageState;if(R)try{C=await this.getReverseMappedDescription({browserState:R,targetId:v.target.id,disableCache:!0,screenshot:v.screenshot})}catch(M){m.warn({err:M},"Failed to reverse map element auto-healed by AI, continuing...")}}return{result:E,elementInteractedDisplayString:v.resolution.displayString,newTarget:{cache:v.target,thoughts:v.thoughts,description:C}}}try{let x=new Date,v=await this.browser.resolveTarget(t,f,{targetName:d,logger:m});(this.flagStore.isBooleanFlagEnabled("global_locator_redirect")||this.flagStore.isBooleanFlagEnabled("visual_actions"))&&await this.browser.scrollIntoView(v.locator);let b=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,m),E=await i(b);if(S){let C=v.decisions.filter(R=>R.matched);if(C.length!==1)m.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let R=C[0].type;r.heal({healType:R}),this.analytics.track({type:"execution:step_heal",heal_type:R,step_type:"PRESET_ACTION",command_type:a.type,duration_ms:Date.now()-x.getTime()})}}return{result:E,elementInteractedDisplayString:v.displayString,newTarget:{cache:f}}}catch(x){this.throwIfClosed();let v=Hh(x)&&!ld(x)&&!os(x);if(x instanceof A&&!v)throw x;if(h>0&&o)return m.debug({err:x,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 A("ActionFailureError",x.message,{errOptions:{cause:x}})}}async attemptLocatorRedirect(e,t){return this.flagStore.isBooleanFlagEnabled("global_locator_redirect")?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Ms(this.browser,e)}async executePresetCommand(e,t,r,o,i){this.options?.slowMoMs&&await te(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 A("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")&&tm(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 Uy({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){yy(e,t)}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Cp(e)}}async resolveCommandTemplateStrings(e,t){return mi({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()?Vp({command:s,fixtures:this.getControllerFixtures(e)}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!r.assertion.trim())throw new A("ActionFailureError","Missing assertion");if(r.timeout&&r.timeout>1800)throw new A("AssertionFailureError",`AI check timeout of ${r.timeout} exceeds the maximum allowed value of 30 minutes.`);return Vp({command:{...r,type:"AI_ASSERTION"},fixtures:this.getControllerFixtures(e)})}case"AI_EXTRACT":{if(!r.goal.trim())throw new A("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:ze(this.logger)});if(g.result==="NOT_FOUND")throw new A("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new A("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 A("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 A("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(!Ho(r.url)&&!jo(r.url,this.browser.baseUrl))throw new A("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&&En(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 A("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 A("UserConfigurationError",`Wait timeout of ${r.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=r.delay*1e3;await te(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"CLICK":{if(En(r.target)){await this.browser.clickUsingVisualCoordinates(r.target.pixels,r);break}let m=this.browser.url(),h={disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl},{elementInteractedDisplayString:g,newTarget:f,result:S}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:r.target,command:r,cache:r.cache?.target,action:v=>this.browser.click(v,this.createCallbacksForBrowser(this.orgId),r),options:h});f.cache&&(r.cache={target:f.cache});let x={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,newTargets:[f],data:S};return Wa(m,x.urlAfterCommand)&&(x.succeedImmediately=!0,x.succeedImmediatelyReason="URL changed"),x}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(En(r.fromTarget)&&En(r.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(r.fromTarget.pixels,r.toTarget.pixels,{hoverSeconds:r.hoverSeconds});break}if(En(r.fromTarget)||En(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 A("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${r.deltaX}, ${r.deltaY})`);if(r.target&&En(r.target)){await this.browser.mouseDragUsingVisualCoordinates(m,h,g,r.target.pixels,{force:r.force});break}let f,S,x=[];if(r.target?.elementDescriptor){let{newTarget:v,elementInteractedDisplayString:b,result:E}=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=E,S=b,x.push(v)}return await this.browser.mouseDrag(m,h,g,f,{force:r.force}),{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:S,newTargets:x}}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:Or(r)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,newTargets:[g]}}case"TAB":{let m={loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(r.action,m);break}case"NEW_TAB":await this.browser.createNewTab(r.url,{loadTimeoutMs:r.loadTimeout?r.loadTimeout*1e3:void 0});break;case"COOKIE":if(!r.value)break;let c=await this.browser.setCookie(r.value);this.logger.debug({results:c},"Set cookies");break;case"LOCAL_STORAGE":if(!r.value||!r.key)break;await this.browser.setLocalStorage(r.key,r.value);break;case"JAVASCRIPT":{let m;try{r.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:r.code,fragment:r.fragment??!1,context:o.toObjectCopy(),timeoutMs:r.timeout?r.timeout*1e3:void 0}),this.logger.debug({result:m},"Executed JavaScript in browser")):m=await Yn({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 A("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new A("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&&En(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=XN(r.target);if(f){let{elementInteractedDisplayString:x,newTarget:v}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:r,target:f,cache:r.cache?.target,action:b=>this.browser.typeIntoTarget(r.value,b,{force:r.force,clearContent:r.clearContent,forceClearContent:r.forceClearContent,delay:r.delay,pressEnter:r.pressEnter}),options:{disableCache:i,useSelector:!!r.useSelector,iframeUrl:r.iframeUrl,disableGlobalLocatorRedirect:!0,source:Or(r)}});g.push(v),h=x}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 Wa(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"HOVER":{if(En(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 Wa(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 ZN,h=JN(fetch,m),g;try{g=new URL(r.url).hostname}catch{}return{data:{...await Sl({command:r,baseUrl:this.browser.baseUrl,logger:this.logger,fetchImplementation:h}),cookies:Ia(m,g)},succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await xw({command:r,baseUrl:this.browser.baseUrl,logger:this.logger}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Ny({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 Lb({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 A("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 Yn({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 A("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=Aa.optional().parse(m)}catch(g){throw new A("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(r.timeout??Rn)*1e3,h=await Ly({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 Mn({action:async()=>yl({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=Ul(r.pattern),h=this.browser.registerRequestListener(m);return this.registeredListeners[r.key]=h.then(async g=>await Aw(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 A("ActionFailureError",`No listener registered with key: ${r.key}`);let h=r.timeout??10;return{data:await F(m,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=Ul(r.pattern);return this.recordedRequests[r.key]=[],this.browser.registerRequestRecorder(r.key,m,async h=>{try{let g=await Cw(h);this.recordedRequests[r.key]?.push(g),await Rw(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 A("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=Ul(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:ze(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 Ml({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:ze(this.logger)})}async runFailureRecovery(e){return this.generator.getFailureRecoveryProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ze(this.logger)})}};var QN=4;async function Iw({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 x=await l(S,e),v=await c(S,e),b=await u(S),E=await m(S,e),{testMetadata:C,baseUrl:R,envName:M,browserConfig:L,environmentVariables:$,localCodeEvalTools:q}=await so({testId:f,orgId:S,logger:e,storage:r,authorization:p,flagStore:b,settings:E}),N=Z.getSession(g);if(N)return e.info("Associating connection with existing session (likely reconnect)"),await N.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:g,orgId:S,testId:f};let _=n.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:_,event:"connect",args:n.handshake.query},"Websocket event (connect)"),_&&Z.getCurrentConnectionsByIp(_)>=QN)throw e.error({clientIp:_,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(_);try{await eM({socket:n,baseUrl:R,envName:M,testMetadata:C,orgId:S,sessionId:g,logger:e,analytics:t,environmentVariables:$,clientIp:_,devicePixelRatio:a,storage:r,uploadedFileStorage:o,visualDiffScreenshotStorage:i,serviceMocker:s,localCodeEvalTools:q,generator:x,enricher:v,browserbase:d,browserConfig:L,flagStore:b})}catch(O){throw e.warn({err:O},"Error setting up socket session, possibly due to client closing the connection"),Z.releaseCapacityByIp(_),O}return{type:"e2e",sessionId:g,testId:f,orgId:S}}async function eM({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:x,flagStore:v}){let b={viewport:o.advanced?.viewport??Jt,locale:o.advanced?.locale??No,timezoneId:o.advanced?.timezone??Mo,geolocation:o.advanced?.geolocation??ko,colorScheme:o.advanced?.colorScheme};r&&(b.deviceScaleFactor=r);let E=o.id,C=await u?.initializeServicesForTest(i,E),R=await El({settings:f,orgId:i,baseUrl:e,envName:t,testName:o.name,localTools:m,envVariables:g,logger:a,customHeaders:void 0,flagStore:v});a=a.child({orgId:i,sessionId:s,testId:E});let M=!1,L=v.isBooleanFlagEnabled("icon_knowledge_base")?await c.fetchIconKnowledgeBase(i,a):null,$=await Un.init({baseUrl:e,userBrowserSettings:R,enricher:x,storage:c,flagStore:v,mockedServices:C,logger:a,contextArgs:b,iconKnowledgeBase:L,callbacks:{onTabsChange:(Y,B)=>{n.emit("tabs",{tabs:Y,activeTab:B})},onScreencastFrame:(Y,B)=>{let ie=n;M&&(ie=n.compress(!0)),ie.emit("screenshot",{buffer:Y},()=>{B()})},onSvgsCollected:Y=>{n.emit("newIconDetected",{numIcons:Y.newSvgs.length}),c.saveNewIcons(i,Y,a)}}});await $.navigate({url:e,initialNavigation:!0});let q=new bi({browser:$,generator:h,logger:a,analytics:l,flagStore:v,orgId:i,options:{scratchPadId:void 0,slowMoMs:R.slowMoMs,autoFollowNewTabs:R.autoFollowNewTabs},storage:c,localCodeEvalTools:m,uploadedFileStorage:d,visualDiffScreenshotStorage:p}),N=cy(n,s,a),_=async()=>{N.timers.forEach(Y=>clearInterval(Y))},O=new Ot({baseUrl:e,testName:o.name,currentUrl:q.browser.url(),variablesFromEnvironment:g,envName:t});if(!n.connected)throw await $.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");n.emit("session",{url:e,userAgent:Un.USER_AGENT,viewport:q.browser.getViewport(),sessionId:s}),Z.registerSession({controller:q,context:O,sessionId:s,cleanup:_,clientIp:S})}async function so({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 Ft({...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?.[Ve];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:Ot.dummyContext(a.name,d?.name,h),logger:t,flagStore:i,localTools:l});h[g.name]=f})),{localCodeEvalTools:l,baseUrl:m,envName:d?.name,testName:a.name,browserConfig:u,environmentVariables:h,testMetadata:a}}var qp=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 Bl({parentStep:this.step,socket:this.socket,parentTracer:this})}},Bl=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 qp({step:e.step,parentTracer:this,socket:this.socket})}},zl=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 Bl({parentStep:null,parentTracer:null,socket:this.socket})}};var Kp={currentlyExecutingRequests:{}},nM=n=>async(e,t)=>{let{testId:r,orgId:o}=n.metadata,i=await n.flagStoreFactory(o),s=await n.settingsFactory(o,n.logger),a,l=await so({testId:r,orgId:o,logger:n.logger,storage:n.storage,authorization:n.authorization,flagStore:i,settings:s}),c=`${r}|${l.baseUrl}`;try{let d=Kp.currentlyExecutingRequests[c]??0;Kp.currentlyExecutingRequests[c]=d+1,a=await rM({...n,...e,...l,done:t})}finally{n.logger.info({result:a,sessionId:n.metadata.sessionId},"Test execution complete"),Kp.currentlyExecutingRequests[c]--}},rM=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,testName:u,environmentVariables:m,localCodeEvalTools:h,done:g,cacheStorageFactory:f})=>{let{testId:S,sessionId:x,orgId:v}=l,b=x,E=Z.getSession(x);if(!E)throw new Error("No active session found");let{controller:C,context:R}=E;C.setOpen(),c=c.child({testId:S,orgId:v,sessionId:x,runId:b}),c.info({steps:e.map(J=>`${J.type}${"command"in J?` - ${J.command.type}`:""}`),toStep:i,fromStep:s,reInitialize:o,envName:p,testName:u,baseUrl:t,context:R,flags:C.flagStore.getAllFlags()},"Socket execution parameters");let M=m??{},L=async()=>{o&&(await C.browser.reset({newUrl:t}),R.reset({baseUrl:t,currentUrl:C.browser.url(),variablesFromEnvironment:M,envName:p,testName:u}))},$=await f(v),q=async()=>{try{await $.resolveStepCacheEntries({schemaVersion:r.schemaVersion,organizationId:v,testId:S,stepLists:{steps:e},logger:c})}catch(J){c.error({err:J},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}};try{await ds({promiseGenerator:async()=>Promise.all([L(),q()]),signal:C.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),C.setOpen()}catch(J){if(n.emit("finished"),J.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${J}`)}let N=tM(e),_={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},O={orgId:v,runId:b,testMetadata:r,steps:e,fromStep:s,toStep:i},Y={controller:C,context:R,storage:a,debugDataStorage:new Fr,codeEvalTools:h,billingReporter:new Bo,logger:c,analytics:d},B={test:{},step:{onDynamicAIActionStatusUpdateEvent:J=>{n.emit("dynamicCommandStatusUpdate",J)},onDynamicAIActionEvaluatingEvent:J=>{n.emit("dynamicCommandEvaluating",J)},onDynamicCommandGenerated:J=>{n.emit("dynamicCommandGenerated",J)},onDynamicCommandExecuted:J=>{n.emit("dynamicCommandExecuted",J)}}},ie=new zl(n,a,v,S,N),se=await Tl({fixtures:Y,options:_,callbacks:B,inputs:O,testParams:{tracer:ie}});return se?.status==="PASSED"&&await Fa({logger:c,cacheStorage:$,orgId:v,testId:S,originalSteps:{steps:N},updatedSteps:{steps:e}}),await ie.finish(),g?.(se),se.status};var Pw={event:"execute",createHandler:nM};import{cloneDeep as oM}from"lodash-es";var iM=n=>async({command:e},t)=>{let{logger:r,generatorFactory:o,metadata:i}=n,s=oM(e),a=mf(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})}}},Lw={event:"lintStep",createHandler:iM};var sM=({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=_o.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 An?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:Or(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:x}=await p.screenshotWithDimensions({clearHighlights:!0,locator:g}),v=await t.uploadScreenshot(f);h.screenshot={data:v,width:S,height:x},e.info({width:S,height:x},"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...")}}},Ow={event:"locate",createHandler:sM};var aM=({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")}}},Nw={event:"mouseClickEvent",createHandler:aM};var lM=({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})}},Mw={event:"recordTargetClick",createHandler:lM};var cM=({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}}},kw={event:"keyDownEvent",createHandler:cM};var dM=({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}}},_w={event:"keyUpEvent",createHandler:dM};var pM=({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")}}},Dw={event:"mouseMoveEvent",createHandler:pM};var uM=({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}}},Fw={event:"recordingStart",createHandler:uM};var mM=({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}},Uw={event:"recordingStop",createHandler:mM};var hM=({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 so({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()},Bw={event:"refresh",createHandler:hM};var gM=({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,testName:h,environmentVariables:g}=await so({testId:a,orgId:c,logger:t,storage:r,authorization:o,flagStore:d,settings:p}),f=Z.getSession(l);if(!f){n.emit("error",{message:"No session to reset"});return}let{controller:S,context:x}=f;await S.browser.reset({newUrl:u});let v=S.browser.baseUrl;x.reset({baseUrl:v,currentUrl:S.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let b=S.browser.getViewport(),E=Un.USER_AGENT;t.info({baseUrl:u,viewport:b},`Session reset for test ${a} at ${v}`),n.emit("session",{url:v,userAgent:E,viewport:b,sessionId:l})},zw={event:"reset",createHandler:gM};var fM=({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})}},Hw={event:"switchTab",createHandler:fM};async function jw(n){let{socket:e}=n;return e.handshake.query.type==="api-test"?vy(n):Iw(n)}var $w=[Ry,Pw,Ow,zw,Bw,Ty,Hw,Lw,Mw,Fw,Uw,Dw,Nw,kw,_w,xy,dy,Cy,Ey];var Gw=n=>{let{logger:e}=n,t=new SM(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 jw({...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}$w.forEach(i=>yM(i,{socket:r,metadata:o,...n,logger:e}))}),t},yM=(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 IM}from"express";import Zp from"fs";import TM from"path";import Vw,{multistream as bM}from"pino";import wM from"pino-pretty";var Ww=["lastScreenshotBuffer"];var Yp=new Map,vM=!0,Jp=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=vM?Vw(i):Vw(i,bM([{stream:wM({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))Ww.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}},Hl=({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 Yp.has(n)||Yp.set(n,new Jp({bindings:{app:n},hostname:t,clientToken:e||process.env.NEXT_PUBLIC_DD_CLIENT_TOKEN||process.env.DD_CLIENT_TOKEN,disableConsoleLogs:r})),Yp.get(n)};import{hostname as xM}from"os";var We=Hl({app:"desktop-server",clientToken:"pubcfd7516a5c0ba852b42675cd97bee027",hostname:xM(),disableConsoleLogs:!0}),qw=n=>{We.addBinding("version",n)};var EM=new ml(30,60*1e3),tu="https://api.momentic.ai",nu,Xp,Kw=n=>{tu=n},jl=()=>tu,Yw=(n,e)=>{nu=n,Xp?.abort(),Xp=new AbortController;let t=Xp.signal,r=[n.configFilePath];n.config.environments?.forEach(o=>{if(!o.envFile)return;let i=TM.resolve(n.rootDir,o.envFile);try{if(Zp.lstatSync(i).isSymbolicLink())return;Zp.existsSync(i)&&r.push(i)}catch(s){We.warn({err:s},`Failed to check if env file ${i} exists`)}});try{CM({filesToWatch:r,revalidator:e,signal:t,project:n})}catch(o){We.error({err:o},"Failed to start config file watchers")}},re=()=>nu,wi,Qp,eu,Jw=async n=>{if(wi)return wi;let e=new ct({baseUrl:tu,apiKey:n,logger:We});try{let t=await e.getAuthInfo();return wi=t.orgId,Qp=t.userId,eu=n,wi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Bn=()=>{if(!wi)throw new Error("Your organization ID is invalid.");return wi},$l=()=>{if(!Qp)throw new Error("Your user ID is invalid.");return Qp},Xw=()=>{if(!eu)throw new Error("Your API key is invalid.");return eu};function CM({filesToWatch:n,revalidator:e,signal:t,project:r}){n.forEach(o=>{Zp.watch(o,{signal:t,persistent:!1,recursive:!1},(i,s)=>{s&&(EM.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.`),nu=e(r.configFilePath))})})}var Gl=class extends li{constructor(t,r){super(t,r);this.client=t;this.orgId=r}async fetchTestMetadata(t,r,o){let i=re(),a=be(i,o).tests[t];if(a)return qa(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=re();return ms(r,i,Br)}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 ce(n){return function(...e){let t=e[e.length-1],r=n(...e);Promise.resolve(r).catch(t)}}import{Router as RM}from"express";import Zw from"fs";import AM from"path";var Fs=RM();async function ru(n){return(await Va(n,We)).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)}Fs.get("/",ce(async(n,e)=>{let t=re(),r=be(t,y),o=await ru(r);e.status(200).json(o)}));Fs.post("/",ce(async(n,e)=>{let t;try{t=Jh.parse(n.body)}catch(a){e.status(400).json({error:`Invalid request body: ${a}`});return}try{Uo(t.name)}catch(a){e.status(400).json({error:`Invalid module name: ${a}`});return}let r=re(),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=AM.join(r.rootDir,t.folderPath??"");if(!Zw.existsSync(i)||!Zw.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let s=await Kf({...t,folder:i,project:r});e.status(201).json(s)}));Fs.get("/:moduleId",ce(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=be(re(),y),r=t.modules[n.params.moduleId];if(!r){e.status(404).json({error:"Module not found."});return}try{let o=await Rd(r,t,y);e.json(o)}catch(o){e.status(400).json({err:o})}}));Fs.patch("/:moduleId/metadata",ce(async(n,e)=>{if(!n.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Xh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let r=re(),o=be(r,y);qf({moduleId:n.params.moduleId,content:t,momenticFiles:o,logger:y,project:r}),e.status(201).json({message:"ok"})}));var Qw=Fs;var ev=IM();ev.get("/",ce(async(n,e)=>{let t=re(),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 ru(r),l={labels:i,tests:s,modules:a};e.status(200).json(l)}));var tv=ev;import{Router as PM}from"express";var ou=PM();ou.get("/",ce((n,e)=>{let t=Qf(re(),We);e.status(200).json(t)}));ou.get("/names",ce((n,e)=>{let r=re().config.environments?.map(o=>o.name)??[];e.status(200).json(r)}));var nv=ou;import{Router as LM}from"express";import ft from"fs";import it from"path";var Bs=LM();function Us(n){let e=re(),t=it.dirname(e.configFilePath);return it.join(t,...n)}function OM(n){let e=re(),t=it.dirname(e.configFilePath),r=it.relative(t,n);return r?r.split(it.sep):[]}function NM(n,e){let t=ft.statSync(n),r=OM(n);return dd.parse({name:e,absolutePath:n,relativePath:r.join(it.sep),pathSegments:r,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Bs.post("/",ce(async(n,e,t)=>{let r;try{r=eg.parse(n.body).pathSegments}catch(l){e.status(400).json({error:`Failed to parse folder read body: ${l}`});return}let o=Us(r);if(!ft.existsSync(o)){e.status(404).json({error:`Path not found: ${r.join(it.sep)}`});return}if(!ft.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${r.join(it.sep)}`});return}let s=ft.readdirSync(o).map(l=>{let c=it.join(o,l);return NM(c,l)}),a={absolutePath:o,pathSegments:r,contents:s};e.status(200).json(a)}));Bs.put("/",ce(async(n,e,t)=>{let r;try{r=tg.parse(n.body).pathSegments}catch(s){e.status(400).json({error:`Failed to parse folder create body: ${s}`});return}let o=Us(r);if(ft.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${r.join(it.sep)}`,pathSegments:r});return}ft.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${r.join(it.sep)}`,pathSegments:r};e.status(201).json(i)}));Bs.patch("/",ce(async(n,e,t)=>{let r,o;try{let c=ng.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=Us(r),s=Us(o);if(!ft.existsSync(i)){e.status(400).json({error:`Folder not found: ${r.join(it.sep)}`});return}if(ft.existsSync(s)){e.status(400).json({error:`Destination already exists: ${o.join(it.sep)}`});return}let a=it.dirname(s);ft.existsSync(a)||ft.mkdirSync(a,{recursive:!0}),ft.renameSync(i,s);let l={success:!0,message:`Folder moved from ${r.join(it.sep)} to ${o.join(it.sep)}`,pathSegments:o};e.status(200).json(l)}));Bs.delete("/",ce(async(n,e,t)=>{let r,o=!0;try{let l=rg.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=Us(r);if(!ft.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${r.join(it.sep)}`,pathSegments:r});return}if(!ft.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${r.join(it.sep)}`});return}if(o)ft.rmSync(i,{recursive:!0,force:!0});else{if(ft.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${r.join("/")}`});return}ft.rmdirSync(i)}let a={success:!0,message:`Folder deleted: ${r.join("/")}`,pathSegments:r};e.status(200).json(a)}));var rv=Bs;import{Router as MM}from"express";var ov=MM();ov.get("/",ce((n,e)=>{e.status(200).json({userId:$l(),orgId:Bn()})}));var iv=ov;import{Router as kM}from"express";var sv=kM();sv.get("/",ce((n,e)=>{let t=re(),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 av=sv;import{Router as _M}from"express";var Wl=_M();Wl.get("/",ce((n,e)=>{let t=ep().map(r=>({name:r.config.name,configFilePath:r.configFilePath}));e.status(200).json(t)}));Wl.get("/current",ce((n,e)=>{let t=re(),r={name:t.config.name,configFilePath:t.configFilePath};e.status(200).json(r)}));Wl.post("/set",ce((n,e)=>{let t;try{t=Qh.parse(n.body)}catch(r){e.status(400).json({error:`Invalid request body: ${r}`});return}try{let r=$t({configFilePath:t.configFilePath});Yw(r,o=>$t({configFilePath:o}))}catch(r){e.status(400).json({error:`Error setting project: ${r}`});return}e.sendStatus(204)}));var lv=Wl;import{Router as DM}from"express";var cv=DM();cv.get("/",ce((n,e)=>{let r={ai:re().config.ai};e.status(200).json(r)}));var dv=cv;import{Router as BM}from"express";import pv from"fs";import ao from"path";import{v4 as uv}from"uuid";import zM from"yaml";import{randomUUID as FM}from"node:crypto";import{PostHog as UM}from"posthog-node";var vi=class{identify(){return this}child(){return this}track(){return this}async shutdown(){}},xi=class n{bindings;client;options;constructor(e,t={}){this.bindings=e,this.options=t,this.client=new UM("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(!Eh(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:FM(),event:r,timestamp:t?.timestamp,properties:{...this.bindings,...o}}),this}};var Ti=new xi({platform:"local_app"},{flushAt:1,flushInterval:0});var Tr=BM();Tr.get("/",ce((n,e)=>{let t=re(),r=be(t,y),o=Object.values(r.tests);e.status(200).json(o)}));Tr.post("/",ce(async(n,e)=>{let t;try{t=Kh.parse(n.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}try{Uo(t.name)}catch(p){e.status(400).json({error:p.message});return}let o={id:uv(),name:t.name,description:t.description,baseUrl:t.baseUrl,schemaVersion:De,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=re(),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=ao.join(i.rootDir,...t.pathSegments||[]),c=await Jf({test:o,name:t.name,folder:l}),d={...o,relativeFilePath:ao.relative(i.rootDir,c)};Ti.track({type:"test_editor:test_create"}),e.status(201).json(d)}));Tr.get("/:testPath",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r=re(),o=be(r,y),i;try{i=await us(ao.join(r.rootDir,t),We,o),e.status(200).json(i)}catch(s){e.status(400).send({error:s.message});return}(async()=>{try{let{stepsToSave:s,moduleUpdates:a}=await Dt({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});a.forEach(l=>{Yr({content:l,schemaVersion:De,momenticFiles:o,project:r})}),Vn({relativeTestPath:t,steps:s,schemaVersion:De,project:r})}catch(s){We.error({err:s},"Failed to save migrated test to disk after initial fetch")}})()}));Tr.patch("/:testPath/metadata",ce(async(n,e)=>{if(!n.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let t;try{t=qh.parse(n.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:Ad(n.params.testPath,t,re()).newRelativeTestPath};e.status(200).json(o)}));Tr.patch("/:testPath",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Vh.parse(n.body)}catch(m){e.status(400).json({error:`Invalid request body: ${m}`});return}let o=re(),i=be(o,y),s;try{s=qa(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 Dt({stepLists:r.stepLists,cacheCreationParams:{testId:s.id,orgId:Bn()}}),d=new ct({apiKey:Xw(),baseUrl:jl(),logger:We}),p=await si(We,d,o);await ui({orgId:Bn(),client:d,gitMetadata:p}).saveStepCacheEntries({logger:We,testId:s.id,entries:c}),l.forEach(m=>{Yr({content:m,schemaVersion:r.schemaVersion,momenticFiles:i,project:o})}),Vn({relativeTestPath:t,steps:a,schemaVersion:r.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Tr.patch("/:testPath/environments",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Zh.parse(n.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}Ad(t,{envs:r.defaultEnv?[{name:r.defaultEnv,default:!0}]:[]},re()),e.status(201).json({message:"ok"})}));Tr.post("/:testPath/duplicate",ce(async(n,e)=>{let{testPath:t}=n.params;if(!t){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=Yh.parse(n.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Uo(r.name)}catch(f){e.status(400).json({error:f.message});return}let o=re(),i=ao.join(o.rootDir,t);if(!pv.existsSync(i)){e.status(404).json({error:"Test not found."});return}let s=be(o,y),a;try{a=await us(i,We,s)}catch(f){e.status(400).send({error:f.message});return}let l=uv(),c=tn.parse({...a,name:r.name,id:l}),{stepsToSave:d}=await Dt({stepLists:{steps:a.steps,beforeSteps:a.beforeSteps,afterSteps:a.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:l,orgId:Bn()}}),p=Gn({fileType:Ie.TEST,...c,beforeSteps:d.beforeSteps??void 0,steps:d.steps,afterSteps:d.afterSteps??void 0}),u=ao.dirname(i),m=ao.join(u,`${r.name}.${_t.TEST}`),h=zM.stringify(p);pv.writeFileSync(m,h,"utf-8");let g={relativeFilePath:ao.relative(o.rootDir,m)};Ti.track({type:"test_editor:test_create"}),e.status(201).json(g)}));var mv=Tr;var zs=class{async prepareGoldenScreenshotForComparison(e,t,r){return await new oi(re(),!1).prepareGoldenScreenshotForComparison(e,t,r)}};async function Sv(n){let{momenticServerUrl:e,apiKey:t,serverPort:r,staticDir:o,devicePixelRatio:i,version:s,logger:a=We,alwaysSaveCache:l,noCache:c}=n;qw(s),e&&Kw(e),await Jw(t);let d=Bn(),p=$l();Ti.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=qM(o,r,a),m=`http://localhost:${r}`;y.info(`Desktop server is running at ${m}`),await new Promise(E=>{try{u.listen(r,()=>{a.info(`Desktop server is running at ${m}`),E()})}catch(C){C.message.includes("EADDRINUSE")?yv(r):y.error(`An unexpected error occurred while starting the server: ${C.message}`),process.exit(1)}});let g={type:"API_KEY",baseUrl:jl(),apiKey:t,logger:a},f=async()=>{let E=re();return new di(E.config.ai?.agentConfig,g)},S=async()=>new pi(g,await f()),x=new ct(g),v=new Gl(x,Bn()),b=new zs;Gw({baseServer:u,getOrgId:async()=>Bn(),generatorFactory:f,enricherFactory:S,cacheStorageFactory:async E=>{let C=re(),R=await si(a,x,C);return ui({orgId:E,client:x,gitMetadata:R,alwaysSaveCache:l,noCache:c})},flagStoreFactory:async E=>{let C=re();return new ii(C.config)},settingsFactory:async()=>{let E=re();return{ai:{},browser:{},...E.config}},storage:v,logger:a,devicePixelRatio:i,authorization:g,visualDiffScreenshotStorage:b,analytics:Ti})}var fv="25mb";function qM(n,e,t){let r=gv();r.use(HM()),r.use(hv.json({limit:fv})),r.use(hv.urlencoded({extended:!1,limit:fv}));let o=GM();if(o.use("/tests",mv),o.use("/modules",Qw),o.use("/environments",nv),o.use("/projects",lv),o.use("/labels",av),o.use("/folders",rv),o.use("/settings",dv),o.use("/identify",iv),o.use("/entities",tv),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=gv.static(n,{setHeaders:a=>{a.setHeader("Cache-Control","no-cache")},redirect:!1});r.use(s),r.use("*",(a,l)=>{l.sendFile(VM.join(n,"index.html"))})}let i=WM.createServer(r);return i.once("error",s=>{"code"in s&&s.code==="EADDRINUSE"?(yv(e),process.exit(1)):console.error("An unexpected server error occurred:",s.message)}),i}$M.setMaxListeners(50);process.on("warning",n=>{We.warn({err:n},`Node warning received on desktop-server: ${n.message}`)});process.on("uncaughtException",n=>{We.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)=>{We.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 yv(n){y.error(jM`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
|
|
3819
|
+
`)}import l_ from"events";import uc from"fs";import c_ from"open";import pc from"path";import{fileURLToPath as d_}from"url";import uk from"diff-lines";import{gt as mk}from"semver";import{execSync as KM}from"child_process";import{platform as YM}from"os";function iu(){return bv()?(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 bv(){return YM()==="darwin"&&KM("system_profiler SPDisplaysDataType").toString().includes("Retina")}function su(n){bv()&&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 JM from"@actions/exec";import XM from"@actions/io";import ZM from"quote";import QM from"string-argv";async function wv(n,e=!0){let t=QM(n),r=await XM.which(t[0],!0),o=t.slice(1),i=JM.exec(ZM(r),o,{delay:100});if(e)return i}import{existsSync as ek,statSync as tk}from"fs";var Ei=!!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 vv(n){try{return ek(n)&&tk(n).isDirectory()}catch(e){return y.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import nk from"csv-parser";import{createReadStream as rk}from"fs";function au(n){return new Promise((e,t)=>{let r=[];rk(n).pipe(nk()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Vl from"semver";import{z as ql}from"zod";var vn="2.5.1",ok="https://registry.npmjs.org/momentic",ik=ql.object({versions:ql.record(ql.string(),ql.unknown()).optional()});async function xv(n){try{await sk(n)}catch(e){y.warn({err:e},"Failed to check CLI version against NPM servers")}}async function sk(n){if(!vn){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 F(fetch(ok),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=ik.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))Vl.valid(r)&&(!t||Vl.gt(r,t))&&Vl.gt(r,vn)&&Vl.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(y.warn(`Update available: v${vn} -> 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 lk,mkdirSync as ck,statSync as dk}from"fs";import{dirname as pk}from"path";import Ev from"readline/promises";import{hostname as ak}from"os";var Q=Hl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:ak(),disableConsoleLogs:!0}).child({version:"2.5.1"});var lu=!1,Cv=(()=>{try{return dk("/.dockerenv"),!0}catch{return!1}})();async function St(n,e){if(Ei||lu||Cv)return!0;Q.flush(),await new Promise(s=>setTimeout(s,500));let t=Ev.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"?(lu=!0,setTimeout(()=>{lu=!1},3e3),!0):i.toLowerCase()==="y"}async function cu(n){let e=pk(n);return vv(e)?lk(n)?St(`File '${Tv(n)}' already exists. Overwrite existing content?`,!0):!0:await St(`Directory '${Tv(e)}' doesn't exist. Create it now?`,!0)?(ck(e,{recursive:!0}),!0):!1}function Tv(n){return n.replace(/(\s+)/g,"\\$1")}async function Rv(n,e){if(Ei||Cv)return e;let t=Ev.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function Av({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){mk(e.schemaVersion,De)&&(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)),rf(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 St("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 St("The test patch you are applying was created before the test was last updated. Are you sure you want to continue?",!0)&&process.exit(1);let l=Xr(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let d,p;if(e.schemaVersion!==De){let{steps:g,newVersion:f}=await ls({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 Dt({stepLists:{steps:p}});u.beforeSteps=l.beforeSteps??void 0,u.afterSteps=l.afterSteps??void 0;let h=uk(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 St("Do you want to apply this patch?")&&(y.dimmed("Cancelled."),process.exit(1)),Vn({relativeTestPath:n.relativePath,steps:u,schemaVersion:d??e.schemaVersion,project:t.project}),y.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as po}from"crypto";import{z as Wv}from"zod";var Wt=" ".repeat(6);import Gv from"chalk";import{Argument as lo,Option as Ne}from"@commander-js/extra-typings";import{validateHeaderValue as hk}from"http";import{cpus as Iv}from"os";import{parse as zme}from"yaml";import{z as V}from"zod";var Kl=58888,du=30*60*1e3,Xn=new Ne("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),Zn=new Ne("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),co=new Ne("-y, --yes","Skip all confirmation prompts.").env("CI"),pu=new Ne("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),uu=new Ne("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${du/1e3} seconds.`),Yl=new Ne("--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."),Lv=new Ne("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(Qi)),Ov=new Ne("--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."),mu=new Ne("--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."),Nv=new Ne("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),hu=new Ne("--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."),gu=new Ne("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),fu=new Ne("--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."),Mv=new Ne("--port <port>",`Port to run the app on. Defaults to ${Kl}.`),Su=new Ne("--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."),Jl=new Ne("--env <env>","Name of the environment to use when running tests."),Xl=new Ne("--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."),kv=new Ne("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),xn=new Ne("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),Zl=new Ne("-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."),_v=new Ne("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),Dv=new Ne("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),yu=new Ne("--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"),bu=new Ne("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),Fv=new lo("<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'.`),
|
|
3823
|
+
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic pull hello-world'.`),Uv=new lo("<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(),
|
|
3825
|
+
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic import hello-world'.`).argOptional(),wu=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(),Bv=new lo("<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'.`),
|
|
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'.`),Gme=new lo("<envs...>","One or more environment names to push").argOptional(),zv=new lo("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired(),Hv=new lo("<results>","Path to the results archive.").argRequired(),Pv=V.object({apiKey:V.preprocess(n=>n!==void 0?n:process.env.MOMENTIC_API_KEY,V.string()),server:V.string().default("https://api.momentic.ai"),config:V.string().optional(),filter:V.string().optional(),yes:V.boolean().optional(),fix:V.boolean().optional(),pixelRatio:V.coerce.number().optional(),port:V.coerce.number().default(Kl).optional(),wait:V.preprocess(n=>!!n,V.boolean()).optional(),waitTimeout:V.coerce.number().optional(),start:V.string().optional(),waitOn:V.string().optional(),waitOnTimeout:V.coerce.number().default(60).optional(),customHeaders:V.string().array().optional(),env:V.string().optional(),urlOverride:V.string().url().optional(),all:V.boolean().optional(),parallel:V.coerce.number().optional(),retries:V.coerce.number().optional(),shardIndex:V.coerce.number().optional(),shardCount:V.coerce.number().optional(),inputCsv:V.string().optional(),updateGoldenFiles:V.boolean().optional().default(!1),tests:V.array(V.string()).optional(),suites:V.array(V.string()).optional(),paths:V.array(V.string()).optional(),envs:V.array(V.string()).optional(),include:V.array(V.string()).optional(),exclude:V.array(V.string()).optional(),labels:V.array(V.string()).optional(),reporter:V.nativeEnum(Qi).optional(),reporterDir:V.string().optional(),outputDir:V.string().optional(),uploadResults:V.boolean().optional(),saveCache:V.boolean().optional(),disableCache:V.boolean().optional()}),cn=async n=>{let e={},t;try{let r=Object.assign(e,Pv.partial().parse(n));t=Pv.parse(r)}catch(r){y.error(`Error parsing command line arguments: ${r.message}`),process.exit(1)}try{gk(t)}catch(r){y.error(`Invalid command line arguments: ${r.message}`),process.exit(1)}return t};var gk=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]=V.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{V.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}`);Iv().length<t*2&&y.warn(`You requested to run tests in parallel ${t} at a time on a machine with ${Iv().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`);break;default:break}};function Ql(n){if(n===void 0)return;let e={};for(let t of n){let r=t.indexOf("=");if(r===-1)throw new Error(`Header value pair does not contain '=': ${t}`);let o=t.slice(0,r),i=t.slice(r+1);hk(o,i),e[o]=i}return e}async function vu(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 jv}from"console";import{format as Hs}from"util";var xu=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}},ec=class n extends jv{_buffer=[];_groupDepth=0;Console=jv;constructor(){super({write:e=>(n.write(this._buffer,"log",e),!0)})}static write(e,t,r,o=2){let i=new xu(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:
|
|
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",Hs(e,...t))}error(e,...t){this._log("error",Hs(e,...t))}info(e,...t){this._log("info",Hs(e,...t))}log(e,...t){this._log("log",Hs(e,...t))}warn(e,...t){this._log("warn",Hs(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function $v(n){let e=globalThis.console,t=new ec;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
|
|
3832
|
-
${[...
|
|
3831
|
+
`),globalThis.console=e}}var Sk=5;async function tc({getResults:n,checkDone:e,name:t,timeoutMs:r=du}){let o=Date.now(),i=0;for(;Date.now()-o<r;){let s;i>Sk&&(y.error(`Failed to fetch ${t} status too many times.`),process.exit(1));try{s=await n(),i=0}catch(c){i++,Q.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 Ci({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 $v(()=>{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 nc=(n,e)=>{if(!n.failureDetails||!n.failureReason)return;let t=ca[n.failureDetails?.classification?.reason||n.failureReason],r=n.failureDetails?.classification?.summary||Oo[n.failureReason];y.error(e),y.log(`${Wt}Reason: ${Gv.red(t)}`),y.log(`${Wt}Description: ${Gv.red(r)}`)};async function Tu({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=Xr(u.fullFilePath,Q,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=xt.parse(m),f=await Wr(g,h,y),S=!1,x=!1;f.steps=f.steps.map((v,b)=>{v.id||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) does not have an ID`),x=!0,n&&(S=!0,v.id=po())),Wv.string().uuid().safeParse(v.id)||(y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has an ID that does not parse as a UUID: '${v.id}'`),x=!0,n&&(S=!0,v.id=po()));let E=o[v.id]?.testId,C=o[v.id]?.testRelativePath;if(E?(d++,x=!0,E===u.id?y.error(`Multiple steps in the test '${u.name}' (${u.relativePath}) have the same ID '${v.id}'`):y.error(`Step ${b} in test '${u.name}' (${u.relativePath}) has the ID ${v.id} which is duplicated in ${C}`),n&&(S=!0,v.id=po())):o[v.id]={testId:u.id,testRelativePath:u.relativePath},v.type==="PRESET_ACTION"){let R=v.command.id,M=s[R]?.testId,L=s[R]?.testRelativePath;M?(d++,x=!0,M===u.id?y.error(`Multiple commands in the test '${u.name}' (${u.relativePath}) have the same ID '${R}'`):y.error(`Command ${b} in test '${u.name}' (${u.relativePath}) has the ID ${R} which is duplicated in test ${L}`),n&&(S=!0,v.command.id=po())):s[R]={testId:u.id,testRelativePath:u.relativePath}}return ve.parse(v)}),x&&y.dimmed("=".repeat(80)),S&&n&&(Vn({relativeTestPath:u.relativePath,steps:{beforeSteps:m.beforeSteps,steps:f.steps,afterSteps:m.afterSteps},schemaVersion:De,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=Wn(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,x=!1,v=g.map((b,E)=>{if(Wv.string().uuid().safeParse(b.id)||(y.error(`Step ${E} in module '${u.name}' (${u.relativePath}) has an ID that does not parse as a UUID: '${b.id}'`),x=!0,n&&(S=!0,b.id=po())),o[b.id]?.testId){let R=o[b.id]?.testRelativePath;d++,x=!0,y.error(`Step ${E} in module '${u.name}' (${u.relativePath}) has the ID ${b.id} which is duplicated in test ${R}`),n&&(S=!0,b.id=po())}if(b.type==="PRESET_ACTION"){let R=b.command.id,M=s[R],L=l[R];M||L?(d++,x=!0,L?.moduleId===u.id?y.error(`Multiple commands in module '${u.name}' (${u.relativePath}) have the same ID '${R}'`):M?y.error(`Command in module '${u.name}' (${u.relativePath}) has the ID ${R} which is duplicated in test ${M.testRelativePath}`):y.error(`Command ${E} in module '${u.name}' (${u.relativePath}) has the ID ${R} which is duplicated in module ${L.moduleRelativePath}`),n&&(S=!0,b.command.id=po())):l[R]={moduleId:u.id,moduleRelativePath:u.relativePath}}return ve.parse(b)});x&&y.dimmed("=".repeat(80)),S&&n&&(Yr({content:{...m,steps:v},schemaVersion:f,momenticFiles:t,project:e,forceSaveOnNoDiffs:!0}),c.add(u.fullFilePath))}catch(m){y.error({err:m},`Failed to parse module ${u.name} (${u.relativePath})`);continue}return{errors:d,modifiedTestFilePaths:a,modifiedModuleFilePaths:c}}async function Vv({fix:n,project:e}){let{errors:t,modifiedTestFilePaths:r,modifiedModuleFilePaths:o}=await Tu({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=>`${
|
|
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
|
|
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
|
-
${
|
|
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 qv({project:n}){let e=be(n,y),t=Object.values(e.tests),r=await Va(e,Q),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 yk}from"lodash-es";async function Kv({client:n,skipPrompts:e,project:t}){let r=await n.getAllEnvironments(),o=yk(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 St(`Environment ${i.name} already exists in the project configuration file. Would you like to overwrite its variables?`)&&process.exit(1),s.baseUrl=i.variables[Ve],delete i.variables[Ve],s.envVariables=i.variables;else{let a=i.variables[Ve];delete i.variables[Ve],o.environments.push({name:i.name,baseUrl:a,envVariables:i.variables})}}ni(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 Yv}from"crypto";import Jv from"fs";async function Eu({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=Xv(l,Ie.TEST);!r&&!await cu(d)||(s+=1,Jv.writeFileSync(d,c,"utf-8"),Q.info({checksum:Yv("md5").update(c).digest("hex")},`Wrote '${d}'`))}let a=0;for(let[l,c]of Object.entries(i)){let d=Xv(l,Ie.MODULE);!r&&!await cu(d)||(a+=1,Jv.writeFileSync(d,c,"utf-8"),Q.info({checksum:Yv("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 Xv(n,e){switch(e){case Ie.TEST:return`${Me(n)}.${_t.TEST}`;case Ie.MODULE:return`${Me(n)}.${_t.MODULE}`;default:throw new Error(`Unknown entity type ${e}`)}}async function Zv(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 St("Are you sure you want to proceed?",!0)||(y.info("Aborting..."),process.exit(1)),await Kv({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 Eu({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 Qv(n){let{client:e,skipPrompts:t,paths:r}=n;await Eu({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 bk from"fs";import{tmpdir as wk}from"os";import vk from"path";import{registry as js}from"playwright-core/lib/server";import ex from"proper-lockfile";var tx=vk.join(wk(),"momenticBrowserInstallation");var Cu=["chrome","chromium","chrome-for-testing"],xk={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},nx={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell"};function rx(n){let e=nx[xk[n]??""]??"",t=js.findExecutable(e);return!t||t.installType==="none"?!1:Ru(t)}function Ru(n){let e=n.executablePath();return bk.existsSync(e)}function Tk(n,e){let t=nx[n];if(!t)throw new Error(`Requested install of unknown browser type ${n}`);let r=js.findExecutable(t);if(!r||r.installType==="none")throw new Error(`Requested install of unknown browser type ${n}`);if(!(!e&&Ru(r)))return r}async function Ek({browser:n,force:e}){let t=Tk(n,e);if(!t){y.info(`Browser '${n}' is already installed, skipping...`);return}y.info(`Installing browser '${n}'...`);try{await js.installDeps([t],!1),await js.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=js.findExecutable(n),i=5*60*1e3,s=Date.now();for(;Date.now()-s<i&&!Ru(o);)y.info("Waiting for browser to finish installing..."),await new Promise(a=>setTimeout(a,5e3))}else throw r}}async function ox({rawBrowsers:n,force:e=!1,all:t=!1}){let r=t?Cu:Array.from(new Set(n));try{await ex.lock(tx,{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 Ek({browser:o,force:e})}catch(i){y.error(`Failed to install the ${o} browser: ${i}`)}}finally{await ex.unlock(tx,{realpath:!1})}}async function ix(n){let e=be(n,y),t=Object.values(e.tests);for(let r of t)try{let o=Xr(r.fullFilePath,y,e),i=o.steps;if(!i||i.length===0||!Array.isArray(i)){y.debug(`Test ${r.name} (${r.relativePath}) has no steps, skipping...`);continue}let s=xt.parse(o),a=await Wr(s,i,y);y.dimmed(`Updating ${r.relativePath}`),Vn({relativeTestPath:r.relativePath,steps:{beforeSteps:o.beforeSteps,steps:a.steps,afterSteps:o.afterSteps},schemaVersion:De,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=Wn(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 Wr({id:o.moduleId,schemaVersion:o.schemaVersion},i,y);Yr({content:{...o,steps:s.steps},schemaVersion:De,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 Rk}from"child_process";import{PostHog as Ck}from"posthog-node";async function sx(n,e){let t,r=0,o=3,i,s;for(;r<o;)try{let a=await F(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 rc=class n extends is{constructor(t,r,o,i){super(o,i);this.client=t;this.orgId=r}static async init(t){let r=new Ck("phc_WRWd8LYIv6rolgDsyCdrPpxtZhsu6qXAkEwPicl44bI",{host:"https://us.i.posthog.com"}),{flags:o,payloads:i}=await sx(r,t);return new n(r,t,o,i)}async refresh(){let{flags:t,payloads:r}=await sx(this.client,this.orgId);this.flags=t,this.payloads=r}};function Ak(){try{let e=Rk("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 ax({project:n,orgId:e,apiClient:t}){y.info("Pulling browser and AI configuration options from Cloud");let r=await rc.init(e);n.config.browser={autoExpandIframes:r.isBooleanFlagEnabled("auto_expand_iframes"),disableSecondaryCacheResolution:r.isBooleanFlagEnabled("disable_secondary_cache_resolution"),globalLocatorRedirect:r.isBooleanFlagEnabled("global_locator_redirect"),visualActions:r.isBooleanFlagEnabled("visual_actions"),...n.config.browser},n.config.advanced={fakerConstantSeed:r.isBooleanFlagEnabled("faker_constant_seed"),...n.config.advanced},n.config.ai={aiPageFiltering:r.isBooleanFlagEnabled("rag_v2"),agentConfig:await t.getAgentConfig(),...n.config.ai},y.info(`Updated ${n.configFilePath} to include V2 browser and AI configuration options`),y.info("Determining main Git branch"),n.config.gitMainBranch=Ak(),ni(n.config,n.configFilePath),y.success("Migration complete!")}function lx(n){return n?Me(n):"Unknown suite"}async function cx({client:n,orgId:e,suitePaths:t,wait:r,waitTimeout:o,...i}){let{suiteRunIds:s,runGroupIds:a}=await n.queueSuiteRuns({paths:t,...i});Q.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(x=>x.status==="FAILED"&&(x.failureReason||x.finishedAt&&Date.now()-x.finishedAt.getTime()>30*1e3)||x.status==="PASSED"||x.status==="CANCELLED"),u=await tc({name:"suites",getResults:async()=>{let f=a.filter(v=>!d.some(b=>b.id===v)),S=await n.bulkGetRunGroupStatus(f),x=[];for(let v of S)p(v)?d.push(v):x.push(v);return[...d,...x]},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} ${lx(S.suite?.name)}`)))}),f.every(p))}),m=n.getAppUrl(),g=Ci({results:u,startTime:l,onFailed:f=>{let S=lx(f.suite?.name),x=f.runs.filter(b=>b.status==="FAILED").length,v=f.runs.length;y.error(`${S} (${x}/${v} tests failed):`);for(let b of f.runs)if(b.status==="FAILED"){let E=b.testName||b.test?.name;y.error(` ${E?Me(E):"Unknown test"} (${m}/runs/${b.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?Me(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function dx({tests:n,client:e,orgId:t,...r}){!r.yes&&!await St(`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(Q.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 tc({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} ${Me(g)}`)}}),m.every(l))}),u=Ci({results:p,startTime:d,onFailed:m=>{let h=m.testName||m.test?.name;nc(m,h?Me(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?Me(h):"Unknown test"}`;return m.id&&(g+=` (${c}/runs/${m.id})`),g},entity:"test"});process.exit(u.failed>0?1:0)}import Ii,{supportsColor as e_}from"chalk";import t_ from"fs";import{existsSync as zk,mkdirSync as Hk,statSync as jk}from"fs";import{randomUUID as Au}from"crypto";import oc from"fs";import{hostname as Ik}from"os";import $s from"path";async function ic(n,e,t,r,o){if(r){let i=$s.extname(r),s=`${Au()}-screenshot${i}`,a=$s.join(t,s),c=await(await fetch(r)).arrayBuffer();return oc.writeFileSync(a,Buffer.from(c)),s}if(o){let i=await e.getScreenshot(n,o);if(i){let s=`${o}-screenshot.jpeg`,a=$s.join(t,s);return oc.writeFileSync(a,i),s}}}async function Pk(n,e,t,r){let o=r.runId??Au(),i={uuid:o,historyId:o,testCaseId:r.test.id,fullName:r.test.name,name:Me(r.test.name),status:r.status==="PASSED"?"passed":r.status==="CANCELLED"?"skipped":"failed",start:r.lastAttemptStartedAt.getTime(),stop:r.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:t.suiteName},{name:"host",value:Ik()},{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 Lk(n,e,t.folder,i.steps,r.results);let s=`${o}-result.json`;oc.writeFileSync($s.join(t.folder,s),JSON.stringify(i,void 0,2))}async function Ri(n,e,t,r){let o={name:mn(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 ic(n,e,t,r.beforeScreenshot,r.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let s=await ic(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=`${Au()}-attachment.json`,l=$s.join(t,a);oc.writeFileSync(l,JSON.stringify(r.data,null,2)),o.attachments.push({name:"Step output data",source:a,type:"text/plain"})}return o}async function Lk(n,e,t,r,o){for(let i of o)switch(i.type){case"PRESET_ACTION":{r.push(await Ri(n,e,t,i));break}case"CONDITIONAL":{let s=await Ri(n,e,t,i);s.steps=[],i.assertion&&s.steps.push(await Ri(n,e,t,i.assertion)),s.steps.push(...await Promise.all(i.results.map(a=>Ri(n,e,t,a)))),r.push(s);break}case"AI_ACTION":case"IFRAME":case"SECTION":case"MODULE":{let s=await Ri(n,e,t,i);if(s.steps=await Promise.all(i.results.map(a=>Ri(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 px(n,e,t,r){for(let o of r.runs)await Pk(n,e,{folder:t,suiteName:r.suiteName},o)}import ux from"junit-report-builder";import Iu from"path";function Ok(n,e){let t=e??ux.testCase();if(t.name(n.test.name).className(n.test.name).file(Iu.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=ca[n.failureDetails?.classification?.reason||n.failureReason],o=n.failureDetails?.classification?.summary||Oo[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 Nk(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();Ok(l,c)}for(let l of s){let c=a.testCase();c.name(l.name).className(l.name).file(Iu.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 mx(n,e){let t=ux.newBuilder();Nk(t,e),t.writeTo(Iu.join(n,`${e.suiteName}.xml`))}import Mk from"fs";import kk from"path";function hx(n){return{title:mn(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(hx):[]}}async function _k(n,e,t,r){if(r.results?.length){let o=await ic(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 Dk(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||Oo[r.failureReason]}:void 0,retry:r.attempts-1,steps:r.results?.map(hx)||[],startTime:r.lastAttemptStartedAt.toISOString(),attachments:await _k(n,e,t,r)}}async function Fk(n,e,t,r){return{expectedStatus:"passed",status:r.status==="PASSED"?"expected":"unexpected",results:[await Dk(n,e,t,r)]}}async function Uk(n,e,t,r){return{tags:[],title:r.test.name,ok:r.status==="PASSED",tests:[await Fk(n,e,t,r)],id:r.runId,file:r.filePath}}function Pu(n,e){return n.reduce((t,r)=>e(r)?t+1:t,0)}async function Bk(n,e,t,r){return{suites:[{title:r.suiteName,file:r.projectConfigPath,specs:await Promise.all(r.runs.map(o=>Uk(n,e,t,o)))}],errors:[],stats:{startTime:r.startedAt.toISOString(),duration:r.finishedAt.getTime()-r.startedAt.getTime(),expected:Pu(r.runs,o=>o.status==="PASSED"),unexpected:Pu(r.runs,o=>o.status!=="PASSED"),flaky:Pu(r.runs,o=>!!o.isFlake),skipped:0}}}async function gx(n,e,t,r){let o=await Bk(n,e,t,r);Mk.writeFileSync(kk.join(t,`${r.suiteName}.json`),JSON.stringify(o,null,2))}async function fx(n,e,t,r,o){switch(zk(o)?jk(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...`),Hk(o,{recursive:!0})),t){case"junit":mx(o,r);return;case"allure":case"allure-json":await px(n,e,o,r);return;case"playwright-json":await gx(n,e,o,r);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import n_ from"wait-on";import Lu from"fs";import{compact as $k}from"lodash-es";import Ou from"path";import{cwd as Gk}from"process";import Wk from"semver";async function sc({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=>Lu.existsSync(u)),p=Gk();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
|
-
`),
|
|
3840
|
-
${
|
|
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."),
|
|
3839
|
+
`),n.forEach(u=>{if(!Lu.existsSync(u))throw new Error(`Path '${u}' does not exist.`);let m,h;try{m=Lu.statSync(u),h=m.isDirectory()}catch(f){a.warn({err:f},`Skipping path ${u} because it cannot be read`);return}let g=Ou.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 St("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=Ou.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 us(d,Q,e);if(Wk.gt(p.schemaVersion,De)&&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:Ou.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($k)}import{cloneDeep as Ai}from"lodash-es";async function Sx({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 yx({baseUrl:n,envName:e,testName:t,devicePixelRatio:r,apiClient:o,test:i,storageClient:s,codeEvalTools:a,generator:l,orgId:c,variables:d,logger:p,customHeaders:u,testInputs:m,localBrowserConfig:h,visualDiffScreenshotStorage:g,flagStore:f}){let S=await El({settings:h,customHeaders:u,envVariables:d,envName:e,testName:t,baseUrl:n,logger:p,localTools:a,orgId:c,flagStore:f}),x={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:Q},v=f.isBooleanFlagEnabled("icon_knowledge_base")?await s.fetchIconKnowledgeBase(c,p):null,b=S.browserType??"Chromium";if(!rx(b)){let M=`Browser ${b} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browser' before running tests. Attempting to continue...`;y.warn(M),Q.warn(M)}let E=await Un.init({baseUrl:n,logger:p,userBrowserSettings:S,storage:s,flagStore:f,enricher:new pi(x,l),contextArgs:{viewport:i.advanced.viewport??Jt,locale:i.advanced.locale??No,geolocation:i.advanced.geolocation??ko,timezoneId:i.advanced.timezone??Mo,colorScheme:i.advanced.colorScheme,deviceScaleFactor:r},iconKnowledgeBase:v}),C=new bi({browser:E,generator:l,logger:p,orgId:c,options:{scratchPadId:void 0,slowMoMs:S.slowMoMs,autoFollowNewTabs:S.autoFollowNewTabs},storage:s,flagStore:f,localCodeEvalTools:a,visualDiffScreenshotStorage:g,analytics:new vi}),R=new Ot({baseUrl:n,currentUrl:C.browser.url(),variablesFromEnvironment:d,envName:e,testName:t});return i.parameters&&await Promise.all(i.parameters.map(async M=>{let{name:L,defaultValue:$,required:q}=M,N=m?.[L];q&&N===void 0&&(y.error(`Required parameter '${L}' is required by test '${i.name}' but not provided`),process.exit(1));let _=await Gt({orgId:c,s:N??$,localTools:a,logger:p,context:Ot.dummyContext(R.getEnvName()),flagStore:f});R.setMomenticSystemVariable(L,_)})),{controller:C,context:R}}import{randomUUID as Vk}from"crypto";async function bx({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")?Ei?!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 wx({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:x,orgSettings:v}=n;h.info(`Running test '${x.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},E={orgId:o,runId:i||Vk(),runAttemptId:s,testMetadata:x,steps:x.steps,beforeSteps:x.beforeSteps,afterSteps:x.afterSteps},C={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await bx({currentAttempt:r,testId:x.id,flagStore:c,apiClient:g,testAdvancedSettings:x.advanced,aiSettingsFromEnv:v.ai,logger:h})};return await Tl({fixtures:b,inputs:E,options:C,callbacks:{step:{},test:{onTestComplete:async()=>{await a.browser.cleanup()},onProposedTestSteps:async L=>g.uploadProposedSteps(L,h)}},testParams:{tracer:S}})}async function vx(n){let{testDefinition:e,logger:t}=n,r=new Date;try{return await qk(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 qk(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 li(r,o),m=ui({orgId:o,client:r,gitMetadata:c,alwaysSaveCache:d,noCache:p}),h=Ai(e.steps),g=Ai(e.beforeSteps)??void 0,f=Ai(e.afterSteps)??void 0;try{await m.resolveStepCacheEntries({organizationId:o,testId:e.id,stepLists:{steps:h,beforeSteps:g,afterSteps:f},schemaVersion:e.schemaVersion,logger:l})}catch(R){throw l.error({err:R},"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: ${R}`)}let S=n.envName??Yk(e),x,v={};if(S){try{x=ms(S,t,l)}catch(R){let M=`Failed to resolve environment ${S} for test ${e.name}: ${R}`;throw new Error(M)}v=x.variables}let b=e.baseUrl;if(i)b=i;else if(!b){let R=v[Ve];typeof R=="string"&&(b=R)}if(!b){let R=`Cannot run test with no base URL and no ${Ve} variable defined in its environment`;throw new Error(R)}let E=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:b,environmentName:S,schemaVersion:e.schemaVersion}),C=l.child(E.loggerBindings||{});Object.entries(E.envVarBindings||{}).forEach(([R,M])=>{v[R]=M});try{let R=await Kk({...n,variables:v,envName:S,resolvedEnv:x,baseUrl:b,storageClient:u,tracer:E,logger:C,cacheStorage:m,stepsWithCaches:h,beforeStepsWithCaches:g,afterStepsWithCaches:f});return await E.finish({logger:l,status:R.status,finishedAt:R.finishedAt,failureDetails:R.failureDetails,failureReason:R.failureReason,isFlake:R.isFlake}),{runId:E.runId,...R}}finally{s?.pop()}}async function Kk(n){let{testDefinition:e,stepsWithCaches:t,beforeStepsWithCaches:r,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:s,apiClient:a,generator:l,baseUrl:c,storageClient:d,orgId:p,envName:u,urlOverride:m,customHeaders:h,testInputs:g,variables:f,resolvedEnv:S,retriesOverride:x,devicePixelRatio:v,logUpdate:b,tracer:E,logger:C,flagStore:R,cacheStorage:M}=n,L=new Date,$=new oi(i,s),q={ai:i.config.ai},N={envName:u,urlOverride:m,customHeaders:h,testInputs:g},_,O=Math.abs(x??i.config.retries??e.retries??0),Y=[];C.info({labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let B=0;B<=O;B++){let ie=await E.startAttempt(),se=C.child(ie.loggerBindings||{}),J={...e,steps:Ai(t),beforeSteps:Ai(r),afterSteps:Ai(o)};B!==0&&b("RETRY",`attempt ${B+1}/${O+1}`);let xe=new Date,_e=new fr({httpClient:new Ft({baseUrl:a.baseUrl,apiKey:a.apiKey,logger:se}),fakerSeed:R.isBooleanFlagEnabled("faker_constant_seed")?Lh:void 0});try{let{controller:me,context:Rt}=await yx({baseUrl:c,envName:u,testName:J.name,apiClient:a,devicePixelRatio:v,logger:se,storageClient:d,codeEvalTools:_e,test:J,generator:l,orgId:p,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...J.advanced},visualDiffScreenshotStorage:$,flagStore:R});_=await wx({attemptMetadata:{attemptNumber:B+1,orgId:p,runId:E.runId},attemptFixtures:{logger:se,storageClient:d,billingReporter:new Bo,analytics:new vi,debugDataStorage:new Fr,codeEvalTools:_e,flagStore:R,apiClient:a,context:Rt,controller:me,tracer:ie},attemptInputs:{test:J,orgSettings:q}});let yt=new Date;_?.status==="PASSED"&&await Fa({logger:C,cacheStorage:M,orgId:p,testId:e.id,originalSteps:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},updatedSteps:{steps:J.steps,beforeSteps:J.beforeSteps,afterSteps:J.afterSteps}}),await ie.finish({logger:se,result:_}),Y.unshift(_.status);let Tn=await Sx({orgId:p,codeEvalTools:_e,logger:se,outputDefinitions:e.outputs??[],testContext:Rt,flagStore:R}),ho=ah(Y),go=B+1;if(_.status!=="FAILED")return{..._,parameters:N,test:J,filePath:J.relativeFilePath,startedAt:L,lastAttemptStartedAt:xe,finishedAt:yt,attempts:go,baseUrl:c,outputs:Tn,isFlake:ho};let tr=_.failedStepResult,dn=tr?.message||"Unknown failure",z=tr?.failureReason??zh(dn)??"UnknownError",Pi=se.child({errResult:tr,failureReason:z,errorMessage:dn,numAttempts:O+1,name:J.name});if(B<O){Pi.warn(`Retrying failed execution attempt for run: ${dn}`);continue}return Pi.error(`Test failed after all exhausting attempts: ${dn}`),{..._,parameters:N,failureDetails:{errorMessage:dn},failureReason:z,test:J,filePath:J.relativeFilePath,startedAt:L,lastAttemptStartedAt:xe,finishedAt:yt,attempts:B+1,baseUrl:c,outputs:Tn}}catch(me){Oi(me);let Rt=`Encountered fatal platform error while running test '${J.name}': ${me}`,yt=new Date,Tn=B+1;se.error({err:me},Rt),y.error(Rt);let ho={errorMessage:me.message,errStack:me.stack},go={status:"FAILED",failureDetails:ho,failureReason:"InternalPlatformError",finishedAt:yt};return await ie.finish({logger:se,result:{status:"FAILED",results:[]}}),{...go,parameters:N,test:J,filePath:J.relativeFilePath,startedAt:L,lastAttemptStartedAt:xe,finishedAt:new Date,attempts:Tn,baseUrl:c,outputs:{}}}}throw new Error("This code should not be reachable")}function Yk(n){for(let e of n.envs??[])if(e.default)return e.name}import{randomUUID as Tx}from"crypto";import Jk from"adm-zip";import Qn from"fs";import uo from"path";var Gs=class n{constructor(e){this.filePath=e;Qn.rmSync(this.filePath,{recursive:!0,force:!0}),Qn.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new n(uo.join(this.filePath,e))}storeFile(e){let{name:t,contents:r}=e,o=uo.join(this.filePath,t);try{Qn.writeFileSync(o,r)}catch{}}createRunArchive(e){return new Nu(uo.join(this.filePath,"runs"),e)}},Nu=class{constructor(e,t){this.filePath=e;this.tempPath=uo.join(e,`.${t}`),this.finalPath=uo.join(e,`${t}.zip`),Qn.rmSync(this.tempPath,{recursive:!0,force:!0}),Qn.rmSync(this.finalPath,{recursive:!0,force:!0}),Qn.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;cd(e){return new Gs(uo.join(this.tempPath,e))}storeFile(e){let{name:t,contents:r}=e,o=uo.join(this.tempPath,t);Qn.writeFileSync(o,r)}close(){let e=new Jk;e.addLocalFolder(this.tempPath,void 0,r=>r!==".DS_Store");let t=e.toBuffer();Qn.writeFileSync(this.finalPath,t),Qn.rmSync(this.tempPath,{recursive:!0,force:!0})}};async function xx(n,e,t,r,o){let i=ns(o.type);if(i&&await e.reportCreditsUsed(n,o.type,i,{testId:t,testName:r}),"command"in o){let s=rs(o.command);s&&await e.reportCreditsUsed(n,o.command.type,s,{testId:t,testName:r})}}function Xk(n){switch(n){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function Zk(n){switch(n){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Mu=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:Zk(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 ac(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},ac=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(xx(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 Mu(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:Xk(e.status),finishedAt:e.finishedAt}))))}},ku=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:Ba(r.results,t),beforeResults:r.beforeResults?Ba(r.beforeResults,t):void 0,afterResults:r.afterResults?Ba(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 ac(this.testId,this.testName,e,this.billingReporter,this.asyncWork);return this.children.push(t),t}},_u=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{[By]: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:De,startedAt:new Date,status:"RUNNING"};e.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)});let r=new ku(this.orgId,this.testId,this.testName,this.originalSteps,t,this.client,e,this.billingReporter,this.asyncWork);return this.children.push(r),r}},lc=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=Tx(),l={...s,id:a,trigger:Xt.CLI,startedAt:new Date,status:"RUNNING",cliVersion:vn},c=new Gs(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=Tx(),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:vn,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 _u(this.orgId,e.testId,e.testName,t,e.originalSteps,o,this.client,r,this.billingReporter,this.asyncWork);return this.children.push(i),i}};import Ex from"adm-zip";import Du from"fs";import cc from"path";function Qk(n){let e=new Ex,t=cc.join(n,"metadata.json"),r=as.parse(JSON.parse(Du.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Du.readdirSync(cc.join(n,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),s=new Ex(cc.join(n,"runs",o));for(let a of s.getEntries())a.isDirectory||e.addFile(cc.join("runs",i,a.entryName),a.getData())}return{runGroupId:r.id,buffer:e.toBuffer()}}async function dc(n){let{client:e,consoleLogger:t,resultsPath:r}=n;if(!Du.existsSync(r)){t.warn("Results path does not exist, skipping upload.");return}let o=new fl(e);try{let{runGroupId:i,buffer:s}=Qk(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 Cx(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:x,include:v,exclude:b,labels:E,reporterDir:C=oy,outputDir:R=iy,uploadResults:M=!1,waitOnTimeout:L=60,parallel:$=d.config.parallel??1,shardIndex:q=1,shardCount:N=1,regenerateGoldenFiles:_,gitMetadata:O,alwaysSaveCache:Y,noCache:B}=n;o&&(e.info({orgId:h},`Executing start command: ${o}`),await wv(o,!1)),i&&(e.info({orgId:h},`Waiting for url: ${i} with timeout: ${L} seconds.`),await n_({resources:[i],interval:2500,timeout:L*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1}));let ie=new di(d.config.ai?.agentConfig,{baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e}),se=be(d,y),J=await sc({tests:t,momenticFiles:se,yes:r,project:d,include:v,exclude:b,labels:E,logger:e}),xe=J.filter(Fe=>!Fe.disabled),_e=J.filter(Fe=>Fe.disabled),me=[];xe.forEach((Fe,Er)=>{S?S.forEach((So,bt)=>{me.push({testIndex:Er,inputs:So,inputIndex:bt})}):me.push({testIndex:Er,inputs:void 0,inputIndex:void 0})}),N&&N>1&&(me=r_(me,q,N));let Rt=`Running ${me.length} tests with ${$} workers:`;e.info({allTestsToRunWithInputs:me,shardCount:N,shardIndex:q,orgId:h},Rt),y.info(Rt),me.forEach(Fe=>{y.info(`${Wt}- ${[xe[Fe.testIndex].relativeFilePath]}${typeof Fe.inputIndex=="number"?` with input set ${Fe.inputIndex}`:""}`)}),y.log("");let yt=[],Tn=new Date,ho=new Set,go=async()=>{let Fe=s.getAppUrl(),Er=Ci({results:yt,startTime:Tn.getTime(),onFailed:bt=>{nc(bt,bt.filePath)},getDisplayLine:bt=>{let Cr=`${Wt}- ${bt.filePath}${bt.proposedTest?" [AUTO-HEALED] ":""}`;return bt.runId&&(Cr+=` ( link when uploaded: ${Fe}/runs/${bt.runId} )`),Cr},entity:"test"}),So=yt.filter(bt=>!!bt.proposedTest);return So.length>0&&y.warn(`${So.length} tests passed with auto-healing. Please use the run links printed above to review proposed changes and apply them locally.`),y.log(""),M?(y.success(`Test results have been saved to the folder ${R}. Uploading to Momentic cloud.`),await dc({client:s,consoleLogger:y,resultsPath:R})):y.success(`Test results have been saved to the folder ${R}. Upload them to Momentic cloud by running 'npx momentic results upload ${R}'.`),Er};t_.existsSync(R)&&y.warn(`Output directory ${R} already exists, removing before test execution...`);let tr=await lc.start(e,h,R,s,l,O),dn=e.child(tr.loggerBindings||{}),z=[],Pi=async()=>{y.warn("SIGINT received. Stopping tests and printing latest results..."),await tr.finish({logger:dn,status:"CANCELLED"}),await go(),await Promise.allSettled(z.map(Fe=>Fe())),process.exit(1)};process.once("SIGINT",Pi);let fo={};for(let Fe=0;Fe<me.length;Fe++){let Er=Object.values(fo);Er.length===$&&await Promise.race(Er.map(Cr=>Cr.promise));let So=me[Fe],bt=`test-${Fe}`;fo[bt]={done:!1,promise:(async({testIndex:Cr,inputs:zu})=>{let yo=xe[Cr];ho.add({testIndex:Cr,inputs:zu});let kx=yo.relativeFilePath.includes("..")?yo.fullFilePath:yo.relativeFilePath,Ws=(dt,Li)=>{dt=dt.toUpperCase();let zn=dt,nr;dt.includes("FAIL")?(zn=Ii.bgRed.white("FAIL"),nr=3):dt.includes("PASS")?(zn=Ii.bgGreen.white("PASS"),nr=3):dt.includes("START")?(zn=Ii.bgBlue.white("START"),nr=2):dt.includes("CANCEL")?(zn=Ii.bgRgb(191,68,11).white("CANCEL"),nr=1):dt.includes("RETRY")?(zn=Ii.bgRgb(191,68,11).white("RETRY"),nr=2):dt.includes("RUN")||dt.includes("PROG")?(zn=Ii.bgMagenta.white("RUNNING"),nr=0):(dn.warn(`Unknown status tried to be logged in run test locally: ${dt}`),nr=0),e_||(zn=`${zn}`),y.log(`${zn}${" ".repeat(nr)} ${kx} ${Li?`${Li} `:""}(${ho.size}/${me.length})`)};Ws("START");let _x=setInterval(()=>Ws("RUN"),5*60*1e3),Hu=dn.child({testId:yo.id});try{let dt=await vx({testDefinition:yo,project:d,testInputs:zu,orgId:h,devicePixelRatio:g,apiClient:s,runGroupTracer:tr,generator:ie,retriesOverride:p,urlOverride:u,envName:m,customHeaders:f,regenerateGoldenFiles:_,logUpdate:Ws,runSigIntHandlers:z,logger:Hu,flagStore:c,gitMetadata:O,alwaysSaveCache:Y,noCache:B});Ws(dt.status),yt.push(dt)}catch(dt){let Li=`Encountered unexpected fatal error when running test '${yo.name}': ${dt.message}`;y.error(Li),Hu.error(Li)}finally{clearInterval(_x),fo[bt].done=!0,delete fo[bt]}})(So)}}await Promise.allSettled(Object.values(fo).map(Fe=>Fe.promise));let Bu="PASSED";return yt.some(Fe=>Fe.status==="FAILED")&&(Bu="FAILED"),await tr.finish({logger:dn,status:Bu}),process.off("SIGINT",Pi),x&&await fx(dn,a,x,{projectConfigPath:d.configFilePath,suiteName:d.config.name,startedAt:Tn,finishedAt:new Date,runs:yt,skippedTests:_e},C),go()}function r_(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 o_}from"crypto";import er from"fs";import mo from"path";var Rx={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 Ax(n,e){let t=n[e];if(!t)throw new Error(`No metadata value found for key: ${e}`);return t}function i_(n,e,t){if(Rx[t]){let i=Rx[t];return i(n,e)}let r=Ax(n,t),o=Ax(e,t);if(r!==o)throw new Error(`Metadata values for key "${t}" do not match: "${r}" vs "${o}"`);return r}var Ix=new Set([".DS_Store","__MACOSX"]);function Px(n,e,t){let r=o_(),o=n.child({runGroupId:r});er.rmSync(e,{recursive:!0,force:!0});let i=er.readdirSync(t).filter(c=>!Ix.has(c)).map(c=>mo.join(t,c));er.mkdirSync(e,{recursive:!0});let s=mo.join(i[0],"metadata.json"),a={...as.parse(JSON.parse(er.readFileSync(s,"utf-8"))),id:r};for(let c of i){let d=mo.join(c,"runs");if(!er.existsSync(d))continue;let p=er.readdirSync(d);for(let h of p){if(Ix.has(h))continue;let g=mo.join(d,h),f=mo.join(e,"runs",h);er.cpSync(g,f,{recursive:!0})}let u=mo.join(c,"metadata.json"),m=as.parse(JSON.parse(er.readFileSync(u,"utf-8")));o.info({oldRunGroupId:m.id},"Merging metadata from run groups");for(let h in m){if(h==="id")continue;let g=h;a[g]=i_(a,m,g)}}let l=mo.join(e,"metadata.json");er.writeFileSync(l,JSON.stringify(a,null,2))}var Lx=new xi({platform:"cli"},{flushAt:1,flushInterval:0});mc||Q.warn("Sentry is not enabled in this environment due to unsupported node version");var p_=process.argv.some(n=>n.includes("--log-level"))&&process.argv.some(n=>n.includes("debug")),Fu=n=>{p_&&y.dimmed(n)},Ct=new s_;Ct.name("momentic").description("CLI").version(vn);Ct.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: ${Cu.join(", ")}.`).action(async(n,e)=>{!e.all&&n.length===0&&(y.error("No browsers specified"),process.exit(1)),await ox({rawBrowsers:n,force:e.force,all:e.all})});Ct.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())});Ct.addOption(new Vt("--verbose","enable verbose logging")).on("option:verbose",()=>{Q.enableConsoleLogs(),y.setMinLevel(0)});var Uu=Ct.command("checks").alias("check").description("Perform various project checks");Uu.command("config").addOption(xn).action(async n=>{$t({configFilePath:n.config})});Uu.command("duplicate-ids").description("Checks if any steps in your entire Momentic test repository share the same ID.").addOption(xn).addOption(Dv).action(async n=>{let e=await cn(n),t=$t({configFilePath:n.config});await Vv({project:t,fix:e.fix})});Uu.command("duplicate-names").description("Checks if tests or modules with duplicate names or ids exist").addOption(xn).action(async n=>{let e=$t({configFilePath:n.config});await qv({project:e})});var Ox=Ct.command("migrate").description("Migrate and upgrade tooling");Ox.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(xn).action(async n=>{let e=$t({configFilePath:n.config});await ix(e)});Ox.command("v1-v2").description("Migrate from v1 of the Momentic CLI to v2").addOption(Zn).addOption(xn).addOption(Xn).action(async n=>{let e=await cn(n);!e.yes&&!await St("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 ct({baseUrl:e.server,apiKey:e.apiKey,logger:Q}),{orgId:o}=await r.getAuthInfo();await ax({project:t,orgId:o,apiClient:r}),process.exit(0)});Ct.command("import").addOption(Xn).addOption(Zn).addOption(xn).addOption(co).addArgument(Uv).action(async(n,e)=>{let t=await cn(e),{apiKey:r,server:o,config:i,yes:s}=t,a=$t({configFilePath:i}),l=new ct({baseUrl:o,apiKey:r,logger:Q});!n||n.length===0?await Zv({client:l,project:a,skipPrompts:s}):await Qv({client:l,project:a,paths:n,skipPrompts:s}),process.exit(0)});Ct.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."),uc.existsSync(ti)&&(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 Rv("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Yd};ni(t,ti),y.success(`Initialized Momentic project file at ${pc.resolve(ti)}`)});Ct.command("app").addOption(Xn).addOption(Zn).addOption(co).addOption(fu).addOption(Mv).addOption(xn).addOption(yu).addOption(bu).action(async n=>{let e=await cn(n),{apiKey:t,port:r=Kl,yes:o,server:i,pixelRatio:s,disableCache:a,saveCache:l}=e,c=new ct({baseUrl:i,apiKey:t,logger:Q});await vu({client:c,skipPrompts:o});let d=d_(import.meta.url),p=pc.dirname(d),u=pc.resolve(p,"..","static"),m=pc.resolve(p,"..","assets"),h=s??iu();su(h),await Sv({momenticServerUrl:i,apiKey:t,serverPort:r,appPort:r,staticDir:u,assetsDir:m,devicePixelRatio:h,version:vn,noCache:a,alwaysSaveCache:l});let g=`http://localhost:${r}`;await c_(g)});var Nx=Ct.command("queue").description("Queue tests or suites to run on Momentic Cloud");Nx.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Xn).addOption(Zn).addOption(pu).addOption(uu).addOption(co).addArgument(Bv).addOption(Xl).addOption(Jl).addOption(Yl).action(async(n,e)=>{let{apiKey:t,server:r,wait:o,waitTimeout:i,env:s,urlOverride:a,customHeaders:l}=await cn(e),c=new ct({baseUrl:r,apiKey:t,logger:Q});(!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 cx({client:c,orgId:d,wait:o,suitePaths:n,waitTimeout:i,env:s,urlOverride:a,customHeaders:Ql(l)})});Nx.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Xn).addOption(Zn).addOption(co).addOption(Yl).addOption(Su).addOption(Xl).addOption(Jl).addOption(pu).addOption(uu).addArgument(Fv).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=Ql(i);for(let S of n)(S.endsWith(".yaml")||uc.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 ct({baseUrl:a,apiKey:o,logger:Q}),{orgId:g}=await h.getAuthInfo(),f;l&&(f=await au(l)),await dx({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 u_=Ct.command("list").description("List test paths");u_.addOption(xn).addOption(Zl).addOption(hu).addOption(gu).addOption(new Vt("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(wu).action(async(n,e)=>{let t=await cn(e),r=$t({configFilePath:t.config,nameFilter:t.filter}),o=be(r,y),i=await sc({tests:n,momenticFiles:o,yes:!0,project:r,include:t.include,exclude:t.exclude,labels:t.labels,logger:ig});y.info(i.map(s=>s.relativeFilePath).join(`
|
|
3843
|
+
`)),process.exit(0)});var m_=Ct.command("run").alias("test").description("Run tests on the local machine");m_.addOption(Xn).addOption(Zn).addOption(xn).addOption(Zl).addOption(co).addOption(Yl).addOption(Su).addOption(yu).addOption(bu).addOption(Jl).addOption(Xl).addOption(fu).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(Lv).addOption(Ov).addOption(mu).addOption(Nv).addOption(kv).addOption(_v).addOption(hu).addOption(gu).addArgument(wu).action(async(n,e)=>{y.debug("Run tests invoked");let t=await cn(e);y.debug(t,"Parsed CLI options");let r=Ql(t.customHeaders),o=$t({configFilePath:t.config,nameFilter:t.filter});y.debug({projectName:o.config.name},"Identified project config");let{errors:i}=await Tu({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 ct({baseUrl:t.server,apiKey:t.apiKey,logger:Q});y.debug("Checking API key and dependencies");let{orgId:a,userId:l}=await vu({client:s,skipPrompts:t.yes});y.debug("API key check and browser installation complete");let c=new hl(s),d=new gl(s),p=t.outputDir??o.config.outputDir,u=t.reporterDir??o.config.reporterDir,m=Q.child({orgId:a,userId:l,cliVersion:vn,trigger:"CLI"}),h=await si(Q,s,o);m.debug(h,"Got local git metadata");let g=new ii(o.config),f=Lx.child({org_id:a,user_id:l,cli_version:vn,trigger:"CLI"}),S;t.inputCsv&&(S=await au(t.inputCsv));let x=t.pixelRatio??iu();su(x);try{(await Cx({...t,retriesOverride:t.retries,devicePixelRatio:x,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(v){y.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),y.error(v),process.exit(1)}});var h_=Ct.command("apply").description("Apply an operation to local resources");h_.command("patch").addOption(Xn).addOption(Zn).addOption(xn).addOption(Zl).addOption(co).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=Q,l=new ct({baseUrl:r,apiKey:t,logger:a}),c=be(s,y),d=c.tests[n.to]??Object.values(c.tests).find(u=>Me(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 Av({client:l,test:d,fragment:p,yes:i,entities:c,logger:Q}),process.exit(0)});var Mx=Ct.command("results").description("Merge and upload test results.");Mx.command("merge").description("Merge test results files.").addOption(mu).addArgument(zv).action(async(n,e)=>{let t=await cn(e),{outputDir:r}=t;r||(y.error("Output directory is required."),process.exit(1)),uc.existsSync(n)||(y.warn("Results path does not exist, skipping merge."),process.exit(0)),uc.existsSync(r)&&y.warn(`Output directory ${r} already exists, removing before merging...`),Px(Q,r,n)});Mx.command("upload").description("Upload test results to Momentic cloud.").addOption(Xn).addOption(Zn).addArgument(Hv).action(async(n,e)=>{let t=await cn(e),{apiKey:r,server:o}=t,i=Q,s=new ct({baseUrl:o,apiKey:r,logger:i});await dc({consoleLogger:y,resultsPath:n,client:s}),process.exit(0)});async function g_(){Fu("Main program started"),await xv(Q),Fu("CLI version check complete");try{await Ct.parseAsync(process.argv)}catch(n){let e={};try{e.playwrightVersion=a_("npx playwright --version").toString()}catch(t){Q.error({err:t},"Error fetching debug information")}Q.error({err:n,debugInfo:e},"Uncaught error in CLI"),Q.flush(),Oi(n,e),y.error(n),process.exit(1)}}l_.setMaxListeners(50);process.on("warning",n=>{Q.warn({err:n},`Node warning received on CLI: ${n.message}`)});Fu("CLI parsing setup complete");g_();
|
|
3843
3844
|
//# sourceMappingURL=cli.js.map
|
|
3844
|
-
//# debugId=
|
|
3845
|
+
//# debugId=a994cae4-7f00-58a6-802d-ea88d710ff40
|