momentic 2.6.1 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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 $x=Object.create;var Ju=Object.defineProperty;var Gx=Object.getOwnPropertyDescriptor;var Wx=Object.getOwnPropertyNames;var Vx=Object.getPrototypeOf,qx=Object.prototype.hasOwnProperty;var Xu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var Kx=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Wx(e))!qx.call(n,o)&&o!==t&&Ju(n,o,{get:()=>e[o],enumerable:!(r=Gx(e,o))||r.enumerable});return n};var Yx=(n,e,t)=>(t=n!=null?$x(Vx(n)):{},Kx(e||!n||!n.__esModule?Ju(t,"default",{value:n,enumerable:!0}):t,n));var pS=Xu((b3,dS)=>{"use strict";dS.exports=lS;function lS(n,e,t){n instanceof RegExp&&(n=sS(n,t)),e instanceof RegExp&&(e=sS(e,t));var r=cS(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 sS(n,e){var t=e.match(n);return t?t[0]:null}lS.range=cS;function cS(n,e,t){var r,o,i,a,s,l=t.indexOf(n),c=t.indexOf(e,l+1),d=l;if(l>=0&&c>0){if(n===e)return[l,c];for(r=[],i=t.length;d>=0&&!s;)d==l?(r.push(d),l=t.indexOf(n,d+1)):r.length==1?s=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,a=c),c=t.indexOf(e,d+1)),d=l<c&&l>=0?l:c;r.length&&(s=[i,a])}return s}});var bS=Xu((w3,yS)=>{"use strict";var uS=pS();yS.exports=WA;var mS="\0SLASH"+Math.random()+"\0",hS="\0OPEN"+Math.random()+"\0",Fd="\0CLOSE"+Math.random()+"\0",gS="\0COMMA"+Math.random()+"\0",fS="\0PERIOD"+Math.random()+"\0";function Dd(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function $A(n){return n.split("\\\\").join(mS).split("\\{").join(hS).split("\\}").join(Fd).split("\\,").join(gS).split("\\.").join(fS)}function GA(n){return n.split(mS).join("\\").split(hS).join("{").split(Fd).join("}").split(gS).join(",").split(fS).join(".")}function SS(n){if(!n)return[""];var e=[],t=uS("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,a=r.split(",");a[a.length-1]+="{"+o+"}";var s=SS(i);return i.length&&(a[a.length-1]+=s.shift(),a.push.apply(a,s)),e.push.apply(e,a),e}function WA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),Sa($A(n),!0).map(GA)):[]}function VA(n){return"{"+n+"}"}function qA(n){return/^-?0\d/.test(n)}function KA(n,e){return n<=e}function YA(n,e){return n>=e}function Sa(n,e){var t=[],r=uS("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?Sa(r.post,!1):[""];if(/\$$/.test(r.pre))for(var a=0;a<i.length;a++){var s=o+"{"+r.body+"}"+i[a];t.push(s)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(r.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(r.body),d=l||c,p=r.body.indexOf(",")>=0;if(!d&&!p)return r.post.match(/,.*\}/)?(n=r.pre+"{"+r.body+Fd+r.post,Sa(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=SS(r.body),u.length===1&&(u=Sa(u[0],!1).map(VA),u.length===1))return i.map(function(H){return r.pre+u[0]+H});var m;if(d){var h=Dd(u[0]),g=Dd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(Dd(u[2])):1,w=KA,x=g<h;x&&(S*=-1,w=YA);var y=u.some(qA);m=[];for(var E=h;w(E,g);E+=S){var C;if(c)C=String.fromCharCode(E),C==="\\"&&(C="");else if(C=String(E),y){var R=f-C.length;if(R>0){var L=new Array(R+1).join("0");E<0?C="-"+L+C.slice(1):C=L+C}}m.push(C)}}else{m=[];for(var M=0;M<u.length;M++)m.push.apply(m,Sa(u[M],!1))}for(var M=0;M<m.length;M++)for(var a=0;a<i.length;a++){var s=o+m[M]+i[a];(!e||d||s)&&t.push(s)}}return t}});var ki=(n,e)=>{},yc=!1;try{let n=await import("@sentry/node");ki=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME}),yc=!0}catch{}import{Command as h_,Option as Vt}from"@commander-js/extra-typings";import{execSync as g_}from"child_process";import vv from"body-parser";import YN from"cors";import JN from"dedent";import XN from"events";import xv,{Router as ZN}from"express";import{diff as zA}from"deep-object-diff";import hn from"fs";import Xr from"path";import{diff as uA}from"deep-object-diff";import{z as Zu}from"zod";var A_=Zu.object({input:Zu.string()});import{z as Ke}from"zod";var L_=Ke.object({srcs:Ke.array(Ke.string()),urls:Ke.array(Ke.string()),desiredSrc:Ke.string().optional(),desiredUrl:Ke.string().optional()}),Qu=Ke.object({srcRegex:Ke.string().optional(),urlRegex:Ke.string().optional()}),em=Ke.object({x:Ke.number(),y:Ke.number(),correlation:Ke.number()}),O_=Ke.object({searchImageBase64String:Ke.string(),pageImageBase64String:Ke.string(),id:Ke.string().uuid(),timeoutMs:Ke.number().max(1e4).min(0).optional()});import{z as D}from"zod";import*as F 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}}Ce(F);var or=(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))(or||{}),Jx=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),bc=F.object({result:F.number(),traceId:F.string()}).array(),_i=F.object({type:F.literal("GCS_TRACES"),traces:bc}),Ar=F.object({id:F.number().int(),dataMomenticId:F.number().int().optional(),selector:F.string().optional(),hybridSelector:F.object({textContent:F.string().or(F.null()),attributes:F.record(F.string(),F.string()),tagName:F.string(),expandShadowRoot:F.boolean(),classNames:F.string().array(),nthChild:F.number()}).array().optional(),generatedSelectors:F.string().array().optional(),role:F.string().optional(),name:F.string().optional(),numChildren:F.number().optional(),content:F.string().optional(),pathFromRoot:F.string().optional(),serializedForm:F.string().optional(),nodeOnlySerializedForm:F.string().optional(),serializedHtml:F.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:F.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:F.string().url().optional(),boundingBox:F.object({x:F.number().optional(),y:F.number().optional(),width:F.number(),height:F.number()}).describe("css pixel bounding box").optional(),frameCache:Jx.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(or).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional(),memory:_i.optional()}).openapi({ref:"ElementTargetCache"});function tm(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var Xx=F.object({type:F.literal("description"),elementDescriptor:F.string(),a11yData:Ar.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),Zx=F.object({x:F.number(),y:F.number()}),Qx=F.object({type:F.literal("coordinates"),pixels:Zx}).openapi({ref:"CoordinatesTarget"});function ir(n){return n.type==="description"}function En(n){return n.type==="coordinates"}var pt=F.discriminatedUnion("type",[Xx,Qx]).openapi({ref:"ElementTarget"});function wc(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{v4 as be}from"uuid";import*as v from"zod";import{z as ye}from"zod";import{z as wo}from"zod";var vc=wo.object({result:wo.boolean(),traceId:wo.string()}).array(),xc=wo.object({type:wo.literal("GCS_TRACES"),traces:vc}),nm=wo.object({memory:xc.optional()});var Ya=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};Ce(ye);var rm=ye.object({plan:ye.string().optional(),evidence:ye.string().optional(),thoughts:ye.string(),result:ye.boolean(),relevantElements:ye.array(ye.number()).optional(),updatedMemory:vc.optional()}),vo=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(vo||{});var eT=ye.object({type:ye.literal("ELEMENT_CONTENT"),negated:ye.boolean().optional(),operation:ye.nativeEnum(vo),value:ye.string()}).openapi({ref:"ElementContentAssertion"}),tT=ye.object({type:ye.literal("ELEMENT_ATTRIBUTE"),negated:ye.boolean().optional(),operation:ye.nativeEnum(vo),attr:ye.string(),value:ye.string()}).openapi({ref:"ElementAttributeValueAssertion"}),xo=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(xo||{}),nT=ye.object({type:ye.literal("ELEMENT_EXISTENCE"),negated:ye.boolean().optional(),condition:ye.nativeEnum(xo).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),om=ye.discriminatedUnion("type",[eT,tT,nT]).openapi({ref:"ManualElementAssertion"});var rT=ye.object({type:ye.literal("CONTENT"),negated:ye.boolean().optional(),value:ye.string()}).openapi({ref:"PageContentAssertion"}),im=ye.discriminatedUnion("type",[rT]).openapi({ref:"ManualPageAssertion"});import{z as ie}from"zod";var Ja=ie.object({url:ie.string(),method:ie.union([ie.literal("GET"),ie.literal("POST"),ie.literal("PUT"),ie.literal("DELETE"),ie.literal("PATCH")]),headers:ie.record(ie.string(),ie.string()).optional(),params:ie.record(ie.string(),ie.string()).optional(),body:ie.string().optional(),timeout:ie.number().int().optional().describe("Max seconds to wait for the request to complete")}),am=ie.object({url:ie.string(),headers:ie.record(ie.string(),ie.string()).optional(),query:ie.string(),variables:ie.record(ie.string(),ie.string()).optional(),timeout:ie.number().int().optional().describe("Max seconds to wait for the request to complete")}),Xa=ie.object({code:ie.string(),fragment:ie.boolean().optional(),environment:ie.union([ie.literal("NODE"),ie.literal("BROWSER")]).optional().describe("default NODE"),timeout:ie.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ue=(j=>(j.AI_EXTRACT="AI_EXTRACT",j.AI_ASSERTION="AI_ASSERTION",j.AUTH_LOAD="AUTH_LOAD",j.AUTH_SAVE="AUTH_SAVE",j.BLUR="BLUR",j.CAPTCHA="CAPTCHA",j.CLICK="CLICK",j.COOKIE="COOKIE",j.COPY="COPY",j.DIALOG="DIALOG",j.DRAG="DRAG",j.ELEMENT_CHECK="ELEMENT_CHECK",j.FILE_UPLOAD="FILE_UPLOAD",j.FOCUS="FOCUS",j.GO_BACK="GO_BACK",j.GO_FORWARD="GO_FORWARD",j.HOVER="HOVER",j.JAVASCRIPT="JAVASCRIPT",j.LOCAL_STORAGE="LOCAL_STORAGE",j.MOUSE_DRAG="MOUSE_DRAG",j.NAVIGATE="NAVIGATE",j.NEW_TAB="NEW_TAB",j.PAGE_CHECK="PAGE_CHECK",j.PASTE="PASTE",j.PRESS="PRESS",j.KEY_DOWN="KEY_DOWN",j.KEY_UP="KEY_UP",j.REFRESH="REFRESH",j.REQUEST="REQUEST",j.GRAPHQL_REQUEST="GRAPHQL_REQUEST",j.SCROLL_DOWN="SCROLL_DOWN",j.SCROLL_UP="SCROLL_UP",j.SCROLL_LEFT="SCROLL_LEFT",j.SCROLL_RIGHT="SCROLL_RIGHT",j.SELECT_OPTION="SELECT_OPTION",j.SWITCH_TAB="TAB",j.TYPE="TYPE",j.VISUAL_DIFF="VISUAL_DIFF",j.WAIT="WAIT",j.WAIT_FOR_URL="WAIT_FOR_URL",j.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",j.AWAIT_LISTENER="AWAIT_LISTENER",j.RECORD_REQUESTS="RECORD_REQUESTS",j.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",j.SET_HEADER="SET_HEADER",j.SUCCESS="SUCCESS",j))(Ue||{});Ce(v);var Y=v.object({thoughts:v.string().optional(),id:v.string().uuid().describe("unique identifier to this step, used for step cache")}),qt=v.object({useSelector:v.boolean().optional(),force:v.boolean().optional(),disableCache:v.boolean().optional().describe("disable element caching for this step"),iframeUrl:v.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Cn=v.object({target:Ar}).optional().openapi({ref:"SingleTargetCache"}),Za=v.object({loadTimeout:v.number().int().max(60).optional().describe("Max seconds for the page to load")}),oT=Y.merge(Za).merge(v.object({type:v.literal("NAVIGATE"),url:v.string()})).openapi({ref:"NavigateCommand"}),Qa=qt.merge(v.object({cache:Cn})),To=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_UP"),deltaY:v.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Eo=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_DOWN"),deltaY:v.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Co=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_LEFT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Ro=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_RIGHT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollRightCommand"}),nD=v.discriminatedUnion("type",[To,Eo,Co,Ro]).openapi({ref:"AllScrollCommands"}),iT=Y.merge(v.object({type:v.literal("DIALOG"),action:v.union([v.literal("ACCEPT"),v.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),aT=Y.merge(v.object({type:v.literal("WAIT"),delay:v.number()})).openapi({ref:"WaitCommand"}),sT=v.discriminatedUnion("type",[v.object({type:v.literal("SUBSTRING"),url:v.string()}),v.object({type:v.literal("GLOB"),glob:v.string()}),v.object({type:v.literal("REGEX"),regex:v.string()})]),lT=v.object({caseInsensitive:v.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:v.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:v.number().int().optional().describe("Max seconds to wait for the URL to match")}),cT=Y.extend({type:v.literal("WAIT_FOR_URL"),matcher:sT}).merge(lT).openapi({ref:"WaitUrlCommand"}),dT=Y.merge(Za).merge(v.object({type:v.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),pT=Y.merge(v.object({type:v.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),uT=Y.merge(v.object({type:v.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),mT=Y.extend({type:v.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),hT=Y.extend({type:v.literal("AUTH_LOAD"),storageState:v.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Ec=Y.merge(qt).extend({type:v.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),gT=Y.extend({type:v.literal("COPY"),value:v.string()}).openapi({ref:"CopyCommand"}),fT=Y.extend({type:v.literal("PASTE")}).openapi({ref:"PasteCommand"}),ST=Y.merge(Xa).extend({type:v.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Fi=Y.merge(qt).extend({type:v.literal("CLICK"),target:pt,doubleClick:v.boolean().optional(),rightClick:v.boolean().optional(),waitForDownload:v.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:v.number().optional(),downloadTimeoutMs:v.number().optional(),cache:Cn,relativePosition:v.object({x:v.number(),y:v.number()}).optional()}).openapi({ref:"ClickCommand"}),Ui=Y.merge(qt).merge(v.object({type:v.literal("DRAG"),fromTarget:pt,toTarget:pt,steps:v.number().optional(),hoverSeconds:v.number().optional().describe("Seconds to hover the object before dropping"),cache:v.object({fromTarget:Ar.optional(),toTarget:Ar.optional()}).optional()})).openapi({ref:"DragCommand"}),Bi=Y.merge(qt).merge(v.object({type:v.literal("MOUSE_DRAG"),target:pt.optional(),deltaX:v.string().describe("pixels to move horizontally, can be template"),deltaY:v.string().describe("pixels to move vertically, can be template"),steps:v.number().optional(),cache:Cn})).openapi({ref:"MouseDragCommand"}),zi=Y.merge(qt).merge(v.object({type:v.literal("HOVER"),target:pt,cache:Cn})).openapi({ref:"HoverCommand"}),Hi=Y.merge(qt).merge(v.object({type:v.literal("FOCUS"),target:pt,cache:Cn})).openapi({ref:"FocusCommand"}),ji=Y.merge(qt).extend({type:v.literal("BLUR"),target:pt.optional(),cache:Cn}).openapi({ref:"BlurCommand"}),yT=v.object({type:v.literal("URL"),url:v.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),bT=v.object({type:v.literal("USER_FILE"),name:v.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),wT=Y.extend({type:v.literal("FILE_UPLOAD"),fileSource:v.discriminatedUnion("type",[yT,bT]),filename:v.string().optional()}).openapi({ref:"FileUploadCommand"}),vT=v.discriminatedUnion("type",[v.object({type:v.literal("VALUE"),value:v.string()}),v.object({type:v.literal("LABEL"),label:v.string()}),v.object({type:v.literal("INDEX"),index:v.coerce.string()})]),$i=Y.merge(qt).extend({type:v.literal("SELECT_OPTION"),target:pt,cache:Cn,choice:vT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Cc=v.union([v.literal("MULTIMODAL"),v.literal("VISION_ONLY")]),es=Y.merge(v.object({type:v.literal("AI_ASSERTION"),assertion:v.string(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional(),contextChoice:Cc.optional(),timeout:v.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:nm.optional()})).openapi({ref:"AIAssertionCommand"}),Rn=5,Rc=600,Gi=Y.merge(qt).extend({type:v.literal("ELEMENT_CHECK"),target:pt,assertion:om,cache:Cn,timeout:v.number().int().min(0).max(Rc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),xT=Y.extend({type:v.literal("PAGE_CHECK"),assertion:im,iframeUrl:v.string().optional().describe("url or url regex for the iframe"),timeout:v.number().int().min(0).max(Rc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),TT=Y.merge(v.object({type:v.literal("AI_EXTRACT"),goal:v.string(),schema:v.string().optional(),envKey:v.string().optional(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional()})).openapi({ref:"AIExtractCommand"}),ET=v.object({clearContent:v.boolean().optional(),forceClearContent:v.boolean().optional(),delay:v.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:v.boolean().optional(),pressEnter:v.boolean().optional()}),sm=25,Wi=Y.merge(qt).merge(ET).extend({type:v.literal("TYPE"),target:pt.optional(),value:v.string(),cache:Cn}).openapi({ref:"TypeCommand"}),CT=Y.merge(v.object({type:v.literal("PRESS"),value:v.string(),repeat:v.number().optional(),convertMeta:v.boolean().optional(),delayMs:v.number().optional()})).openapi({ref:"PressCommand"}),RT=Y.merge(v.object({type:v.literal("KEY_DOWN"),value:v.string(),convertMeta:v.boolean().optional()})).openapi({ref:"KeyDownCommand"}),AT=Y.merge(v.object({type:v.literal("KEY_UP"),value:v.string(),convertMeta:v.boolean().optional()})).openapi({ref:"KeyUpCommand"}),IT=v.object({type:v.literal("SUBSTRING"),substring:v.string()}),PT=v.object({type:v.literal("REGEX"),pattern:v.string()}),LT=v.object({type:v.literal("INDEX"),index:v.coerce.string()}),OT=v.discriminatedUnion("type",[IT,PT,LT]),MT=Y.merge(Za).merge(v.object({type:v.literal("TAB"),action:OT})).openapi({ref:"TabCommand"}),NT=Y.merge(Za).merge(v.object({type:v.literal("NEW_TAB"),url:v.string()})).openapi({ref:"NewTabCommand"}),kT=Y.merge(v.object({type:v.literal("COOKIE"),value:v.string()})).openapi({ref:"CookieCommand"}),_T=Y.merge(v.object({type:v.literal("LOCAL_STORAGE"),key:v.string(),value:v.string()})).openapi({ref:"LocalStorageCommand"}),DT=Y.extend({type:v.literal("REQUEST")}).merge(Ja).openapi({ref:"RequestCommand"}),FT=Y.extend({type:v.literal("GRAPHQL_REQUEST")}).merge(am).openapi({ref:"GraphQLRequestCommand"}),UT=Y.merge(v.object({type:v.literal("SUCCESS"),condition:es.optional()})).openapi({ref:"SuccessCommand"}),BT=Y.merge(v.object({type:v.literal("FAILURE")})).openapi({ref:"FailureCommand"}),zT=v.object({data:v.string().describe("location at which to find a jpg"),width:v.number(),height:v.number()}),Vi=Y.merge(qt).merge(v.object({type:v.literal("VISUAL_DIFF"),threshold:v.number().optional().describe("default 0.1"),target:pt.optional(),screenshot:zT.optional(),cache:Cn})).openapi({ref:"VisualDiffCommand"}),HT=Y.merge(v.object({type:v.literal("REGISTER_REQUEST_LISTENER"),pattern:v.string(),key:v.string()})).openapi({ref:"RegisterRequestListenerCommand"}),jT=Y.merge(v.object({type:v.literal("AWAIT_LISTENER"),key:v.string(),timeout:v.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),$T=Y.merge(v.object({type:v.literal("RECORD_REQUESTS"),pattern:v.string(),key:v.string()})).openapi({ref:"RecordRequestsCommand"}),GT=Y.merge(v.object({type:v.literal("GET_RECORDED_REQUESTS"),key:v.string()})).openapi({ref:"GetRecordedRequestsCommand"}),WT=Y.merge(v.object({type:v.literal("SET_HEADER"),name:v.string(),value:v.string(),urlPattern:v.string().optional().describe("URL pattern to match")})).openapi({ref:"SetHeaderCommand"}),lm=v.discriminatedUnion("type",[Fi,Wi,CT,RT,AT,$i,oT,Eo,To,es,zi,aT,UT]),VT=v.discriminatedUnion("type",[TT,hT,mT,Ec,kT,gT,iT,Ui,Gi,wT,pT,uT,ST,_T,Bi,NT,xT,fT,dT,DT,FT,Co,Ro,MT,Vi,Hi,ji,cT,HT,jT,$T,GT,WT]),Ao=v.discriminatedUnion("type",[...lm.options,...VT.options]).openapi({ref:"Command"}),ts=v.discriminatedUnion("type",[...lm.options,BT]);function zn(n){let e;switch(n){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:be(),type:n};break;case"AUTH_LOAD":{e={id:be(),type:n,storageState:""};break}case"AI_EXTRACT":e={id:be(),type:n,goal:""};break;case"DIALOG":e={id:be(),type:n,action:"DISMISS"};break;case"DRAG":e={id:be(),type:n,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:be(),type:n,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:be(),type:n,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:be(),type:n,delay:1};break;case"BLUR":e={id:be(),type:n};break;case"HOVER":case"FOCUS":case"CLICK":e={id:be(),type:n,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:be(),type:n,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:be(),type:n,value:""};break;case"SELECT_OPTION":e={id:be(),type:n,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:be(),type:n,url:""};case"TAB":e={id:be(),type:n,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:be(),type:n,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:be(),type:n,url:"",query:""};break;case"LOCAL_STORAGE":e={id:be(),type:n,key:"",value:""};break;case"JAVASCRIPT":e={id:be(),type:n,code:""};break;case"AI_ASSERTION":e={id:be(),type:n,assertion:""};break;case"FILE_UPLOAD":{e={id:be(),type:n,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:be(),type:n,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:be(),type:n,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:be(),type:n,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:be(),type:n,key:""};break}case"RECORD_REQUESTS":{e={id:be(),type:n,pattern:"",key:""};break}case"GET_RECORDED_REQUESTS":{e={id:be(),type:n,key:""};break}case"SET_HEADER":{e={id:be(),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 cm(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 qT}from"zod";var sD=qT.discriminatedUnion("type",[ji,Ec,Fi,Ui,Hi,zi,Bi,To,Eo,Co,Ro,$i,Wi,Vi,Gi]);function dm(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as KT}from"zod";var wt={type:!0,cache:!0},Ir=KT.discriminatedUnion("type",[es.pick(wt),ji.pick(wt),Fi.pick(wt),Ui.pick(wt),Gi.pick(wt),Hi.pick(wt),zi.pick(wt),Bi.pick(wt),To.pick(wt),Eo.pick(wt),Co.pick(wt),Ro.pick(wt),$i.pick(wt),Wi.pick(wt),Vi.pick(wt)]),Ac=Object.values(Ue).filter(n=>Ir.options.some(e=>e.shape.type.safeParse(n).success));Ao.options.forEach(n=>{if("target"in n.shape&&!Ac.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as Pc}from"zod";import{z as Ic}from"zod";import{z as Io}from"zod";var It=Io.object({index:Io.number().optional().describe("global index within a test (in-order traversal)"),id:Io.string(),skipped:Io.boolean().optional(),envKey:Io.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:Io.boolean().optional()});Ce(Ic);var Pt=It.extend({type:Ic.literal("PRESET_ACTION"),command:Ao,skipped:Ic.boolean().optional()}).openapi({ref:"PresetAction"});Ce(Pc);var Pr=It.extend({type:Pc.literal("AI_ACTION"),text:Pc.string(),steps:Pt.array().optional()}).openapi({ref:"AIAction"});import{z as de}from"zod";var YT=de.object({cacheKey:de.string(),cacheExpiryMs:de.number()}),Lc=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:YT.optional()}),Hn=Lc.extend({type:de.literal("MODULE"),moduleId:de.string().uuid()}),JT=de.union([Hn.pick({type:!0,moduleId:!0}),de.record(de.unknown())]),XT=de.object({type:de.literal("URL_REGEX"),regex:de.string()}),ZT=de.object({type:de.literal("PAGE_CHECK"),substring:de.string()}),Oc=de.object({cacheInvalidation:de.discriminatedUnion("type",[ZT,XT]).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:Oc.nullish()});import{z as at}from"zod";import{z as Mc}from"zod";Ce(Mc);var Po=It.extend({type:Mc.literal("AI_ACTION_DYNAMIC"),text:Mc.string()}).openapi({ref:"AIActionDynamic"});import{z as pm}from"zod";var Nc=It.extend({type:pm.literal("CONDITIONAL"),skipped:pm.boolean().optional()});import{z as ns}from"zod";var QT=ns.object({type:ns.literal("url"),url:ns.string()}),qi=It.extend({type:ns.literal("IFRAME"),identifier:QT});import{z as Kt}from"zod";var kc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(kc||{});var eE=Kt.discriminatedUnion("type",[Kt.object({type:Kt.literal("NAVIGATE_URL"),url:Kt.string().url()}),Kt.object({type:Kt.literal("GO_TO_SECTION_START")})]),tE=Kt.object({trigger:Kt.nativeEnum(kc).optional(),attempts:Kt.number().int().optional(),restartBehavior:eE}),Ki=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:tE.optional()});var um=Lt.merge(Lc).extend({type:at.literal("RESOLVED_MODULE"),steps:at.lazy(()=>Pe.array())}),_c=Lt.extend({steps:at.lazy(()=>Pe.array())}),Dc=qi.extend({steps:at.lazy(()=>xe.array())}),nE=qi.extend({steps:at.lazy(()=>Pe.array())}),Fc=Ki.extend({steps:at.lazy(()=>xe.array())}),rE=Ki.extend({steps:at.lazy(()=>Pe.array())}),Lr=Nc.extend({blocks:at.object({assertion:at.lazy(()=>Pt),steps:at.lazy(()=>xe.array())}).array(),elseSteps:at.lazy(()=>xe.array().optional())}),oE=Nc.extend({blocks:at.object({assertion:at.lazy(()=>Pt),steps:at.lazy(()=>Pe.array())}).array(),elseSteps:at.lazy(()=>Pe.array().optional())}),xe=at.discriminatedUnion("type",[Pt,Pr,Po,Hn,Lr,Dc,Fc]),Pe=at.discriminatedUnion("type",[Pt,Pr,Po,um,oE,nE,rE]);import{z as Yt}from"zod";var iE=Yt.object({steps:xe.array(),beforeSteps:xe.array().nullish(),afterSteps:xe.array().nullish()}),Lo=Yt.object({steps:Pe.array(),beforeSteps:Pe.array().nullish(),afterSteps:Pe.array().nullish()}),Or=Yt.object({steps:Yt.record(Yt.string(),Yt.unknown()).array(),beforeSteps:Yt.record(Yt.string(),Yt.unknown()).array().nullish(),afterSteps:Yt.record(Yt.string(),Yt.unknown()).array().nullish()});var De="1.0.20";import{z as ar}from"zod";var Uc=ar.object({key:ar.string(),testId:ar.string().optional(),moduleId:ar.string().optional(),organizationId:ar.string(),value:Ir}),aE=Uc.extend({uniqueKey:ar.string()}),mm=ar.record(ar.string(),aE);var hm=D.object({phrase:D.string()}),Bc=D.object({thoughts:D.string().optional(),result:D.union([D.literal("NOT_FOUND"),D.string(),D.number(),D.array(D.unknown()),D.record(D.unknown(),D.unknown()),D.unknown()])}),s0=D.object({text:D.string()}),gm=D.object({thoughts:D.string(),review:D.string().optional(),id:D.number().int(),updatedMemory:bc.optional()}),rs=(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))(rs||{});var fm=D.object({thoughts:D.string(),category:D.nativeEnum(rs)}),sE=D.discriminatedUnion("op",[D.object({op:D.literal("replace"),path:D.string(),value:D.string()}),D.object({op:D.literal("add"),path:D.string(),value:D.string()}),D.object({op:D.literal("remove"),path:D.string()})]),l0=D.object({thoughts:D.string(),patches:sE.array()}),Sm=[D.literal("add"),D.literal("replace"),D.literal("remove")],lE=D.object({op:D.union(Sm),path:D.string(),value:Pe.optional()}),ym=D.object({patches:lE.array(),thoughts:D.string()});var cE=D.object({thoughts:D.string(),op:D.union(Sm),value:D.union([D.null(),Pe])}),bm=D.object({reasoning:D.string(),scenario:D.string(),patch:cE.or(D.null())}),c0=D.object({thoughts:D.string(),evaluation:D.number().min(1).max(10)}),d0=D.object({observations:D.string(),reasoning:D.string(),command:ts});var zc=D.object({summary:D.string(),reasoning:D.string(),evaluation:D.discriminatedUnion("type",[D.object({type:D.literal("DONE")}),D.object({type:D.literal("RIGHT_TRACK")}),D.object({type:D.literal("WRONG_TRACK"),feedback:D.string()}),D.object({type:D.literal("IMPOSSIBLE")})])});import{z as O}from"zod";import*as ee from"zod";var f0=ee.object({thoughts:ee.string().optional().describe("only provided if a description was provided"),target:Ar.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")}),os=ee.union([ee.literal("ELEMENT_CHECK"),ee.literal("NEGATED_CHECK"),ee.literal("SELECT_OPTION"),ee.literal("TYPE")]);function Mr(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.condition==="EXISTS"&&n.assertion.negated)return"NEGATED_CHECK";if(n.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Yi=(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))(Yi||{}),Oo=ee.object({matched:ee.boolean(),reason:ee.string().optional().describe("Human understandable description"),logs:ee.string().array().optional().describe("Logs for debugging")}),dE=Oo.extend({type:ee.literal("USER_SELECTOR")}),pE=Oo.extend({type:ee.literal("CSS_SELECTOR"),selectors:ee.string().array()}),uE=Oo.extend({type:ee.literal("HYBRID_SELECTOR")}),mE=Oo.extend({type:ee.literal("HTML_DISTANCE"),distance:ee.number().optional(),closestElement:ee.string().optional(),savedElement:ee.string().optional()}),hE=Oo.extend({type:ee.literal("TEMPLATE_MATCHING"),elementImageUrl:ee.string().url()}),gE=Oo.extend({type:ee.literal("AUTO_FRAME"),logs:ee.string().array().optional()}),wm=ee.discriminatedUnion("type",[dE,pE,uE,mE,hE,gE]);import{z as ta}from"zod";import{z as FC}from"zod";import*as X from"zod";import{cloneDeep as Zi}from"lodash-es";var fE=n=>{let e=vm(n,0);if(e===void 0||!yE(n[e]))return;let t=vm(n,e+1);if(t!==void 0)return bE(n,e,t)},xm=fE,vm=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!SE(r))return t}},SE=n=>n===" "||n===" "||n===`
|
|
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]="b0845e06-7095-5593-aec8-788dac9a2286")}catch(e){}}();
|
|
4
|
+
var $x=Object.create;var Ju=Object.defineProperty;var Gx=Object.getOwnPropertyDescriptor;var Wx=Object.getOwnPropertyNames;var Vx=Object.getPrototypeOf,qx=Object.prototype.hasOwnProperty;var Xu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var Kx=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Wx(e))!qx.call(n,o)&&o!==t&&Ju(n,o,{get:()=>e[o],enumerable:!(r=Gx(e,o))||r.enumerable});return n};var Yx=(n,e,t)=>(t=n!=null?$x(Vx(n)):{},Kx(e||!n||!n.__esModule?Ju(t,"default",{value:n,enumerable:!0}):t,n));var pS=Xu((b3,dS)=>{"use strict";dS.exports=lS;function lS(n,e,t){n instanceof RegExp&&(n=sS(n,t)),e instanceof RegExp&&(e=sS(e,t));var r=cS(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 sS(n,e){var t=e.match(n);return t?t[0]:null}lS.range=cS;function cS(n,e,t){var r,o,i,a,s,l=t.indexOf(n),c=t.indexOf(e,l+1),d=l;if(l>=0&&c>0){if(n===e)return[l,c];for(r=[],i=t.length;d>=0&&!s;)d==l?(r.push(d),l=t.indexOf(n,d+1)):r.length==1?s=[r.pop(),c]:(o=r.pop(),o<i&&(i=o,a=c),c=t.indexOf(e,d+1)),d=l<c&&l>=0?l:c;r.length&&(s=[i,a])}return s}});var bS=Xu((w3,yS)=>{"use strict";var uS=pS();yS.exports=WA;var mS="\0SLASH"+Math.random()+"\0",hS="\0OPEN"+Math.random()+"\0",Fd="\0CLOSE"+Math.random()+"\0",gS="\0COMMA"+Math.random()+"\0",fS="\0PERIOD"+Math.random()+"\0";function Dd(n){return parseInt(n,10)==n?parseInt(n,10):n.charCodeAt(0)}function $A(n){return n.split("\\\\").join(mS).split("\\{").join(hS).split("\\}").join(Fd).split("\\,").join(gS).split("\\.").join(fS)}function GA(n){return n.split(mS).join("\\").split(hS).join("{").split(Fd).join("}").split(gS).join(",").split(fS).join(".")}function SS(n){if(!n)return[""];var e=[],t=uS("{","}",n);if(!t)return n.split(",");var r=t.pre,o=t.body,i=t.post,a=r.split(",");a[a.length-1]+="{"+o+"}";var s=SS(i);return i.length&&(a[a.length-1]+=s.shift(),a.push.apply(a,s)),e.push.apply(e,a),e}function WA(n){return n?(n.substr(0,2)==="{}"&&(n="\\{\\}"+n.substr(2)),Sa($A(n),!0).map(GA)):[]}function VA(n){return"{"+n+"}"}function qA(n){return/^-?0\d/.test(n)}function KA(n,e){return n<=e}function YA(n,e){return n>=e}function Sa(n,e){var t=[],r=uS("{","}",n);if(!r)return[n];var o=r.pre,i=r.post.length?Sa(r.post,!1):[""];if(/\$$/.test(r.pre))for(var a=0;a<i.length;a++){var s=o+"{"+r.body+"}"+i[a];t.push(s)}else{var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(r.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(r.body),d=l||c,p=r.body.indexOf(",")>=0;if(!d&&!p)return r.post.match(/,.*\}/)?(n=r.pre+"{"+r.body+Fd+r.post,Sa(n)):[n];var u;if(d)u=r.body.split(/\.\./);else if(u=SS(r.body),u.length===1&&(u=Sa(u[0],!1).map(VA),u.length===1))return i.map(function(H){return r.pre+u[0]+H});var m;if(d){var h=Dd(u[0]),g=Dd(u[1]),f=Math.max(u[0].length,u[1].length),S=u.length==3?Math.abs(Dd(u[2])):1,w=KA,x=g<h;x&&(S*=-1,w=YA);var y=u.some(qA);m=[];for(var E=h;w(E,g);E+=S){var C;if(c)C=String.fromCharCode(E),C==="\\"&&(C="");else if(C=String(E),y){var R=f-C.length;if(R>0){var L=new Array(R+1).join("0");E<0?C="-"+L+C.slice(1):C=L+C}}m.push(C)}}else{m=[];for(var M=0;M<u.length;M++)m.push.apply(m,Sa(u[M],!1))}for(var M=0;M<m.length;M++)for(var a=0;a<i.length;a++){var s=o+m[M]+i[a];(!e||d||s)&&t.push(s)}}return t}});var ki=(n,e)=>{},yc=!1;try{let n=await import("@sentry/node");ki=n.captureException,n.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),yc=!0}catch{}import{Command as h_,Option as Vt}from"@commander-js/extra-typings";import{execSync as g_}from"child_process";import vv from"body-parser";import YN from"cors";import JN from"dedent";import XN from"events";import xv,{Router as ZN}from"express";import{diff as zA}from"deep-object-diff";import hn from"fs";import Xr from"path";import{diff as uA}from"deep-object-diff";import{z as Zu}from"zod";var A_=Zu.object({input:Zu.string()});import{z as Ke}from"zod";var L_=Ke.object({srcs:Ke.array(Ke.string()),urls:Ke.array(Ke.string()),desiredSrc:Ke.string().optional(),desiredUrl:Ke.string().optional()}),Qu=Ke.object({srcRegex:Ke.string().optional(),urlRegex:Ke.string().optional()}),em=Ke.object({x:Ke.number(),y:Ke.number(),correlation:Ke.number()}),O_=Ke.object({searchImageBase64String:Ke.string(),pageImageBase64String:Ke.string(),id:Ke.string().uuid(),timeoutMs:Ke.number().max(1e4).min(0).optional()});import{z as D}from"zod";import*as F 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}}Ce(F);var or=(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))(or||{}),Jx=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),bc=F.object({result:F.number(),traceId:F.string()}).array(),_i=F.object({type:F.literal("GCS_TRACES"),traces:bc}),Ar=F.object({id:F.number().int(),dataMomenticId:F.number().int().optional(),selector:F.string().optional(),hybridSelector:F.object({textContent:F.string().or(F.null()),attributes:F.record(F.string(),F.string()),tagName:F.string(),expandShadowRoot:F.boolean(),classNames:F.string().array(),nthChild:F.number()}).array().optional(),generatedSelectors:F.string().array().optional(),role:F.string().optional(),name:F.string().optional(),numChildren:F.number().optional(),content:F.string().optional(),pathFromRoot:F.string().optional(),serializedForm:F.string().optional(),nodeOnlySerializedForm:F.string().optional(),serializedHtml:F.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:F.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:F.string().url().optional(),boundingBox:F.object({x:F.number().optional(),y:F.number().optional(),width:F.number(),height:F.number()}).describe("css pixel bounding box").optional(),frameCache:Jx.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(or).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional(),memory:_i.optional()}).openapi({ref:"ElementTargetCache"});function tm(n){return!!(n.name||n.role||n.content||n.serializedForm||n.serializedHtml||n.screenshotUrl)}var Xx=F.object({type:F.literal("description"),elementDescriptor:F.string(),a11yData:Ar.optional().describe("DEPRECATED: new a11y cache is stored in DB and resolved into the 'cache' field")}).openapi({ref:"DescriptionTarget"}),Zx=F.object({x:F.number(),y:F.number()}),Qx=F.object({type:F.literal("coordinates"),pixels:Zx}).openapi({ref:"CoordinatesTarget"});function ir(n){return n.type==="description"}function En(n){return n.type==="coordinates"}var pt=F.discriminatedUnion("type",[Xx,Qx]).openapi({ref:"ElementTarget"});function wc(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{v4 as be}from"uuid";import*as v from"zod";import{z as ye}from"zod";import{z as wo}from"zod";var vc=wo.object({result:wo.boolean(),traceId:wo.string()}).array(),xc=wo.object({type:wo.literal("GCS_TRACES"),traces:vc}),nm=wo.object({memory:xc.optional()});var Ya=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};Ce(ye);var rm=ye.object({plan:ye.string().optional(),evidence:ye.string().optional(),thoughts:ye.string(),result:ye.boolean(),relevantElements:ye.array(ye.number()).optional(),updatedMemory:vc.optional()}),vo=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(vo||{});var eT=ye.object({type:ye.literal("ELEMENT_CONTENT"),negated:ye.boolean().optional(),operation:ye.nativeEnum(vo),value:ye.string()}).openapi({ref:"ElementContentAssertion"}),tT=ye.object({type:ye.literal("ELEMENT_ATTRIBUTE"),negated:ye.boolean().optional(),operation:ye.nativeEnum(vo),attr:ye.string(),value:ye.string()}).openapi({ref:"ElementAttributeValueAssertion"}),xo=(o=>(o.EXISTS="EXISTS",o.VISIBLE="VISIBLE",o.ENABLED="ENABLED",o.EDITABLE="EDITABLE",o))(xo||{}),nT=ye.object({type:ye.literal("ELEMENT_EXISTENCE"),negated:ye.boolean().optional(),condition:ye.nativeEnum(xo).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),om=ye.discriminatedUnion("type",[eT,tT,nT]).openapi({ref:"ManualElementAssertion"});var rT=ye.object({type:ye.literal("CONTENT"),negated:ye.boolean().optional(),value:ye.string()}).openapi({ref:"PageContentAssertion"}),im=ye.discriminatedUnion("type",[rT]).openapi({ref:"ManualPageAssertion"});import{z as ie}from"zod";var Ja=ie.object({url:ie.string(),method:ie.union([ie.literal("GET"),ie.literal("POST"),ie.literal("PUT"),ie.literal("DELETE"),ie.literal("PATCH")]),headers:ie.record(ie.string(),ie.string()).optional(),params:ie.record(ie.string(),ie.string()).optional(),body:ie.string().optional(),timeout:ie.number().int().optional().describe("Max seconds to wait for the request to complete")}),am=ie.object({url:ie.string(),headers:ie.record(ie.string(),ie.string()).optional(),query:ie.string(),variables:ie.record(ie.string(),ie.string()).optional(),timeout:ie.number().int().optional().describe("Max seconds to wait for the request to complete")}),Xa=ie.object({code:ie.string(),fragment:ie.boolean().optional(),environment:ie.union([ie.literal("NODE"),ie.literal("BROWSER")]).optional().describe("default NODE"),timeout:ie.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ue=(j=>(j.AI_EXTRACT="AI_EXTRACT",j.AI_ASSERTION="AI_ASSERTION",j.AUTH_LOAD="AUTH_LOAD",j.AUTH_SAVE="AUTH_SAVE",j.BLUR="BLUR",j.CAPTCHA="CAPTCHA",j.CLICK="CLICK",j.COOKIE="COOKIE",j.COPY="COPY",j.DIALOG="DIALOG",j.DRAG="DRAG",j.ELEMENT_CHECK="ELEMENT_CHECK",j.FILE_UPLOAD="FILE_UPLOAD",j.FOCUS="FOCUS",j.GO_BACK="GO_BACK",j.GO_FORWARD="GO_FORWARD",j.HOVER="HOVER",j.JAVASCRIPT="JAVASCRIPT",j.LOCAL_STORAGE="LOCAL_STORAGE",j.MOUSE_DRAG="MOUSE_DRAG",j.NAVIGATE="NAVIGATE",j.NEW_TAB="NEW_TAB",j.PAGE_CHECK="PAGE_CHECK",j.PASTE="PASTE",j.PRESS="PRESS",j.KEY_DOWN="KEY_DOWN",j.KEY_UP="KEY_UP",j.REFRESH="REFRESH",j.REQUEST="REQUEST",j.GRAPHQL_REQUEST="GRAPHQL_REQUEST",j.SCROLL_DOWN="SCROLL_DOWN",j.SCROLL_UP="SCROLL_UP",j.SCROLL_LEFT="SCROLL_LEFT",j.SCROLL_RIGHT="SCROLL_RIGHT",j.SELECT_OPTION="SELECT_OPTION",j.SWITCH_TAB="TAB",j.TYPE="TYPE",j.VISUAL_DIFF="VISUAL_DIFF",j.WAIT="WAIT",j.WAIT_FOR_URL="WAIT_FOR_URL",j.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",j.AWAIT_LISTENER="AWAIT_LISTENER",j.RECORD_REQUESTS="RECORD_REQUESTS",j.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",j.SET_HEADER="SET_HEADER",j.SUCCESS="SUCCESS",j))(Ue||{});Ce(v);var Y=v.object({thoughts:v.string().optional(),id:v.string().uuid().describe("unique identifier to this step, used for step cache")}),qt=v.object({useSelector:v.boolean().optional(),force:v.boolean().optional(),disableCache:v.boolean().optional().describe("disable element caching for this step"),iframeUrl:v.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Cn=v.object({target:Ar}).optional().openapi({ref:"SingleTargetCache"}),Za=v.object({loadTimeout:v.number().int().max(60).optional().describe("Max seconds for the page to load")}),oT=Y.merge(Za).merge(v.object({type:v.literal("NAVIGATE"),url:v.string()})).openapi({ref:"NavigateCommand"}),Qa=qt.merge(v.object({cache:Cn})),To=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_UP"),deltaY:v.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Eo=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_DOWN"),deltaY:v.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Co=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_LEFT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Ro=Y.merge(Qa.merge(v.object({target:pt.optional(),type:v.literal("SCROLL_RIGHT"),deltaX:v.number().optional()}))).openapi({ref:"ScrollRightCommand"}),nD=v.discriminatedUnion("type",[To,Eo,Co,Ro]).openapi({ref:"AllScrollCommands"}),iT=Y.merge(v.object({type:v.literal("DIALOG"),action:v.union([v.literal("ACCEPT"),v.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),aT=Y.merge(v.object({type:v.literal("WAIT"),delay:v.number()})).openapi({ref:"WaitCommand"}),sT=v.discriminatedUnion("type",[v.object({type:v.literal("SUBSTRING"),url:v.string()}),v.object({type:v.literal("GLOB"),glob:v.string()}),v.object({type:v.literal("REGEX"),regex:v.string()})]),lT=v.object({caseInsensitive:v.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:v.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:v.number().int().optional().describe("Max seconds to wait for the URL to match")}),cT=Y.extend({type:v.literal("WAIT_FOR_URL"),matcher:sT}).merge(lT).openapi({ref:"WaitUrlCommand"}),dT=Y.merge(Za).merge(v.object({type:v.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),pT=Y.merge(v.object({type:v.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),uT=Y.merge(v.object({type:v.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),mT=Y.extend({type:v.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),hT=Y.extend({type:v.literal("AUTH_LOAD"),storageState:v.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Ec=Y.merge(qt).extend({type:v.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),gT=Y.extend({type:v.literal("COPY"),value:v.string()}).openapi({ref:"CopyCommand"}),fT=Y.extend({type:v.literal("PASTE")}).openapi({ref:"PasteCommand"}),ST=Y.merge(Xa).extend({type:v.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Fi=Y.merge(qt).extend({type:v.literal("CLICK"),target:pt,doubleClick:v.boolean().optional(),rightClick:v.boolean().optional(),waitForDownload:v.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:v.number().optional(),downloadTimeoutMs:v.number().optional(),cache:Cn,relativePosition:v.object({x:v.number(),y:v.number()}).optional()}).openapi({ref:"ClickCommand"}),Ui=Y.merge(qt).merge(v.object({type:v.literal("DRAG"),fromTarget:pt,toTarget:pt,steps:v.number().optional(),hoverSeconds:v.number().optional().describe("Seconds to hover the object before dropping"),cache:v.object({fromTarget:Ar.optional(),toTarget:Ar.optional()}).optional()})).openapi({ref:"DragCommand"}),Bi=Y.merge(qt).merge(v.object({type:v.literal("MOUSE_DRAG"),target:pt.optional(),deltaX:v.string().describe("pixels to move horizontally, can be template"),deltaY:v.string().describe("pixels to move vertically, can be template"),steps:v.number().optional(),cache:Cn})).openapi({ref:"MouseDragCommand"}),zi=Y.merge(qt).merge(v.object({type:v.literal("HOVER"),target:pt,cache:Cn})).openapi({ref:"HoverCommand"}),Hi=Y.merge(qt).merge(v.object({type:v.literal("FOCUS"),target:pt,cache:Cn})).openapi({ref:"FocusCommand"}),ji=Y.merge(qt).extend({type:v.literal("BLUR"),target:pt.optional(),cache:Cn}).openapi({ref:"BlurCommand"}),yT=v.object({type:v.literal("URL"),url:v.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),bT=v.object({type:v.literal("USER_FILE"),name:v.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),wT=Y.extend({type:v.literal("FILE_UPLOAD"),fileSource:v.discriminatedUnion("type",[yT,bT]),filename:v.string().optional()}).openapi({ref:"FileUploadCommand"}),vT=v.discriminatedUnion("type",[v.object({type:v.literal("VALUE"),value:v.string()}),v.object({type:v.literal("LABEL"),label:v.string()}),v.object({type:v.literal("INDEX"),index:v.coerce.string()})]),$i=Y.merge(qt).extend({type:v.literal("SELECT_OPTION"),target:pt,cache:Cn,choice:vT.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Cc=v.union([v.literal("MULTIMODAL"),v.literal("VISION_ONLY")]),es=Y.merge(v.object({type:v.literal("AI_ASSERTION"),assertion:v.string(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional(),contextChoice:Cc.optional(),timeout:v.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:nm.optional()})).openapi({ref:"AIAssertionCommand"}),Rn=5,Rc=600,Gi=Y.merge(qt).extend({type:v.literal("ELEMENT_CHECK"),target:pt,assertion:om,cache:Cn,timeout:v.number().int().min(0).max(Rc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),xT=Y.extend({type:v.literal("PAGE_CHECK"),assertion:im,iframeUrl:v.string().optional().describe("url or url regex for the iframe"),timeout:v.number().int().min(0).max(Rc).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),TT=Y.merge(v.object({type:v.literal("AI_EXTRACT"),goal:v.string(),schema:v.string().optional(),envKey:v.string().optional(),disableCache:v.boolean().optional(),iframeUrl:v.string().optional()})).openapi({ref:"AIExtractCommand"}),ET=v.object({clearContent:v.boolean().optional(),forceClearContent:v.boolean().optional(),delay:v.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:v.boolean().optional(),pressEnter:v.boolean().optional()}),sm=25,Wi=Y.merge(qt).merge(ET).extend({type:v.literal("TYPE"),target:pt.optional(),value:v.string(),cache:Cn}).openapi({ref:"TypeCommand"}),CT=Y.merge(v.object({type:v.literal("PRESS"),value:v.string(),repeat:v.number().optional(),convertMeta:v.boolean().optional(),delayMs:v.number().optional()})).openapi({ref:"PressCommand"}),RT=Y.merge(v.object({type:v.literal("KEY_DOWN"),value:v.string(),convertMeta:v.boolean().optional()})).openapi({ref:"KeyDownCommand"}),AT=Y.merge(v.object({type:v.literal("KEY_UP"),value:v.string(),convertMeta:v.boolean().optional()})).openapi({ref:"KeyUpCommand"}),IT=v.object({type:v.literal("SUBSTRING"),substring:v.string()}),PT=v.object({type:v.literal("REGEX"),pattern:v.string()}),LT=v.object({type:v.literal("INDEX"),index:v.coerce.string()}),OT=v.discriminatedUnion("type",[IT,PT,LT]),MT=Y.merge(Za).merge(v.object({type:v.literal("TAB"),action:OT})).openapi({ref:"TabCommand"}),NT=Y.merge(Za).merge(v.object({type:v.literal("NEW_TAB"),url:v.string()})).openapi({ref:"NewTabCommand"}),kT=Y.merge(v.object({type:v.literal("COOKIE"),value:v.string()})).openapi({ref:"CookieCommand"}),_T=Y.merge(v.object({type:v.literal("LOCAL_STORAGE"),key:v.string(),value:v.string()})).openapi({ref:"LocalStorageCommand"}),DT=Y.extend({type:v.literal("REQUEST")}).merge(Ja).openapi({ref:"RequestCommand"}),FT=Y.extend({type:v.literal("GRAPHQL_REQUEST")}).merge(am).openapi({ref:"GraphQLRequestCommand"}),UT=Y.merge(v.object({type:v.literal("SUCCESS"),condition:es.optional()})).openapi({ref:"SuccessCommand"}),BT=Y.merge(v.object({type:v.literal("FAILURE")})).openapi({ref:"FailureCommand"}),zT=v.object({data:v.string().describe("location at which to find a jpg"),width:v.number(),height:v.number()}),Vi=Y.merge(qt).merge(v.object({type:v.literal("VISUAL_DIFF"),threshold:v.number().optional().describe("default 0.1"),target:pt.optional(),screenshot:zT.optional(),cache:Cn})).openapi({ref:"VisualDiffCommand"}),HT=Y.merge(v.object({type:v.literal("REGISTER_REQUEST_LISTENER"),pattern:v.string(),key:v.string()})).openapi({ref:"RegisterRequestListenerCommand"}),jT=Y.merge(v.object({type:v.literal("AWAIT_LISTENER"),key:v.string(),timeout:v.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),$T=Y.merge(v.object({type:v.literal("RECORD_REQUESTS"),pattern:v.string(),key:v.string()})).openapi({ref:"RecordRequestsCommand"}),GT=Y.merge(v.object({type:v.literal("GET_RECORDED_REQUESTS"),key:v.string()})).openapi({ref:"GetRecordedRequestsCommand"}),WT=Y.merge(v.object({type:v.literal("SET_HEADER"),name:v.string(),value:v.string(),urlPattern:v.string().optional().describe("URL pattern to match")})).openapi({ref:"SetHeaderCommand"}),lm=v.discriminatedUnion("type",[Fi,Wi,CT,RT,AT,$i,oT,Eo,To,es,zi,aT,UT]),VT=v.discriminatedUnion("type",[TT,hT,mT,Ec,kT,gT,iT,Ui,Gi,wT,pT,uT,ST,_T,Bi,NT,xT,fT,dT,DT,FT,Co,Ro,MT,Vi,Hi,ji,cT,HT,jT,$T,GT,WT]),Ao=v.discriminatedUnion("type",[...lm.options,...VT.options]).openapi({ref:"Command"}),ts=v.discriminatedUnion("type",[...lm.options,BT]);function zn(n){let e;switch(n){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:be(),type:n};break;case"AUTH_LOAD":{e={id:be(),type:n,storageState:""};break}case"AI_EXTRACT":e={id:be(),type:n,goal:""};break;case"DIALOG":e={id:be(),type:n,action:"DISMISS"};break;case"DRAG":e={id:be(),type:n,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:be(),type:n,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:be(),type:n,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:be(),type:n,delay:1};break;case"BLUR":e={id:be(),type:n};break;case"HOVER":case"FOCUS":case"CLICK":e={id:be(),type:n,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:be(),type:n,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:be(),type:n,value:""};break;case"SELECT_OPTION":e={id:be(),type:n,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:be(),type:n,url:""};case"TAB":e={id:be(),type:n,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:be(),type:n,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:be(),type:n,url:"",query:""};break;case"LOCAL_STORAGE":e={id:be(),type:n,key:"",value:""};break;case"JAVASCRIPT":e={id:be(),type:n,code:""};break;case"AI_ASSERTION":e={id:be(),type:n,assertion:""};break;case"FILE_UPLOAD":{e={id:be(),type:n,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:be(),type:n,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:be(),type:n,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:be(),type:n,pattern:"",key:""};break}case"AWAIT_LISTENER":{e={id:be(),type:n,key:""};break}case"RECORD_REQUESTS":{e={id:be(),type:n,pattern:"",key:""};break}case"GET_RECORDED_REQUESTS":{e={id:be(),type:n,key:""};break}case"SET_HEADER":{e={id:be(),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 cm(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 qT}from"zod";var sD=qT.discriminatedUnion("type",[ji,Ec,Fi,Ui,Hi,zi,Bi,To,Eo,Co,Ro,$i,Wi,Vi,Gi]);function dm(n){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(n)}import{z as KT}from"zod";var wt={type:!0,cache:!0},Ir=KT.discriminatedUnion("type",[es.pick(wt),ji.pick(wt),Fi.pick(wt),Ui.pick(wt),Gi.pick(wt),Hi.pick(wt),zi.pick(wt),Bi.pick(wt),To.pick(wt),Eo.pick(wt),Co.pick(wt),Ro.pick(wt),$i.pick(wt),Wi.pick(wt),Vi.pick(wt)]),Ac=Object.values(Ue).filter(n=>Ir.options.some(e=>e.shape.type.safeParse(n).success));Ao.options.forEach(n=>{if("target"in n.shape&&!Ac.includes(n.shape.type.value))throw new Error(`Command ${n.shape.type.value} has a target but no cache`)});import{z as Pc}from"zod";import{z as Ic}from"zod";import{z as Io}from"zod";var It=Io.object({index:Io.number().optional().describe("global index within a test (in-order traversal)"),id:Io.string(),skipped:Io.boolean().optional(),envKey:Io.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:Io.boolean().optional()});Ce(Ic);var Pt=It.extend({type:Ic.literal("PRESET_ACTION"),command:Ao,skipped:Ic.boolean().optional()}).openapi({ref:"PresetAction"});Ce(Pc);var Pr=It.extend({type:Pc.literal("AI_ACTION"),text:Pc.string(),steps:Pt.array().optional()}).openapi({ref:"AIAction"});import{z as de}from"zod";var YT=de.object({cacheKey:de.string(),cacheExpiryMs:de.number()}),Lc=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:YT.optional()}),Hn=Lc.extend({type:de.literal("MODULE"),moduleId:de.string().uuid()}),JT=de.union([Hn.pick({type:!0,moduleId:!0}),de.record(de.unknown())]),XT=de.object({type:de.literal("URL_REGEX"),regex:de.string()}),ZT=de.object({type:de.literal("PAGE_CHECK"),substring:de.string()}),Oc=de.object({cacheInvalidation:de.discriminatedUnion("type",[ZT,XT]).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:Oc.nullish()});import{z as at}from"zod";import{z as Mc}from"zod";Ce(Mc);var Po=It.extend({type:Mc.literal("AI_ACTION_DYNAMIC"),text:Mc.string()}).openapi({ref:"AIActionDynamic"});import{z as pm}from"zod";var Nc=It.extend({type:pm.literal("CONDITIONAL"),skipped:pm.boolean().optional()});import{z as ns}from"zod";var QT=ns.object({type:ns.literal("url"),url:ns.string()}),qi=It.extend({type:ns.literal("IFRAME"),identifier:QT});import{z as Kt}from"zod";var kc=(r=>(r.ALWAYS="ALWAYS",r.ON_FAILURE="ON_FAILURE",r.ON_ACTION_FAILURE="ON_ACTION_FAILURE",r))(kc||{});var eE=Kt.discriminatedUnion("type",[Kt.object({type:Kt.literal("NAVIGATE_URL"),url:Kt.string().url()}),Kt.object({type:Kt.literal("GO_TO_SECTION_START")})]),tE=Kt.object({trigger:Kt.nativeEnum(kc).optional(),attempts:Kt.number().int().optional(),restartBehavior:eE}),Ki=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:tE.optional()});var um=Lt.merge(Lc).extend({type:at.literal("RESOLVED_MODULE"),steps:at.lazy(()=>Pe.array())}),_c=Lt.extend({steps:at.lazy(()=>Pe.array())}),Dc=qi.extend({steps:at.lazy(()=>xe.array())}),nE=qi.extend({steps:at.lazy(()=>Pe.array())}),Fc=Ki.extend({steps:at.lazy(()=>xe.array())}),rE=Ki.extend({steps:at.lazy(()=>Pe.array())}),Lr=Nc.extend({blocks:at.object({assertion:at.lazy(()=>Pt),steps:at.lazy(()=>xe.array())}).array(),elseSteps:at.lazy(()=>xe.array().optional())}),oE=Nc.extend({blocks:at.object({assertion:at.lazy(()=>Pt),steps:at.lazy(()=>Pe.array())}).array(),elseSteps:at.lazy(()=>Pe.array().optional())}),xe=at.discriminatedUnion("type",[Pt,Pr,Po,Hn,Lr,Dc,Fc]),Pe=at.discriminatedUnion("type",[Pt,Pr,Po,um,oE,nE,rE]);import{z as Yt}from"zod";var iE=Yt.object({steps:xe.array(),beforeSteps:xe.array().nullish(),afterSteps:xe.array().nullish()}),Lo=Yt.object({steps:Pe.array(),beforeSteps:Pe.array().nullish(),afterSteps:Pe.array().nullish()}),Or=Yt.object({steps:Yt.record(Yt.string(),Yt.unknown()).array(),beforeSteps:Yt.record(Yt.string(),Yt.unknown()).array().nullish(),afterSteps:Yt.record(Yt.string(),Yt.unknown()).array().nullish()});var De="1.0.20";import{z as ar}from"zod";var Uc=ar.object({key:ar.string(),testId:ar.string().optional(),moduleId:ar.string().optional(),organizationId:ar.string(),value:Ir}),aE=Uc.extend({uniqueKey:ar.string()}),mm=ar.record(ar.string(),aE);var hm=D.object({phrase:D.string()}),Bc=D.object({thoughts:D.string().optional(),result:D.union([D.literal("NOT_FOUND"),D.string(),D.number(),D.array(D.unknown()),D.record(D.unknown(),D.unknown()),D.unknown()])}),s0=D.object({text:D.string()}),gm=D.object({thoughts:D.string(),review:D.string().optional(),id:D.number().int(),updatedMemory:bc.optional()}),rs=(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))(rs||{});var fm=D.object({thoughts:D.string(),category:D.nativeEnum(rs)}),sE=D.discriminatedUnion("op",[D.object({op:D.literal("replace"),path:D.string(),value:D.string()}),D.object({op:D.literal("add"),path:D.string(),value:D.string()}),D.object({op:D.literal("remove"),path:D.string()})]),l0=D.object({thoughts:D.string(),patches:sE.array()}),Sm=[D.literal("add"),D.literal("replace"),D.literal("remove")],lE=D.object({op:D.union(Sm),path:D.string(),value:Pe.optional()}),ym=D.object({patches:lE.array(),thoughts:D.string()});var cE=D.object({thoughts:D.string(),op:D.union(Sm),value:D.union([D.null(),Pe])}),bm=D.object({reasoning:D.string(),scenario:D.string(),patch:cE.or(D.null())}),c0=D.object({thoughts:D.string(),evaluation:D.number().min(1).max(10)}),d0=D.object({observations:D.string(),reasoning:D.string(),command:ts});var zc=D.object({summary:D.string(),reasoning:D.string(),evaluation:D.discriminatedUnion("type",[D.object({type:D.literal("DONE")}),D.object({type:D.literal("RIGHT_TRACK")}),D.object({type:D.literal("WRONG_TRACK"),feedback:D.string()}),D.object({type:D.literal("IMPOSSIBLE")})])});import{z as O}from"zod";import*as ee from"zod";var f0=ee.object({thoughts:ee.string().optional().describe("only provided if a description was provided"),target:Ar.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")}),os=ee.union([ee.literal("ELEMENT_CHECK"),ee.literal("NEGATED_CHECK"),ee.literal("SELECT_OPTION"),ee.literal("TYPE")]);function Mr(n){if(!("useSelector"in n&&n.useSelector)){if(n.type==="SELECT_OPTION")return"SELECT_OPTION";if(n.type==="TYPE")return"TYPE";if(n.type==="ELEMENT_CHECK"&&n.assertion.type==="ELEMENT_EXISTENCE"&&n.assertion.condition==="EXISTS"&&n.assertion.negated)return"NEGATED_CHECK";if(n.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Yi=(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))(Yi||{}),Oo=ee.object({matched:ee.boolean(),reason:ee.string().optional().describe("Human understandable description"),logs:ee.string().array().optional().describe("Logs for debugging")}),dE=Oo.extend({type:ee.literal("USER_SELECTOR")}),pE=Oo.extend({type:ee.literal("CSS_SELECTOR"),selectors:ee.string().array()}),uE=Oo.extend({type:ee.literal("HYBRID_SELECTOR")}),mE=Oo.extend({type:ee.literal("HTML_DISTANCE"),distance:ee.number().optional(),closestElement:ee.string().optional(),savedElement:ee.string().optional()}),hE=Oo.extend({type:ee.literal("TEMPLATE_MATCHING"),elementImageUrl:ee.string().url()}),gE=Oo.extend({type:ee.literal("AUTO_FRAME"),logs:ee.string().array().optional()}),wm=ee.discriminatedUnion("type",[dE,pE,uE,mE,hE,gE]);import{z as ta}from"zod";import{z as FC}from"zod";import*as X from"zod";import{cloneDeep as Zi}from"lodash-es";var fE=n=>{let e=vm(n,0);if(e===void 0||!yE(n[e]))return;let t=vm(n,e+1);if(t!==void 0)return bE(n,e,t)},xm=fE,vm=(n,e)=>{for(let t=e;t<n.length;t+=1){let r=n[t];if(!SE(r))return t}},SE=n=>n===" "||n===" "||n===`
|
|
5
5
|
`||n==="\r",yE=n=>n==="{"||n==="[",bE=(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
6
|
`)return wE(r);if(r===void 0)r=i;else if(r[0]===i)r+=i;else return}},wE=n=>n===void 0?0:n[0]===" "?n.length:n;var Tm=(n,e)=>{let t=Hc(n,"toPrecision",e,e);return t===void 0?Hc(n,"toExponential",e,e):t},Hc=(n,e,t,r)=>{let i=n[e](r).replace(vE,"$1").replace(xE,"$1");return i.length<=t?i:r===1?void 0:Hc(n,e,t,r-1)},vE=/(e)\+/iu,xE=/\.?0*($|e)/iu;var Cm=(n,e)=>{if(typeof n!="string")throw new TypeError(`Input must be a JSON string: ${n}`);TE(e)},TE=n=>{if(EE(n),n<0)throw new TypeError(`"maxSize" argument must be positive: ${n}`);if(n<Em)throw new TypeError(`"maxSize" argument must be at least ${Em}: ${n}`)},EE=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}`)},Em=7;var is=(n,e,t)=>{let r=Am(e,t);return Rm(n,e,r)},Rm=(n,e,t)=>{if(t>=e)return t;let r=n[t];return r>=NE&&r<=kE?Rm(n,e,t+1):t},as=(n,e,t)=>{if(t===void 0)return t;let r=Am(e,t);return CE(n,r)},CE=(n,e)=>RE(n,e)?e-3:AE(n,e)?e-2:IE(n,e)?e-1:e,RE=(n,e)=>e>=3&&n[e-3]>=PE&&n[e-3]<=LE,AE=(n,e)=>e>=2&&n[e-2]>=OE,IE=(n,e)=>e>=1&&n[e-1]>=ME,Am=(n,e)=>e<0||Object.is(e,-0)?Math.max(n+e,0):e,PE=240,LE=244,OE=224,ME=194,NE=128,kE=191;var Im=(n,e,t)=>{let r=globalThis.Buffer.from(n),o=is(r,r.length,e),i=as(r,r.length,t);return o===0&&i>=r.length?r.toString():r.toString("utf8",o,i)};var Pm=/[\uD800-\uDFFF]/gu,Lm="\uFFFD";var ss=n=>_E(n)?n.replace(Pm,Lm):n,_E=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 Gc=({input:n,targetByteCount:e,firstStartSurrogate:t,lastStartSurrogate:r,firstEndSurrogate:o,lastEndSurrogate:i,increment:a,canBacktrack:s,shift:l,charIndexInit:c})=>{let d=c,p=d,u=0;for(;u<e;d+=a){p=d;let h=n.charCodeAt(d);if(Number.isNaN(h))break;if(h<=127){u+=1;continue}if(h<=2047){u+=2;continue}if(u+=3,h<t||h>r)continue;let g=n.charCodeAt(d+a);Number.isNaN(g)||g<o||g>i||(u+=1,d+=a)}return(s&&u>e?p:d)+l};var Wc=(n,e,t)=>e<0||Object.is(e,-0)?HE(n,e,t):zE(n,e,t),zE=(n,e,t)=>Gc({input:n,targetByteCount:e,firstStartSurrogate:55296,lastStartSurrogate:56319,firstEndSurrogate:56320,lastEndSurrogate:57343,increment:1,canBacktrack:t,shift:0,charIndexInit:0}),HE=(n,e,t)=>Gc({input:n,targetByteCount:-e,firstStartSurrogate:56320,lastStartSurrogate:57343,firstEndSurrogate:55296,lastEndSurrogate:56319,increment:-1,canBacktrack:!t,shift:1,charIndexInit:n.length-1});var ls=(n,e,t)=>{let r=Wc(n,e,!1),o=jE(n,t),i=r===0&&o===void 0?n:n.slice(r,o);return ss(i)},jE=(n,e)=>{if(e===void 0)return e;let t=Wc(n,e,!0);return t===n.length?void 0:t};var Mm=(n,e,t)=>{let{textEncoder:r,textDecoder:o}=$E(),i=GE(n),{written:a}=r.encodeInto(n,i),s=is(i,a,e),l=as(i,a,t),c=l===void 0?a:Math.min(l,a),d=i.subarray(s,c);return o.decode(d)},$E=()=>(Vc===void 0&&(Vc=new globalThis.TextEncoder,Om=new globalThis.TextDecoder("utf8",{fatal:!1})),{textEncoder:Vc,textDecoder:Om}),Vc,Om,GE=n=>{let e=n.length*3;return e>WE?new Uint8Array(e):((cs===void 0||cs.length<e)&&(cs=new Uint8Array(e)),cs)},WE=1e5,cs;var Nm=(n,e)=>{if(e===void 0)return e;let t=qc(n,e);return t>=n.length*km?void 0:t},qc=(n,e)=>e<=n.length*-km?0:e,km=4;var _m=(n,e,t)=>{if(typeof n!="string")throw new TypeError(`First argument must be a string: ${n}`);VE(e),qE(t)},VE=n=>{if(n===void 0)throw new TypeError("Second argument is required.");Dm("Second",n)},qE=n=>{n!==void 0&&Dm("Third",n)},Dm=(n,e)=>{if(!Number.isInteger(e))throw new TypeError(`${n} argument must be an integer: ${e}`)};var Fm=n=>{let e=!0,t=0;for(let r=0;r<Kc;r+=1){let o=KE(n,r);o<=127||(e&&(e=!1),o>2047&&(t+=1))}return{asciiOnly:e,longCharsPercentage:t/Kc}},KE=(n,e)=>{let t=Kc-1,r=1-(t-e)/t,o=Math.round(r*(n.length-1));return n.charCodeAt(o)},Kc=50;var YE=(n,e,t)=>{if(_m(n,e,t),n==="")return n;let r=qc(n,e),o=Nm(n,t);return o===void 0&&Object.is(r,0)?ss(n):JE(n,r,o)},Um=YE,JE=(n,e,t)=>{if(n.length<=XE)return ls(n,e,t);let{asciiOnly:r,longCharsPercentage:o}=Fm(n);return r?QE(n,e,t):o>=ZE?ls(n,e,t):Bm(n,e,t)},XE=200,ZE=.4,QE=(n,e,t)=>"Buffer"in globalThis&&"from"in globalThis.Buffer?Im(n,e,t):Bm(n,e,t),Bm=(n,e,t)=>"TextEncoder"in globalThis?Mm(n,e,t):ls(n,e,t);var Hm=(n,e)=>{let t=JSON.stringify(n),r=nC(t),o=Um(r,0,e-zm.length-Ji.length*2),a=`${eC(o)}${zm}`;return rC(a)},eC=n=>n.replace(tC,""),tC=/(\\|\\u[0-9a-fA-F]{0,3})$/u,nC=n=>n.slice(Ji.length,-Ji.length),rC=n=>`${Ji}${n}${Ji}`,Ji='"',zm="...";var jm=n=>globalThis.Buffer.byteLength(n);var Yc=n=>{let e=n.length,t=e;for(let r=0;r<e;r+=1){let o=n.charCodeAt(r);if(o<=oC)continue;if(o<=iC){t+=1;continue}if(t+=2,o<aC||o>sC)continue;let i=n.charCodeAt(r+1);i<lC||i>cC||(r+=1)}return t},oC=127,iC=2047,aC=55296,sC=56319,lC=56320,cC=57343;var $m=()=>dC.bind(void 0,new TextEncoder),dC=(n,e)=>{let t=pC(e);return n.encodeInto(e,t).written},pC=n=>{let e=n.length*3;return e>uC?new Uint8Array(e):((ds===void 0||ds.length<e)&&(ds=new Uint8Array(e)),ds)},uC=1e5,ds;var hC=()=>"Buffer"in globalThis&&"byteLength"in globalThis.Buffer?jm:"TextEncoder"in globalThis?gC.bind(void 0,$m()):Yc,gC=(n,e)=>e.length<100?Yc(e):n(e),Gm=hC();var Wm=n=>{if(n===null)return fC;if(n===!0)return SC;if(n===!1)return yC;let e=typeof n;return e==="object"?bC:e==="number"?JSON.stringify(n).length:Jc(n)},fC=4,SC=4,yC=5,bC=2,Jc=n=>Gm(JSON.stringify(n));var ps=({size:n,increment:e,maxSize:t,truncatedProps:r,path:o,value:i})=>{let a=n+e,s=a>t;return s?{size:n,stop:s,truncatedProps:[...r,{path:o,value:i}]}:{size:a,stop:s,truncatedProps:r}},qm=n=>Wm(n),Km=(n,e,t)=>{let r=Jm({empty:n,indent:e,depth:t,keySpaceSize:0}),o=Xm(n);return r+o},Ym=({key:n,empty:e,indent:t,depth:r})=>{let o=Jm({empty:e,indent:t,depth:r,keySpaceSize:1}),i=Jc(n),a=Xm(e);return o+i+wC+a},wC=1,Jm=({empty:n,indent:e,depth:t,keySpaceSize:r})=>{if(e===void 0)return 0;let o=Vm+e*(t+1),i=n?Vm+e*t:0;return r+o+i},Vm=1,Xm=n=>n?0:vC,vC=1;var us=({parent:n,truncatedProps:e,path:t,increment:r,maxSize:o,key:i,empty:a,size:s,truncateValue:l,indent:c,depth:d})=>{let p=n[i],u=[...t,i],{size:m,stop:h,truncatedProps:g}=ps({size:s,increment:r,maxSize:o,truncatedProps:e,path:u,value:p});return h?{empty:a,size:m,truncatedProps:g}:xC({value:p,truncatedProps:e,path:u,maxSize:o,empty:a,size:s,newSize:m,truncateValue:l,indent:c,depth:d})},xC=({value:n,truncatedProps:e,path:t,maxSize:r,empty:o,size:i,newSize:a,truncateValue:s,indent:l,depth:c})=>{let{value:d,size:p,truncatedProps:u}=s({value:n,truncatedProps:e,path:t,size:a,maxSize:r,indent:l,depth:c+1});return d===void 0?{empty:o,size:i,truncatedProps:u}:{empty:!1,size:p,value:d,truncatedProps:u}};var Zm=({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:a,depth:s})=>{let l=[],c={empty:!0,size:r,truncatedProps:e};for(let d=0;d<n.length;d+=1){let p=Km(c.empty,a,s);c=us({parent:n,truncatedProps:c.truncatedProps,path:t,increment:p,maxSize:o,key:d,empty:c.empty,size:c.size,truncateValue:i,indent:a,depth:s}),c.value!==void 0&&l.push(c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var Qm=({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:i,indent:a,depth:s})=>{let l={},c={empty:!0,size:r,truncatedProps:e};for(let d in n){let p=Ym({key:d,empty:c.empty,indent:a,depth:s});c=us({parent:n,truncatedProps:c.truncatedProps,path:t,increment:p,maxSize:o,key:d,empty:c.empty,size:c.size,truncateValue:i,indent:a,depth:s}),c.value!==void 0&&(l[d]=c.value)}return{value:l,size:c.size,truncatedProps:c.truncatedProps}};var ms=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:a})=>{let s=qm(n),{size:l,stop:c,truncatedProps:d}=ps({size:r,increment:s,maxSize:o,truncatedProps:e,path:t,value:n});return c?{value:void 0,size:l,truncatedProps:d}:TC({value:n,truncatedProps:d,path:t,size:l,maxSize:o,indent:i,depth:a})},TC=({value:n,truncatedProps:e,path:t,size:r,maxSize:o,indent:i,depth:a})=>typeof n!="object"||n===null?{value:n,size:r,truncatedProps:e}:Array.isArray(n)?Zm({array:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:ms,indent:i,depth:a}):Qm({object:n,truncatedProps:e,path:t,size:r,maxSize:o,truncateValue:ms,indent:i,depth:a});var EC=(n,e)=>{Cm(n,e);let t=CC(n),r=RC(n),{value:o,truncatedProps:i}=ms({value:r,truncatedProps:[],path:[],size:0,maxSize:e,indent:t,depth:0});return{jsonString:AC({newValue:o,value:r,maxSize:e,indent:t}),truncatedProps:i}},Mo=EC,CC=n=>{let e=xm(n);return typeof e=="string"?e.length:e},RC=n=>{try{return JSON.parse(n)}catch(e){throw new TypeError(`Invalid JSON string: "${n}"
|
|
7
7
|
${e.message}`)}},AC=({newValue:n,value:e,maxSize:t,indent:r})=>n!==void 0?JSON.stringify(n,void 0,r):typeof e=="number"?Tm(e,t):Hm(e,t);import*as kr from"zod";import{z as pn}from"zod";import{z as vt}from"zod";var Xc=vt.object({autoFollowNewTabs:vt.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:vt.boolean().optional(),ignoreHrefForCaching:vt.boolean().optional(),hybridSelectorMode:vt.enum(["test","prefer"]).optional()});var eh=1e4,th=6e4,Nr=Xc.extend({pageLoadTimeoutMs:vt.number().optional().refine(n=>n===void 0||n<=th&&n>=-1,{message:`Page load timeout must be between 0 and ${th/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:vt.number().optional().refine(n=>n===void 0||n<=eh&&n>=-1,{message:`Smart waiting timeout must be between 0 and ${eh/1e3} seconds`}),localChromeExtensionPaths:vt.string().array().optional(),extraHeaders:vt.record(vt.string(),vt.string()).optional().describe("HTTP headers to be sent on every request"),userAgent:vt.string().optional(),disableGpu:vt.boolean().optional(),bustCacheOnBoundingBoxChange:vt.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:vt.boolean().optional().describe("Allow fetching the partial accessibility tree if the full tree takes too long.")});var Ve="BASE_URL",hs="CURRENT_URL",No="ENV_NAME",Xi="TEST_NAME",AU={[Ve]:"https://www.google.com"},nh=pn.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),rh=pn.object({name:pn.string(),variables:pn.record(pn.string().describe("variable name"),pn.string().describe("variable value"))}),oh=pn.object({name:pn.string(),variables:pn.record(pn.string().describe("variable name"),pn.unknown().describe("variable value")),browser:Nr.optional()});Ce(kr);var Qi=kr.object({env:kr.record(kr.unknown())}).openapi({ref:"TestContextSnapshot"}),IC="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",PC=[Ve,No,Xi],ih=[hs,Ve,No,Xi],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[hs]??"about:blank",i=e.env[No],a=e.env[Xi],s={};for(let[c,d]of Object.entries(e.env))ih.includes(c)||(t??{})[c]===void 0&&(s[c]=d);return new n({baseUrl:r,currentUrl:o,dynamicVariables:s,envName:i,testName:a,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Zi(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){PC.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[No]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Zi(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([r,o])=>ih.includes(r)||this.varsFromMomenticEnvironment[r]===void 0?[r,o]:[r,IC]));for(let[r,o]of Object.entries(e.env)){if(!o){e.env[r]=o;continue}let{jsonString:i}=Mo(JSON.stringify(o),1e3);try{e.env[r]=JSON.parse(i)}catch{e.env[r]=void 0}}let{jsonString:t}=Mo(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}setCurrentUrl(e){this.env[hs]=e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.setCurrentUrl(e.currentUrl),this.varsFromMomenticEnvironment=Zi(e.variablesFromEnvironment),this.setMomenticSystemVariable(Ve,e.baseUrl),e.envName&&this.setMomenticSystemVariable(No,e.envName),e.testName&&this.setMomenticSystemVariable(Xi,e.testName)}getDynamicVariablesCopy(){return Zi(this.env)}getVariablesFromEnvironmentCopy(){return Zi(this.varsFromMomenticEnvironment)}};import{z as _r}from"zod";Ce(_r);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 ah=["JobTimeoutError","UserConfigurationError","UserInfrastructureError"],gs={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"},ko={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."},Zc=_r.object({reason:_r.nativeEnum(pe),summary:_r.string()}).openapi({ref:"TestResultClassification"}),fs=_r.object({errorMessage:_r.string(),errorStack:_r.string().optional(),classification:Zc.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||{}),Qc=(r=>(r.SUCCESS="SUCCESS",r.FAILED="FAILED",r.CANCELLED="CANCELLED",r))(Qc||{}),ed=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()}),LC=ed.extend({viewport:X.object({height:X.number(),width:X.number()}),status:X.nativeEnum(Qc),message:X.string().optional(),elementInteracted:X.string().optional()}),sr=ed.extend({status:X.nativeEnum(Re),message:X.string().optional(),data:X.unknown().optional(),beforeTestContext:Qi.optional(),afterTestContext:Qi.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=sr.merge(Pt).extend({results:LC.array(),proposedStep:Pt.optional()}),OC=sr.merge(Pr).extend({results:X.lazy(()=>Ss.array())}),MC=sr.merge(Po).extend({results:X.lazy(()=>Ss.array())}),NC=sr.merge(Hn).extend({moduleName:X.string().optional(),results:X.lazy(()=>Mt.array())}),kC=sr.merge(Lr).extend({assertion:Ss.optional(),results:X.lazy(()=>Mt.array()).describe("results for the block actually executed")}),_C=sr.merge(qi).extend({results:X.lazy(()=>Mt.array())}),DC=sr.merge(Ki).extend({results:X.lazy(()=>Mt.array()),healingAttempts:X.lazy(()=>Mt.array().array()).optional()}),Mt=X.discriminatedUnion("type",[OC,MC,Ss,NC,kC,_C,DC]),ys=sr.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),bs=ed.extend({index:X.number().optional(),description:X.string(),pageState:X.string().optional()});var td=FC.object({results:Mt.array().describe("main results"),beforeResults:Mt.array().optional(),afterResults:Mt.array().optional()}),ws=td.partial();import{z as W}from"zod";import{z as Ae}from"zod";var UC=Ae.object({type:Ae.literal("FAILURE_RECOVERY"),thoughts:Ae.string()}),BC=Ae.object({type:Ae.literal("DESCRIPTION_UPDATE"),thoughts:Ae.string()}),vs=Ae.discriminatedUnion("type",[BC,UC]),xs=(e=>(e.AUTO_HEALING="AUTO_HEALING",e))(xs||{}),zC=Ae.object({testId:Ae.string(),name:Ae.string(),orgId:Ae.string(),runId:Ae.string(),purpose:Ae.nativeEnum(xs).catch("AUTO_HEALING"),steps:Pe.array(),details:vs.or(vs.array()).optional()}),QU=zC.pick({name:!0,orgId:!0}),nd=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(xs).catch("AUTO_HEALING"),runId:Ae.string().nullish(),details:vs.or(vs.array()).nullish(),applied:Ae.boolean().nullish(),appliedAt:Ae.coerce.date().nullish()}),sh=nd.extend({steps:Pe.array()});import{isValidCron as HC}from"cron-validator";import{z as ne}from"zod";import{z as rd}from"zod";var jn=(r=>(r.CHROMIUM="Chromium",r.GOOGLE_CHROME="Google Chrome",r.CHROME_FOR_TESTING="Chrome for Testing",r))(jn||{});var Ts=rd.object({width:rd.number().min(200).max(1e4),height:rd.number().min(200).max(1e4)}),lh={"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}},nB=Object.keys(lh);var Jt=lh["Desktop Large"],_o="en-us",Do="America/Los_Angeles";var Fo={latitude:37.7749,longitude:-122.4194};var ch=["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 dh=2e3,Es=Nr.extend({browserType:ne.nativeEnum(jn).optional(),slowMoMs:ne.number().optional().refine(n=>n===void 0||n<=dh&&n>=-1,{message:`Slow motion must be between 0 and ${dh} 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(ch).optional(),colorScheme:ne.enum(["light","dark"]).optional()}),ph=["extraHeaders","basicAuthorization","localChromeExtensionPaths"],jC=ne.object({disableAICaching:ne.boolean().optional(),useMemory:ne.boolean().optional(),failureRecovery:ne.boolean().optional().describe("undefined means inherit org settings")});var $C=ne.object({viewport:Ts.optional()}),Uo=$C.merge(jC).merge(Es),Bo=ne.object({cron:ne.string().refine(n=>HC(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()}),zo=ne.object({onSuccess:ne.boolean().default(!1),failureMessage:ne.string().optional(),onFailure:ne.boolean().default(!0),successMessage:ne.string().optional()}),GC=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")}),Cs=GC.array(),WC=ne.object({name:ne.string(),value:ne.string()}),uh=WC.array(),Rs=ne.object({name:ne.string(),default:ne.boolean().optional(),fixtures:nh.array().optional()});Ce(W);var Xt={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},oe=(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))(oe||{}),As=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(As||{});var qe=W.string().pipe(W.coerce.date()).or(W.date()),ea=W.object({id:W.string(),runKey:W.string(),organizationId:W.string(),createdAt:qe,createdBy:W.string(),flake:W.boolean().nullish(),scheduledAt:qe.or(W.null()),startedAt:qe.or(W.null()),updatedAt:qe.nullish(),finishedAt:qe.or(W.null()),resolvedBaseUrl:W.string().nullish(),environmentName:W.string().nullish(),labels:W.array(W.string()).optional(),cliVersion:W.string().nullish(),section:W.nativeEnum(As).nullish(),status:W.nativeEnum(oe),trigger:W.nativeEnum(Xt),attempts:W.number(),runAttempts:W.array(W.object({id:W.string(),status:W.nativeEnum(oe),startedAt:qe.or(W.null()),finishedAt:qe.or(W.null())})).optional(),videos:W.array(W.string()).optional(),failureReason:W.nativeEnum(pe).nullish(),failureDetails:fs.nullish(),testFragments:W.array(nd).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"}),VC={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Is=ea.pick({...VC,test:!0}),mh=ea.omit({failureReason:!0,failureDetails:!0,test:!0}),od=ea.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:Uo.nullish()}).nullish()}).merge(td),hh=n=>n.includes("PASSED")&&n.includes("FAILED");var qC=ta.object({id:ta.string().uuid(),startedAt:qe.or(ta.null()),finishedAt:qe.or(ta.null()),status:ta.nativeEnum(oe)}).merge(ws),EB=qC.array();var na=(o=>(o.JUNIT="junit",o.ALLURE="allure",o.ALLURE_JSON="allure-json",o.PLAYWRIGHT_JSON="playwright-json",o))(na||{});import{z as Ye}from"zod";var KC=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"}),gh=KC.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Is.array()});import{z as Qe}from"zod";var YC=Qe.object({type:Qe.literal("TARGETING"),name:Qe.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:wm.array(),pageState:Qe.string().optional(),targetSource:Qe.nativeEnum(or).optional(),targetUpdateTime:Qe.string().optional()}),JC=Qe.object({type:Qe.literal("AI_LOCATION"),matched:Qe.boolean(),pageState:Qe.string().optional(),ragUsed:Qe.boolean().optional(),thoughts:Qe.string().optional()}),XC=Qe.object({type:Qe.literal("ASSERTION"),relevantElementsSerialized:Qe.string().array().optional(),pageState:Qe.string().optional(),ragUsed:Qe.boolean().optional()}),fh=Qe.discriminatedUnion("type",[YC,JC,XC]);function Ps(){return{details:[]}}import{z as Be}from"zod";var ZC=Be.object({id:Be.string(),name:Be.string()}),UB=ZC.merge(Be.object({createdAt:qe,createdBy:Be.string(),schedule:Bo,notification:zo,environment:Be.object({name:Be.string()}).nullish(),beforeTests:Be.object({id:Be.string()}).array().nullish(),afterTests:Be.object({id:Be.string()}).array().nullish()})),Sh=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:ea.array()}),BB=Sh.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),yh=Sh.extend({runs:Is.array()});import{z as Zt}from"zod";import{cloneDeep as $B}from"lodash-es";import{z as ge}from"zod";var KB=ge.object({thoughts:ge.string(),subGoals:ge.object({instruction:ge.string()}).array()}),YB=ge.object({thoughts:ge.string(),newPlanMarkdown:ge.string()}),JB=ge.object({thoughts:ge.string(),correct:ge.boolean(),failedActionIndex:ge.number().optional()}),QC=ge.object({type:ge.literal("PLANNING"),beforePlan:ge.string(),goalDecision:ge.string(),thoughts:ge.string()}),eR=ge.object({type:ge.literal("RUNNING"),stepDisplayName:ge.string(),status:ge.nativeEnum(Re),results:Mt.array()}),tR=ge.object({type:ge.literal("REVISING"),beforePlan:ge.string(),afterPlan:ge.string(),errString:ge.string(),diffs:ge.string(),thoughts:ge.string()}),nR=ge.object({type:ge.literal("SYSTEM"),message:ge.string()}),rR=ge.discriminatedUnion("type",[QC,eR,tR,nR]),bh=rR.array();var t1=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:bh.nullable(),testPlan:Zt.object({id:Zt.string(),name:Zt.string()}).nullable(),test:Zt.object({id:Zt.string(),name:Zt.string()}).nullable()});import{z as xt}from"zod";var id=xt.object({content:xt.string(),ids:xt.string().array(),tokenLength:xt.number()}),oR=xt.object({chunks:id.array()}),y1=xt.object({ids:xt.string().array(),score:xt.number(),tokenLength:xt.number()}),b1=oR.extend({description:xt.string().describe("Input to pass to RAG engine"),tokenLimit:xt.number()}),wh=xt.object({ids:xt.number().array()}),vh=xt.object({indices:xt.number().array()});var Qt=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),A1=Qt.extend({chunks:id.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number()}),iR=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),xh=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:os.optional().catch(void 0),memory:O.discriminatedUnion("type",[_i,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Th=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),Eh=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),Ch=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:Cc.optional(),memory:O.discriminatedUnion("type",[xc,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Rh=O.object({command:Ao}),ad=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:iR.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),Ah=O.object({results:bs.array(),errorMessage:O.string(),errorStack:O.string().optional()}),Ih=O.object({results:bs.array(),goal:O.string(),errorMessage:O.string()}),Ph=O.object({failedResults:bs.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string()}),I1=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()});import{z as ra}from"zod";var O1=ra.object({goal:ra.string()}),Lh=ra.object({keywords:ra.array(ra.string())});import{z as sd}from"zod";var ld=(t=>(t.LOCATOR="locator",t.ASSERTION="assertion",t))(ld||{}),k1=sd.nativeEnum(ld),aR=sd.enum(["v1","v2"]),_1=aR.or(sd.string().describe("for people with special configurations"));var Oh=n=>!(!n.org_id||!n.user_id||!n.platform);import{z as Dr}from"zod";var Mh=Dr.object({id:Dr.string().uuid(),skipped:Dr.boolean().optional(),envKey:Dr.string().optional().describe("key in the environment to save the result of this step to")}),cd=Mh.merge(Ja).extend({type:Dr.literal("REQUEST")}),dd=Mh.merge(Xa).extend({type:Dr.literal("JAVASCRIPT")}),pd=Dr.discriminatedUnion("type",[dd,cd]);import{z as en}from"zod";import{z as Fr}from"zod";var sR=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,Ne=n=>{let e=n.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var Ls=Fr.string().min(1).max(255).superRefine((n,e)=>{try{Ho(n)}catch(t){return e.addIssue({code:Fr.ZodIssueCode.custom,message:t.message,fatal:!0}),Fr.NEVER}});function Ho(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(sR))throw new Error("Name cannot be a UUID. Please choose a different name.")}var Os=Fr.preprocess(n=>n===null?"":n,Fr.union([Fr.string().url(),Fr.literal("")])).optional();var Nh=en.object({id:en.string(),name:Ls,description:en.string().optional().nullish(),baseUrl:Os.nullish(),schemaVersion:en.string(),advanced:en.unknown().optional(),retries:en.number(),envs:en.array(Rs).nullish(),parameters:Cs.nullish()}),lR=en.object({createdAt:en.coerce.date(),updatedAt:en.coerce.date(),schedule:Bo.nullish(),notification:zo.nullish(),createdBy:en.string(),organizationId:en.string()}),cR=Nh.merge(lR),oz=cR.extend({steps:pd.array()}),iz=Nh.extend({steps:pd.array()});import{z as Nt}from"zod";var kh=Nt.object({startedAt:Nt.coerce.date(),finishedAt:Nt.coerce.date(),status:Nt.nativeEnum(Re),message:Nt.string().optional(),data:Nt.unknown().optional()}),pR=kh.merge(dd).extend({type:Nt.literal("JAVASCRIPT")}),uR=kh.merge(cd).extend({type:Nt.literal("REQUEST")}),mR=Nt.discriminatedUnion("type",[pR,uR]),_h=Nt.object({startedAt:Nt.coerce.date(),finishedAt:Nt.coerce.date().nullish(),status:Nt.nativeEnum(oe),results:mR.array(),failureReason:Nt.string().nullish(),failureDetails:fs.nullish()});import{z as kt}from"zod";var hR=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:_h.array().nullish(),apiTestName:kt.string().nullish(),apiTestPath:kt.string().nullish(),apiTestId:kt.string().nullish()}),hz=hR.pick({status:!0,startedAt:!0,finishedAt:!0});var oa=(t=>(t.TestRun="test-run",t.CreditsUsed="credits-used",t))(oa||{}),Dh=3;function gR(n){return n==="MODULE"||n==="IFRAME"||n==="CONDITIONAL"||n==="SECTION"||n==="RESOLVED_MODULE"}function ia(n){if(!gR(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 aa(n){switch(n.type){case"AI_EXTRACT":case"AI_ASSERTION":return Dh;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 jo=class{async reportBillableEvent(e,t,r){}async reportCreditsUsed(e,t,r,o){}};function ud(n,e){return{...n,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}import{parseString as fR,splitCookiesString as SR}from"set-cookie-parser";import{z as Se}from"zod";var md=Se.object({name:Se.string(),value:Se.string(),url:Se.string().optional(),domain:Se.string().optional(),path:Se.string().optional(),expires:Se.number().default(Date.now()/1e3+60*60*24*365),httpOnly:Se.boolean().optional(),secure:Se.boolean().default(!0),sameSite:Se.union([Se.literal("Strict"),Se.literal("Lax"),Se.literal("None")]).default("None")});function Ms(n,e){let t=[],r=SR(n);for(let o of r){let i=fR(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=md.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 yR=Se.object({origin:Se.string(),localStorage:Se.array(Se.object({name:Se.string(),value:Se.string()}))}),bR=Se.object({entries:Se.record(Se.string(),Se.array(Se.tuple([Se.unknown(),Se.unknown()]))),version:Se.number().optional()}),Ns=Se.object({cookies:md.array().optional(),origins:yR.array().optional(),idb:Se.record(Se.string(),bR).optional().describe("key is db name")});function ks(n,e){let t=[];return n.cloneSync()?.serializeSync()?.cookies.forEach(r=>{let o=md.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 Dz=new Set(Object.values(Ue));var wR={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"},Fz={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:[]},Uz={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 Hz,en as jz}from"@faker-js/faker";import{z as V}from"zod";var Fh=55555,Vz=V.object({body:V.string(),to:V.string(),from:V.string()}),qz=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()}),Kz=V.object({to:V.string(),from:V.string(),subject:V.string(),body:V.string()}),Yz=V.object({inbox:V.string(),afterDate:V.string().pipe(V.coerce.date()).or(V.date()).optional(),timeout:V.number().optional(),trimWhitespace:V.boolean().optional()}),Jz=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 Uh=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()}),Xz=V.object({id:V.string().optional(),orgId:V.string(),momenticLambdaAuthHash:V.string(),code:V.string(),fragment:V.boolean(),state:Qi,timeoutMs:V.number().optional()}),lr=15e3;import*as mt from"zod";Ce(mt);var vR=mt.object({url:mt.string(),lineNumber:mt.number(),columnNumber:mt.number()}).openapi({ref:"CodeLocation"}),_s=mt.object({timestamp:mt.number(),text:mt.string(),type:mt.string(),tabIndex:mt.number(),args:mt.unknown().array().optional(),url:mt.string().optional(),location:vR.optional()}).openapi({ref:"ConsoleLog"}),Bh=_s.array(),xR=Bh.array();import*as gd from"zod";import{z as I}from"zod";var TR=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),ER=I.object({name:I.string(),version:I.string(),comment:I.string().optional()}),CR=I.object({onContentLoad:I.number().optional(),onLoad:I.number().optional(),comment:I.string().optional()}),Hh=I.object({startedDateTime:I.string(),id:I.string(),title:I.string().optional(),pageTimings:CR,comment:I.string().optional()}),RR=I.array(Hh),AR=I.object({name:I.string(),value:I.string(),path:I.string().optional(),domain:I.string().optional(),expires:I.string().optional(),httpOnly:I.boolean().optional(),secure:I.boolean().optional(),comment:I.string().optional()}),jh=I.array(AR),IR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),$h=I.array(IR),PR=I.object({name:I.string(),value:I.string(),comment:I.string().optional()}),LR=I.array(PR),OR=I.object({name:I.string(),value:I.string().optional(),fileName:I.string().optional(),contentType:I.string().optional(),comment:I.string().optional()}),MR=I.array(OR),NR=I.object({mimeType:I.string(),params:MR,text:I.string(),comment:I.string().optional()}),kR=I.object({method:I.string(),url:I.string(),httpVersion:I.string().optional(),cookies:jh,headers:$h,queryString:LR,postData:NR.optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),_R=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()}),DR=I.object({status:I.number(),statusText:I.string(),httpVersion:I.string().optional(),cookies:jh,headers:$h,content:_R,redirectURL:I.string().optional(),headersSize:I.number().optional(),bodySize:I.number().optional(),comment:I.string().optional()}),zh=I.object({expires:I.string().optional(),lastAccess:I.string(),eTag:I.string(),hitCount:I.number(),comment:I.string().optional()}),FR=I.object({beforeRequest:zh.optional(),afterRequest:zh.optional(),comment:I.string().optional()}),UR=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()}),Gh=I.object({pageref:I.string().optional(),startedDateTime:I.string(),time:I.number().optional(),request:kR,response:DR.optional(),cache:FR.optional(),timings:UR,serverIPAddress:I.string().optional(),connection:I.string().optional(),comment:I.string().optional(),_resourceType:I.string().optional()}),BR=I.array(Gh),zR=I.object({version:I.string().default("1.1"),creator:TR.optional(),browser:ER.optional(),pages:RR.optional(),entries:BR,comment:I.string().optional()}),HR=I.object({log:zR}),Wh=I.record(I.string(),Hh),Vh=I.record(I.string(),Gh);function hd(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(gd);var jR=gd.object({logsPerPage:_s.array().array(),harPages:Wh.optional(),harEntries:Vh.optional()}).openapi({ref:"DebugData"});var Ur=class{async getConsoleLogsForRunAttempt(e,t,r){}async getNetworkLogsForRunAttempt(e,t,r){}async getHtmlSnapshot(e,t){}async getA11yTreeSnapshot(e,t){}async getScreenshot(e,t){}async storeConsoleLogsForRunAttempt(e,t,r,o){}async storeNetworkLogsForRunAttempt(e,t,r,o){}async storeScreenshot(e,t,r){}async storeHtmlSnapshot(e,t,r){}};var Ds=class extends Error{constructor(e,t,r,o={}){super(`The ${r} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};function qh(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}
|
|
@@ -46,7 +46,7 @@ globstar while`,e,u,t,m,h),this.matchOne(e.slice(u),t.slice(m),r))return this.de
|
|
|
46
46
|
First test path: ${u}
|
|
47
47
|
|
|
48
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(a);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","");!iy&&Ne(p.name)!==u&&r.warn(`The module with ID ${p.moduleId} has a name (${p.name}) that does not match its file name (${u}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`);return}catch(p){r.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${p}`);return}default:r.warn(`Unsupported file type ${l}, skipping...`);return}}var oi="momentic.config.yaml",ay="momentic.workspace.yaml",TP=ue.object({projects:ue.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),EP=ue.union([ue.string(),ue.object({fromFile:ue.string(),json:ue.boolean().optional()})]),CP=ue.object({name:op,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(),EP).optional(),inheritFromShell:ue.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Nr.optional()}),RP=ue.object({postSave:ue.string().optional()}),AP=ue.object({name:op,include:ue.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:ue.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:ue.string().optional(),reporterDir:ue.string().optional(),outputDir:ue.string().optional(),retries:ue.number().optional().describe("number of retries per test"),parallel:ue.number().optional().describe("degree of parallelism"),environments:ue.array(CP).optional(),gitMainBranch:ue.string().optional(),gitProtectedBranches:ue.string().array().optional(),ai:xd.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:gg.optional(),hooks:RP.optional()});function cy(n,e){let t;try{t=wP(n,"utf-8")}catch(o){b.warn(`Could not read possible Momentic ${e} file at ${n}: ${o}`);return}let r;try{if(r=ly.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){b.warn(`Possible Momentic ${e} file at ${n} does not parse as valid YAML: ${o}`);return}return r}function sp(n){let e=cy(n,"project configuration");if(e!==void 0)try{return AP.parse(e)}catch(t){b.warn(`Possible Momentic project configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function IP(n){let e=cy(n,"workspace configuration");if(e!==void 0)try{return TP.parse(e)}catch(t){b.warn(`Possible Momentic workspace configuration file at ${n} does not adhere to the required schema: ${t}`);return}}function PP(){let n=[],e=ap(),t=to.parse(e).root,r=15,o=0;for(;o<r;){o++;let i=to.basename(e);if(Us.includes(i))return b.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),n;for(let a of vP(e))if(a.endsWith(oi)){let s=to.join(e,a),l=sp(s);l&&n.push({configFilePath:s,config:l,rootDir:sy(s)})}if(n.length)return n;if(e=to.dirname(e),e===t)break}return n}function $t(n={}){let{configFilePath:e,nameFilter:t}=n,r=lp(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 b.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}function LP(n){let e=IP(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${oi}`)),r=ri(t,{absolute:!1,cwd:ap(),dotRelative:!1,maxDepth:ip,nodir:!0}),o=[];for(let i of r){let a=to.join(ap(),i),s=sp(a);s&&o.push({configFilePath:a,config:s,rootDir:sy(a)})}return o}function lp(n){if(n){n=to.resolve(n);let t=sp(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:to.dirname(n)}]}if(bP(ay)){let t=LP(ay);if(t)return t}return PP()}function ii(n,e){let t=ly.stringify(n);xP(e,t)}import ai from"fs";import cp from"path";import{z as dp}from"zod";var dy="golden/visual-diff",py="reports",uy="test-results";var OP=dp.object({width:dp.number(),height:dp.number()}),si=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=cp.join(e.rootDir,e.config.goldenFileDir??dy);this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){if(t.screenshot?.data?.startsWith("https://")){let a=await fetch(t.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=cp.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ai.mkdirSync(cp.dirname(o),{recursive:!0}),ai.writeFileSync(o,r.buffer),ai.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(ai.existsSync(o)){let a=ai.readFileSync(o),s=OP.parse(JSON.parse(ai.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new A("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var li=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 MP from"simple-git";var Te=MP();function Sl(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 NP(){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 kP(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 _P(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 DP(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"),a=t?.includes("gitlab.com"),s=t?Sl(t):void 0;return{gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function FP(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"),a=o?.includes("gitlab.com"),s=o?Sl(o):void 0;return{gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function UP(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"),a=o?.includes("gitlab.com"),s=o?Sl(o):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function BP(n,e){let[t,r,o,i,a,s,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?Sl(i):void 0;return{gitCommitSha:t,gitCommitShaShort:r,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:l,lastCommitOnMainSha:c,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?m:void 0,gitlabProjectPath:u?m:void 0,pipelineId:void 0}}async function zP(n){let e=n.config.gitProtectedBranches??[];return n.config.gitMainBranch&&e.push(n.config.gitMainBranch),{gitMainBranch:n.config.gitMainBranch,gitProtectedBranches:e}}async function HP(n,e){let t=NP();if(!t)return BP(n,e);switch(t){case"GithubActions":return kP(n);case"GitlabCI":return _P(n);case"CircleCI":return DP(n);case"Buildkite":return FP(n);case"AzureDevOps":return UP(n)}}async function jP(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 ci(n,e,t){let r=await zP(t),o=await HP(n,r.gitMainBranch),i={...r,...o},a=await jP(n,e,i);return{...r,...o,...a}}import QN from"http";import{z as mp}from"zod";var $="v1",ka="2.6.1";var fr=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var my=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 U(n,e){let{milliseconds:t,fallback:r,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(my(p));s=()=>c(my(p)),p.addEventListener("abort",s)}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 fr(o??`Promise timed out after ${t}ms`);c(p)}};a=i.setTimeout(d,t),Promise.resolve(n).then(p=>l(p)).catch(p=>c(p))}).finally(()=>{i.clearTimeout(a),e.signal&&s&&e.signal.removeEventListener("abort",s)})}var yl=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>r-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(r),!1)}};var pp=["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 hy(n){return new Array(n).fill(0).map(()=>pp[Math.floor(Math.random()*pp.length)]).join("-")}var $P=9e4,GP=15e3,bn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function WP(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var up=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return ka&&(e[fg]=ka),e}async sendRequest(e,t,r=3,o=$P){let i=r,a,s={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(a=l,l instanceof bn&&l.status>=400&&l.status<500)throw l;if(l instanceof Error&&l.name==="AbortError"&&(a=new fr),r===0)throw a;let c=1500,d=i-r,p=Math.min(c*Math.pow(2,d-1),GP);await new Promise(u=>setTimeout(u,p))}throw this.logger.warn({...s,err:a},"Got fatal error response from Momentic server"),a}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),r),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s);let l={...this.getHeaders(),...t.extraHeaders};try{let c=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!c.ok){let p=await WP(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(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Ft=class extends up{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(`/${$}/auth/check`,{method:"GET",noLog:!0},10,5e3);return Dg.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${$}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return Mg.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${$}/tests/export`,{method:"POST",body:e},3,3e4);return Ag.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${$}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${$}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return Ig.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${$}/tests/queue`,{method:"POST",body:e},3,1e4);return Rg.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${$}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return _g.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${$}/environments`,{method:"GET"},3,5e3);return Fg.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${$}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return Gg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${$}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${$}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${$}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${$}/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(`/${$}/suites/queue`,{method:"POST",body:e},3,5e3);return Ug.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${$}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return gh.array().parse(r)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${$}/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(`/${$}/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(`/${$}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return ca.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${$}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return ca.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${$}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return ca.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${$}/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(`/${$}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return Bg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${$}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${$}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return zg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${$}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return Hg.parse(e)}async startProcessingResultsUpload(e,t){let r=await this.sendRequest(`/${$}/results/uploads/${e}/process`,{method:"POST",noLog:!0,body:t},3,1e4);return jg.parse(r)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${$}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return Jg.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${$}/knowledge-base/icons`,{method:"POST",body:e,noLog:!0},3,5e3)}catch(r){t.error({err:r},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,r,o){let i=new URLSearchParams;i.set("base",r),i.set("head",o);let a=await this.sendRequest(`/${$}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return Cd.parse(a)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${$}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return Cd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${$}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return mp.record(mp.string(),mp.string()).parse(e)}};import{randomUUID as gy}from"crypto";var bl=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??gy(),properties:ud({},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??gy(),properties:ud({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function di(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var wl=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:a}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),s=await di(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(i){e.error({err:i},"Failed to upload console logs")}}async storeNetworkLogsForRunAttempt(e,t,r,o){let i=JSON.stringify(o);try{let{uploadUrl:a}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),s=await di(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(a){e.error({err:a},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await di(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 pi=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as VP,en as qP}from"@faker-js/faker";var ui="v1",Sr=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 VP({locale:qP}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${ui}/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(`/${ui}/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(`/${ui}/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(`/${ui}/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(`/${ui}/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(`/${ui}/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 KP}from"zod";var mi=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(`/${$}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return vh.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${$}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:ka,...e},signal:t.abortSignal});return wh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${$}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return KP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${$}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return Eg.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${$}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return Td.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${$}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return Tg.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${$}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return Td.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${$}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return xg.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${$}/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(`/${$}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return zc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${$}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Cg.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${$}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return Bc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${$}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Zc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${$}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return Lh.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${$}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return ym.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${$}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return bm.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${$}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Qu.parse(r)}};var hi=class extends Ft{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${$}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return em.parse(r)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var vl=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:r,id:o}=await this.client.generateTestResultsUploadUrl(),i=await di(r,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function gi({orgId:n,client:e,gitMetadata:t,alwaysSaveCache:r,noCache:o}){return o?new Ya:new hp(n,e,t,r)}var hp=class{constructor(e,t,{gitMainBranch:r,gitBranchName:o,gitProtectedBranches:i,gitCommitTimestamp:a,lastCommitOnMainSha:s,lastCommitOnMainTimestamp:l},c){this.orgId=e;this.client=t;this.cacheHeaders={},r&&(this.cacheHeaders[Sg]=r),o&&(this.cacheHeaders[yg]=o),a&&(this.cacheHeaders[bg]=a.toISOString()),s&&(this.cacheHeaders[wg]=s),l&&(this.cacheHeaders[vg]=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 s of[t,r,o])s&&$o({steps:s,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await Dt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import ek from"path";import{Server as CN}from"socket.io";import{cloneDeep as YP}from"lodash-es";var JP={showOverlay:!1},gp=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:r,clientIp:o,sessionId:i,browserbaseSessionId:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:a,browserBehavior:YP(JP)}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(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 gp;function fy(n,e,t){let r=Date.now(),o=Date.now(),i,a,s,l,c=!1,d=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=s;s=void 0;let S=h.url(),w=g.toEditorDisplayCopy();JSON.stringify(w)===JSON.stringify(i)&&S===l&&r>o||(n.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:a??[],context:w,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=w}catch(f){if(!n.connected)return;let S=f instanceof Error?f.message:`${f}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:f,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=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 yr={};var XP=n=>()=>{let{sessionId:e}=n.metadata;yr[e]?.abort?.abort()},Sy={event:"cancelApiTest",createHandler:XP};import{CookieJar as fL}from"tough-cookie";import{randomUUID as iL}from"crypto";import{faker as ZP}from"@faker-js/faker";import QP from"assert";import eL from"axios";import tL from"moment";import*as nL from"otpauth";import rL from"pg";async function yy(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=Ms(r,e);t.push(...o)}),t}var oL=Object.getPrototypeOf(async function(){}).constructor;async function by(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,a={},s=(f,S)=>{o[f]=S,a[f]=S},l={},c=(f,S)=>{o[f]=S,l[f]=S},d;r.includes("Octokit")&&(d=(await import("@octokit/rest")).Octokit);let p;r.includes("createAppAuth")&&(p=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new oL("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(eL,tL,i.fakerInstance??ZP,QP,rL,d,p,nL,yy,o,s,c,S=>i.sms.send(S),S=>i.sms.fetchLatest(S),i.email,i.sms,i.ai)),m=!0,h,g;try{h=await U(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 fr?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 wy({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:a=lr}){let s=iL(),l=await by(s,{code:n,options:{fragment:e,timeoutMs:a},bindings:t.toObjectCopy(),tools:r,signal:i},o);return b.debug(`[${s}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as aL,randomUUID as sL}from"crypto";import lL from"fetch-retry";var cL=lL(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}}),vy=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,xy=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function Ty({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=lr,retries:i=2,signal:a,logger:s}){if(!vy)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!xy)throw new Error("Missing lambda auth secret.");let p=aL("sha256",xy).update(n).digest("hex");for(;d<=i;){d++,a?.throwIfAborted();let m={id:sL(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await U(cL(vy,{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=Uh.parse(await l.json())}catch(m){throw new Error(`Code evaluation server returned invalid response: ${m}`)}if(u.error)throw new Error(`Code evaluation error: ${u.error}`);return u}async function Kn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await Ty(n);else if(n.localTools)e=await wy({...n,localTools:n.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
|
|
49
|
+
${r.map(o=>o.configFilePath)}`);if(r.length===0)throw new Error("No valid Momentic project file available.");return b.debug(`Found valid project configuration at ${r[0].configFilePath}`),r[0]}function LP(n){let e=IP(n);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(i=>(i.endsWith("/")||(i+="/"),`${i}*${oi}`)),r=ri(t,{absolute:!1,cwd:ap(),dotRelative:!1,maxDepth:ip,nodir:!0}),o=[];for(let i of r){let a=to.join(ap(),i),s=sp(a);s&&o.push({configFilePath:a,config:s,rootDir:sy(a)})}return o}function lp(n){if(n){n=to.resolve(n);let t=sp(n);return t||(console.error(`No valid Momentic project file found at ${n}.`),process.exit(1)),[{config:t,configFilePath:n,rootDir:to.dirname(n)}]}if(bP(ay)){let t=LP(ay);if(t)return t}return PP()}function ii(n,e){let t=ly.stringify(n);xP(e,t)}import ai from"fs";import cp from"path";import{z as dp}from"zod";var dy="golden/visual-diff",py="reports",uy="test-results";var OP=dp.object({width:dp.number(),height:dp.number()}),si=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;constructor(e,t){let r=cp.join(e.rootDir,e.config.goldenFileDir??dy);this.defaultGoldenScreenshotDir=r,this.regenerateGoldenFiles=t}async prepareGoldenScreenshotForComparison(e,t,r){if(t.screenshot?.data?.startsWith("https://")){let a=await fetch(t.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:t.screenshot.width,height:t.screenshot.height}}let o=t.screenshot?.data;o||(o=cp.join(this.defaultGoldenScreenshotDir,`${t.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return ai.mkdirSync(cp.dirname(o),{recursive:!0}),ai.writeFileSync(o,r.buffer),ai.writeFileSync(i,JSON.stringify({width:r.width,height:r.height})),{buffer:Buffer.from(r.buffer),width:r.width,height:r.height};if(ai.existsSync(o)){let a=ai.readFileSync(o),s=OP.parse(JSON.parse(ai.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new A("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};var li=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 MP from"simple-git";var Te=MP();function Sl(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 NP(){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 kP(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 _P(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 DP(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"),a=t?.includes("gitlab.com"),s=t?Sl(t):void 0;return{gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:process.env.CIRCLE_REPOSITORY_URL,gitCommitMessage:r,gitCommitAuthorName:o,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.CIRCLE_WORKFLOW_ID}:${process.env.CIRCLE_WORKFLOW_JOB_ID}`}}async function FP(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"),a=o?.includes("gitlab.com"),s=o?Sl(o):void 0;return{gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function UP(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"),a=o?.includes("gitlab.com"),s=o?Sl(o):void 0;return{gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:r,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function BP(n,e){let[t,r,o,i,a,s,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?Sl(i):void 0;return{gitCommitSha:t,gitCommitShaShort:r,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:l,lastCommitOnMainSha:c,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?m:void 0,gitlabProjectPath:u?m:void 0,pipelineId:void 0}}async function zP(n){let e=n.config.gitProtectedBranches??[];return n.config.gitMainBranch&&e.push(n.config.gitMainBranch),{gitMainBranch:n.config.gitMainBranch,gitProtectedBranches:e}}async function HP(n,e){let t=NP();if(!t)return BP(n,e);switch(t){case"GithubActions":return kP(n);case"GitlabCI":return _P(n);case"CircleCI":return DP(n);case"Buildkite":return FP(n);case"AzureDevOps":return UP(n)}}async function jP(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 ci(n,e,t){let r=await zP(t),o=await HP(n,r.gitMainBranch),i={...r,...o},a=await jP(n,e,i);return{...r,...o,...a}}import QN from"http";import{z as mp}from"zod";var $="v1",ka="2.6.2";var fr=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var my=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 U(n,e){let{milliseconds:t,fallback:r,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(my(p));s=()=>c(my(p)),p.addEventListener("abort",s)}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 fr(o??`Promise timed out after ${t}ms`);c(p)}};a=i.setTimeout(d,t),Promise.resolve(n).then(p=>l(p)).catch(p=>c(p))}).finally(()=>{i.clearTimeout(a),e.signal&&s&&e.signal.removeEventListener("abort",s)})}var yl=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>r-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let r=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(r),!1)}};var pp=["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 hy(n){return new Array(n).fill(0).map(()=>pp[Math.floor(Math.random()*pp.length)]).join("-")}var $P=9e4,GP=15e3,bn=class extends Error{status;rawError;constructor(e,t,r,o={}){super(r,o),this.status=e,this.rawError=t}};async function WP(n){return n.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var up=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return ka&&(e[fg]=ka),e}async sendRequest(e,t,r=3,o=$P){let i=r,a,s={path:e,baseUrl:this.baseUrl,method:t.method};for(;r>0;)try{return r--,await this.sendSingleRequestHelper(e,t,o)}catch(l){if(a=l,l instanceof bn&&l.status>=400&&l.status<500)throw l;if(l instanceof Error&&l.name==="AbortError"&&(a=new fr),r===0)throw a;let c=1500,d=i-r,p=Math.min(c*Math.pow(2,d-1),GP);await new Promise(u=>setTimeout(u,p))}throw this.logger.warn({...s,err:a},"Got fatal error response from Momentic server"),a}async sendSingleRequestHelper(e,t,r){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),r),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s);let l={...this.getHeaders(),...t.extraHeaders};try{let c=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!c.ok){let p=await WP(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(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Ft=class extends up{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(`/${$}/auth/check`,{method:"GET",noLog:!0},10,5e3);return Dg.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${$}/runs/status`,{method:"POST",body:e,noLog:!0},3,1e4);return Mg.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${$}/tests/export`,{method:"POST",body:e},3,3e4);return Ag.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${$}/cache`,{method:"PATCH",body:e,extraHeaders:t},3,1e4)}async getStepCacheForTest(e,t){let r=await this.sendRequest(`/${$}/cache`,{method:"POST",body:e,extraHeaders:t},10,3e4);return Ig.parse(r)}async queueTests(e){let t=await this.sendRequest(`/${$}/tests/queue`,{method:"POST",body:e},3,1e4);return Rg.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${$}/screenshots`,{method:"POST",body:e,noLog:!0},3,5e3);return _g.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${$}/environments`,{method:"GET"},3,5e3);return Fg.parse(e)}async acquireCacheLock(e,t){let r=await this.sendRequest(`/${$}/result-cache/lock`,{method:"POST",body:e,signal:t},3,3e4);return Gg.parse(r)}async releaseCacheLock(e){await this.sendRequest(`/${$}/result-cache/lock`,{method:"DELETE",body:{key:e}},3,5e3)}async deleteCacheResult(e){await this.sendRequest(`/${$}/result-cache/entry`,{method:"DELETE",body:e},3,5e3)}async setCacheResult(e){await this.sendRequest(`/${$}/result-cache/entry`,{method:"PATCH",body:e},3,5e3)}async getCacheResult(e){try{return await this.sendRequest(`/${$}/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(`/${$}/suites/queue`,{method:"POST",body:e},3,5e3);return Ug.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},r=await this.sendRequest(`/${$}/run-groups/status`,{method:"POST",body:t,noLog:!0},3,5e3);return gh.array().parse(r)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${$}/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(`/${$}/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(`/${$}/runs/${t}/attempts/${r}/console-logs`,{method:"POST",noLog:!0},3,5e3);return ca.parse(o)}async generateNetworkLogsForRunAttemptUploadUrl(e,t,r){let o=await this.sendRequest(`/${$}/runs/${t}/attempts/${r}/network-logs`,{method:"POST",noLog:!0},3,1e4);return ca.parse(o)}async generateHtmlSnapshotUploadUrl(e,t){let r=await this.sendRequest(`/${$}/snapshots/${t}/html`,{method:"POST",noLog:!0},3,1e4);return ca.parse(r)}async reportBillableEvents(e,t){try{await this.sendRequest(`/${$}/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(`/${$}/test-fragments/${e}`,{method:"GET",noLog:!0},3,1e4);return Bg.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${$}/test-fragments/${e}`,{method:"PATCH",body:t},3,1e4)}async getPastTestResults(e,t){let r=await this.sendRequest(`/${$}/results/tests/${e}`,{method:"POST",body:t},3,1e4);return zg.parse(r)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${$}/results/uploads`,{method:"POST",noLog:!0},3,1e4);return Hg.parse(e)}async startProcessingResultsUpload(e,t){let r=await this.sendRequest(`/${$}/results/uploads/${e}/process`,{method:"POST",noLog:!0,body:t},3,1e4);return jg.parse(r)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${$}/knowledge-base/icons`,{method:"GET",noLog:!0},3,5e3);return Jg.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${$}/knowledge-base/icons`,{method:"POST",body:e,noLog:!0},3,5e3)}catch(r){t.error({err:r},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,r,o){let i=new URLSearchParams;i.set("base",r),i.set("head",o);let a=await this.sendRequest(`/${$}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",noLog:!0},3,1e4);return Cd.parse(a)}async getMergeBaseCommitFromGitlab(e,t,r){let o=new URLSearchParams;o.set("base",t),o.set("head",r);let i=await this.sendRequest(`/${$}/git/gitlab/${e}/merge-base-commit?${o.toString()}`,{method:"GET",noLog:!0},3,5e3);return Cd.parse(i)}async getAgentConfig(){let e=await this.sendRequest(`/${$}/web-agent/agent-config`,{method:"GET",noLog:!0},3,5e3);return mp.record(mp.string(),mp.string()).parse(e)}};import{randomUUID as gy}from"crypto";var bl=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??gy(),properties:ud({},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??gy(),properties:ud({creditsUsed:r,usedBy:t},o)}])}catch(i){e.error({err:i},"Failed to report credits used")}}};function di(n,e,t){return fetch(n,{method:"PUT",body:t,headers:{"Content-Type":e}})}var wl=class{constructor(e){this.client=e}async storeConsoleLogsForRunAttempt(e,t,r,o){try{let i=JSON.stringify(o),{uploadUrl:a}=await this.client.generateConsoleLogsForRunAttemptUploadUrl(e,t,r),s=await di(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(i){e.error({err:i},"Failed to upload console logs")}}async storeNetworkLogsForRunAttempt(e,t,r,o){let i=JSON.stringify(o);try{let{uploadUrl:a}=await this.client.generateNetworkLogsForRunAttemptUploadUrl(e,t,r),s=await di(a,"application/json",i);if(!s.ok)throw new Error(`Failed to upload network logs: ${s.statusText}`)}catch(a){e.error({err:a},"Failed to upload network logs")}}async storeHtmlSnapshot(e,t,r){try{let{uploadUrl:o}=await this.client.generateHtmlSnapshotUploadUrl(e,t),i=await di(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 pi=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as VP,en as qP}from"@faker-js/faker";var ui="v1",Sr=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 VP({locale:qP}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${ui}/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(`/${ui}/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(`/${ui}/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(`/${ui}/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(`/${ui}/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(`/${ui}/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 KP}from"zod";var mi=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(`/${$}/web-agent/recommend-chunks-ai`,{method:"POST",body:r,signal:t.abortSignal});return vh.parse(o)}async rankChunksWithRag(e,t){let r=await this.sendRequest(`/${$}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:ka,...e},signal:t.abortSignal});return wh.parse(r)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${$}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return KP.string().parse(t)}async getElementLocation(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${$}/web-agent/locate-element`,{method:"POST",body:r,signal:t.abortSignal});return Eg.parse(o)}async getAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${$}/web-agent/assertion`,{method:"POST",body:r,signal:t.abortSignal});return Td.parse(o)}async getLintStepResult(e,t){let r={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${$}/web-agent/lint/step`,{method:"POST",body:r,signal:t.abortSignal});return Tg.parse(o)}async getVisualAssertionResult(e,t){let r={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,loggerTags:t.loggerTags},o=await this.sendRequest(`/${$}/web-agent/visual-assertion`,{method:"POST",body:r,signal:t.abortSignal});return Td.parse(o)}async getAiActionCommand(e,t){let r=await this.sendRequest(`/${$}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return xg.parse(r)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${$}/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(`/${$}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return zc.parse(r)}async getReverseMappedDescription(e,t){let r=await this.sendRequest(`/${$}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Cg.parse(r)}async getTextExtraction(e,t){let r={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${$}/web-agent/text-extraction`,{method:"POST",body:r,signal:t.abortSignal});return Bc.parse(o)}async getTestResultClassification(e,t){let r=await this.sendRequest(`/${$}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Zc.parse(r)}async getExtractedKeywords(e,t){let r=await this.sendRequest(`/${$}/web-agent/extract-keywords`,{method:"POST",body:{goal:e,disableCache:t.disableCache,context:e},signal:t.abortSignal});return Lh.parse(r)}async getAutohealingProposal(e,t){let r=await this.sendRequest(`/${$}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return ym.parse(r)}async getFailureRecoveryProposal(e,t){let r=await this.sendRequest(`/${$}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return bm.parse(r)}async getIframeRegex(e,t){let r=await this.sendRequest(`/${$}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Qu.parse(r)}};var hi=class extends Ft{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let r=await this.sendRequest(`/${$}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return em.parse(r)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var vl=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:r,id:o}=await this.client.generateTestResultsUploadUrl(),i=await di(r,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};function gi({orgId:n,client:e,gitMetadata:t,alwaysSaveCache:r,noCache:o}){return o?new Ya:new hp(n,e,t,r)}var hp=class{constructor(e,t,{gitMainBranch:r,gitBranchName:o,gitProtectedBranches:i,gitCommitTimestamp:a,lastCommitOnMainSha:s,lastCommitOnMainTimestamp:l},c){this.orgId=e;this.client=t;this.cacheHeaders={},r&&(this.cacheHeaders[Sg]=r),o&&(this.cacheHeaders[yg]=o),a&&(this.cacheHeaders[bg]=a.toISOString()),s&&(this.cacheHeaders[wg]=s),l&&(this.cacheHeaders[vg]=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 s of[t,r,o])s&&$o({steps:s,stepCacheEntries:i,logger:e.logger});let{cachesToSave:a}=await Dt({stepLists:e.stepLists,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateStepCaches({entries:a,testId:e.testId},this.cacheHeaders)}};import ek from"path";import{Server as CN}from"socket.io";import{cloneDeep as YP}from"lodash-es";var JP={showOverlay:!1},gp=class{sessions=new Map;sessionCountByIp=new Map;getCurrentConnectionsByIp(e){return this.sessionCountByIp.get(e)??0}getCurrentSessionsByIp(){return Object.fromEntries(this.sessionCountByIp)}reserveCapacityByIp(e){e&&this.sessionCountByIp.set(e,(this.sessionCountByIp.get(e)??0)+1)}releaseCapacityByIp(e){e&&this.sessionCountByIp.set(e,Math.max(this.getCurrentConnectionsByIp(e)-1,0))}registerSession({controller:e,context:t,cleanup:r,clientIp:o,sessionId:i,browserbaseSessionId:a}){return this.sessions.set(i,{controller:e,context:t,cleanup:r,clientIp:o,browserbaseSessionId:a,browserBehavior:YP(JP)}),i}removeSession(e,t){(async()=>{let o=this.sessions.get(e);if(!o)return;this.releaseCapacityByIp(o.clientIp);let{controller:i}=o;try{i.setClosed(),await i.browser.cleanup()}catch(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 gp;function fy(n,e,t){let r=Date.now(),o=Date.now(),i,a,s,l,c=!1,d=async(h,g)=>{if(!h.closed&&!h.isInPageLoad)try{let f=s;s=void 0;let S=h.url(),w=g.toEditorDisplayCopy();JSON.stringify(w)===JSON.stringify(i)&&S===l&&r>o||(n.emit("browserState",{logsPerPage:f?.logsPerPage,harPages:f?.harPages,harEntries:f?.harEntries,viewport:h.getViewport(),url:S,iframeSrcUrls:a??[],context:w,isInPageLoad:h.isInPageLoad}),r=Date.now()),l=S,i=w}catch(f){if(!n.connected)return;let S=f instanceof Error?f.message:`${f}`;if(S.includes("Frame was detached")||S.includes("Not attached to an active page")||S.includes("browser has been closed")||S.includes("UserInfrastructureError"))return;t.error({err:f,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let h=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 yr={};var XP=n=>()=>{let{sessionId:e}=n.metadata;yr[e]?.abort?.abort()},Sy={event:"cancelApiTest",createHandler:XP};import{CookieJar as fL}from"tough-cookie";import{randomUUID as iL}from"crypto";import{faker as ZP}from"@faker-js/faker";import QP from"assert";import eL from"axios";import tL from"moment";import*as nL from"otpauth";import rL from"pg";async function yy(n){let e;try{e=new URL(n.url).hostname}catch{}let t=[];return n.headers.getSetCookie()?.forEach(r=>{let o=Ms(r,e);t.push(...o)}),t}var oL=Object.getPrototypeOf(async function(){}).constructor;async function by(n,e,t){let r=e.code;e.options.fragment&&(r=`return ${e.code}`);let{env:o}=e.bindings,i=e.tools,a={},s=(f,S)=>{o[f]=S,a[f]=S},l={},c=(f,S)=>{o[f]=S,l[f]=S},d;r.includes("Octokit")&&(d=(await import("@octokit/rest")).Octokit);let p;r.includes("createAppAuth")&&(p=(await import("@octokit/auth-app")).createAppAuth);let u=async()=>await Promise.resolve(new oL("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai",r)(eL,tL,i.fakerInstance??ZP,QP,rL,d,p,nL,yy,o,s,c,S=>i.sms.send(S),S=>i.sms.fetchLatest(S),i.email,i.sms,i.ai)),m=!0,h,g;try{h=await U(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 fr?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 wy({code:n,fragment:e,context:t,localTools:r,logger:o,signal:i,timeoutMs:a=lr}){let s=iL(),l=await by(s,{code:n,options:{fragment:e,timeoutMs:a},bindings:t.toObjectCopy(),tools:r,signal:i},o);return b.debug(`[${s}] Got execution result: ${JSON.stringify(l)}`),l}import{createHmac as aL,randomUUID as sL}from"crypto";import lL from"fetch-retry";var cL=lL(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}}),vy=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,xy=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function Ty({orgId:n,code:e,fragment:t,context:r,timeoutMs:o=lr,retries:i=2,signal:a,logger:s}){if(!vy)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let l,c,d=0;if(!xy)throw new Error("Missing lambda auth secret.");let p=aL("sha256",xy).update(n).digest("hex");for(;d<=i;){d++,a?.throwIfAborted();let m={id:sL(),orgId:n,momenticLambdaAuthHash:p,code:e,fragment:t,state:r.toObjectCopy(),timeoutMs:o};try{if(l=await U(cL(vy,{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=Uh.parse(await l.json())}catch(m){throw new Error(`Code evaluation server returned invalid response: ${m}`)}if(u.error)throw new Error(`Code evaluation error: ${u.error}`);return u}async function Kn(n){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await Ty(n);else if(n.localTools)e=await wy({...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
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 dL}from"lodash-es";async function Gt(n){let{orgId:e,s:t,context:r,logger:o,signal:i,flagStore:a,retries:s=2,timeoutMs:l=lr,allowUndefined:c=!1}=n,d=/{{(.*?)}}/g,p=t.matchAll(d),u=t;for(let m of p){if(m.length<2)continue;let h=m[1].trim(),g;try{g=await Kn({orgId:e,code:h,fragment:!0,context:r,timeoutMs:l,logger:o,retries:s,localTools:n.localTools,signal:i,flagStore:a})}catch(S){throw o.error({err:S,value:t},"Error evaluating template string"),S}if(g===void 0&&!c)throw new 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 fi(n){return Ey(n)}async function Ey({obj:n,bannedKeys:e,allowList:t,context:r,prefixPath:o=[],replacements:i=[],...a}){for(let s in n){if(e.includes(s))continue;let l=!1;if(t)if(t.includes(s))l=!0;else continue;let c=n[s],d=[...o,s];if(typeof c=="string"&&c.includes("{{")){let p=await Gt({s:c,context:r,...a});if(c===p)continue;i.push({path:d,original:c}),n[s]=p}else typeof c=="object"&&c!==null&&!Array.isArray(c)&&await Ey({obj:c,bannedKeys:e,context:r,prefixPath:d,replacements:i,allowList:l?void 0:t,...a})}return i}function Cy(n,e){for(let{path:t,original:r}of e)dL(n,t,r)}import pL from"fetch-retry";var u6=process.env.MAILINATOR_API_KEY,m6=pL(global.fetch,{retryOn:function(n,e,t){return n>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(n){return 500}});import mL from"fetch-cookie";import{cloneDeep as hL}from"lodash-es";var uL=3e4;async function xl({command:n,logger:e,baseUrl:t,fetchImplementation:r=fetch}){let o=n.timeout??uL/1e3,i=Object.fromEntries(Object.entries(n.headers||{}).filter(([m,h])=>m&&h)),a=new URLSearchParams;Object.entries(n.params||{}).filter(([m,h])=>m&&h).forEach(([m,h])=>{a.append(m,h)});let s=a.toString(),l;if(Go(n.url)&&(l=n.url),t&&Wo(n.url,t)&&(l=new URL(n.url,t).toString()),!l)throw new A("ActionFailureError",`Invalid URL: ${n.url}`);e.debug({url:l,searchParams:s,headers:i,body:n.body,method:n.method},"Making HTTP request");let d=await U((async()=>{let m=s?`${l}?${s}`:l;try{return await r(m,{headers:i,method:n.method,body:n.body})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new 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 Ry(n){let{fixtures:e,inputs:t}=n,{context:r}=e,{orgId:o,step:i}=t,a=hL(i);await fi({obj:a,orgId:o,bannedKeys:["code"],...e});let s=await gL(n);return a.envKey&&s.data&&r.setVariable(a.envKey,s.data),s}async function gL(n){let{fixtures:e,inputs:t}=n,{step:r,orgId:o,baseUrl:i}=t,{cookieJar:a}=e,s=new Date;switch(r.type){case"JAVASCRIPT":{let c=await Kn({code:r.code,orgId:o,fragment:!!r.fragment,timeoutMs:r.timeout?r.timeout*1e3:void 0,...e});try{JSON.stringify(c)}catch(d){return{...r,startedAt:s,finishedAt:new Date,status:"FAILED",message:`JavaScript return value is not serializable: ${d instanceof Error?d.message:`${d}`}`}}return{...r,startedAt:s,finishedAt:new Date,message:"JavaScript code executed successfully",status:"SUCCESS",data:c}}case"REQUEST":{let c=mL(fetch,a),d=await xl({command:r,logger:e.logger,baseUrl:i,fetchImplementation:c});return{...r,startedAt:s,finishedAt:new Date,status:"SUCCESS",message:"Request executed successfully",data:d}}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}async function Ay(n){let{inputs:e,fixtures:t,callbacks:r}=n,{signal:o}=t,{steps:i,orgId:a,baseUrl:s}=e,{test:l,step:c}=r,d={startedAt:new Date,status:"RUNNING",results:[]},p=d.results,u=new fL,m={cookieJar:u,...t};for(let h of i){let g=new Date;c.onStarted?.(h.id);let f;try{o?.throwIfAborted(),f=await Ry({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:ks(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 Iy(n){let{socket:e,storageFactory: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}),a=await t(i),{baseUrl:s,envName:l,testName:c,environmentVariables:d}=await fp({testId:o,orgId:i,logger:n.logger,storage:a,authorization:n.authorization}),p={type:"api-test",orgId:await n.getOrgId({type:"api-test",testId:o}),testId:o,sessionId:r,latestContext:new Ot({baseUrl:s||"",currentUrl:s||"",variablesFromEnvironment:d,envName:l,testName:c})};return yr[r]=p,p}async function fp({testId:n,logger:e,storage:t,authorization:r}){let o=await t.fetchApiTestMetadata(n,e);if(!o)throw new Error(`Failed to fetch API test metadata for test ID: ${n}`);let i;r?.type==="API_KEY"&&(i=new Sr({httpClient:new Ft({...r,logger:e}),fakerSeed:void 0}));let a=o.envs?.find(d=>d.default),s;a&&(s=await t.fetchEnvironment(a.name,e));let l=o.baseUrl||s?.variables?.[Ve];if(!l)throw new Error("Base URL is empty in both API test options and the configured environment");let c={...s?.variables};return{baseUrl:l,envName:s?.name,testName:o.name,environmentVariables:c,localCodeEvalTools:i}}var SL=n=>async(e,t)=>{let{steps:r}=e,{authorization:o,metadata:i,socket:a,logger:s,flagStoreFactory:l,storageFactory:c}=n,{orgId:d,testId:p,sessionId:u}=i,m=s.child({testId:p,orgId:d,sessionId:u}),h=yr[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,S=await c(d),{localCodeEvalTools:w,baseUrl:x}=await fp({testId:p,orgId:d,logger:m,storage:S,authorization:o}),y={context:f,logger:m,localTools:w,signal:g.signal,flagStore:await l(d)},R=await Ay({inputs:{steps:r,orgId:d,baseUrl:x},fixtures:y,callbacks:{test:{onFinished:()=>{a.emit("apiTestFinished")}},step:{onStarted:L=>{a.emit("apiStepStarted",L)},onFinished:L=>{a.emit("apiStepFinished",L)}}}});t({result:R})},Py={event:"executeApiTest",createHandler:SL};var yL=({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{}}},Ly={event:"cancel",createHandler:yL};var bL=({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 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})}}},Oy={event:"fetchA11yTree",createHandler:bL};var wL=({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 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})}}},My={event:"fetchDom",createHandler:wL};var vL=({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 yr[t]}},Ny={event:"disconnect",createHandler:vL};function an(n){let{result:e,nestedResults:t}=n;if(!n.nestedResults.length)return;let{firstMetadata:r,lastMetadata:o}=xL(t);TL(e,r,o);let i=[...n.asyncTasks];n.asyncTasks.push((async()=>{try{await EL(i,e,r,o)}catch(a){n.logger.error({result:n.result,err:a},"Error hoisting scalar result metadata")}})())}function xL(n){let e=n[0],t;for(;;){switch(e.type){case"PRESET_ACTION":{t=e;break}case"CONDITIONAL":if(e.assertion){t=e;break}break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!e.results.length){t=e;break}e=e.results[e.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(t)break}let r=n[n.length-1],o;for(;;){switch(r.type){case"PRESET_ACTION":{o=r;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":case"IFRAME":if(!r.results.length){o=r;break}r=r.results[r.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}if(o)break}return{firstMetadata:t,lastMetadata:o}}function TL(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 EL(n,e,t,r){await Promise.allSettled(n),t&&(e.beforeSnapshot=t.beforeSnapshot),r&&(e.afterSnapshot=r.afterSnapshot)}import _a from"os";import CL from"v8";var ky,Mn,RL=_a.platform(),AL=_a.cpus().map(n=>({model:n.model,speed:n.speed}));function _y(n){let e=()=>{try{let t=!1,r=IL(),o=PL();r.freeMemory<1e6&&(t=!0);let i=CL.getHeapStatistics(),a=i.used_heap_size,s=i.heap_size_limit;a/s>.9&&(t=!0),t?n.warn({memory:r,cpu:o,heapStats:i},"Critical resource usage metrics detected"):n.debug({memory:r,cpu:o},"Got machine resource usage metrics")}catch{}};return e(),{interval:setInterval(e,1e4),cpuMetadata:AL,platform:RL}}function IL(){let n=_a.totalmem(),e=_a.freemem(),t=n-e;return{totalMemory:n,freeMemory:e,usedMemory:t}}function PL(){let n=_a.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,!Mn)return Mn=t,null;let r={user:t.user-Mn.user,nice:t.nice-Mn.nice,sys:t.sys-Mn.sys,idle:t.idle-Mn.idle,irq:t.irq-Mn.irq,total:t.total-Mn.total};return ky={measurementTime:e,intervalMs:e-Mn.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},Mn=t,ky}import{hostname as kL}from"os";async function Fy(n){let{command:e,tracer:t,timeoutMs:r,targetingWrapper:o,disableCache:i,fixtures:a}=n,{logger:s,abortSignal:l}=a;if(e.target&&!ir(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:a.ctx,tracer:t,command:e,target:e.target,cache:e.cache?.target,action:async S=>LL(S.locator,n),options:{...e,disableCache:i,disableGlobalLocatorRedirect:!0,source:Mr(e)}});if(u={success:f.success,data:f.data,err:f.err,newTarget:h,elementInteractedDisplayString:g},!f.success){u=f,m=Math.min(m*2,1e4);continue}return u}catch(h){if(l?.throwIfAborted(),c)return{success:!0,thoughts:`The element described does not exist on the page: ${h.message}`};if(s.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 LL(n,{command:e,fixtures:t}){let r=e.assertion;await t.browser.highlight(n);let o=!0,i,a;switch(r.type){case"ELEMENT_CONTENT":{let s=await n.textContent()??"";if(a={elementTextContent:je(s,500,!0)},!Dy(s,r.value,r.operation,!!r.negated)){let l=r.negated?dr[r.operation]:pr[r.operation];o=!1,i=new A("AssertionFailureError",`The content ${l} '${r.value}': ${s}`)}break}case"ELEMENT_ATTRIBUTE":{a={elementOuterHtml:je(await n.evaluate(l=>l.cloneNode(!1).outerHTML),500,!0)};let s;try{s=await n.getAttribute(r.attr,{timeout:3e3})??""}catch(l){i=new A("AssertionFailureError",`The element does not have an attribute named ${r.attr}: ${l}`),o=!1;break}if(!Dy(s,r.value,r.operation,!!r.negated)){let l=r.negated?dr[r.operation]:pr[r.operation];o=!1,r.operation==="EXISTS"?i=r.negated?new A("AssertionFailureError",`The attribute ${r.attr} ${l}: ${s}`):new A("AssertionFailureError",`The attribute ${r.attr} ${l}`):i=new A("AssertionFailureError",`The attribute ${r.attr} ${l} '${r.value}': ${s}`)}break}case"ELEMENT_EXISTENCE":{switch(r.condition){case"VISIBLE":{o=await n.evaluate(async(l,c)=>{let d=Date.now();for(;Date.now()-d<c;){let p=l.getBoundingClientRect();if(p.width>0&&p.height>0)return!0;await new Promise(u=>setTimeout(u,250))}return!1},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 s=r.negated?Pd[r.condition]:Ld[r.condition];i=new A("AssertionFailureError",`The element ${s}`)}break}}return{success:o,data:a,err:i}}function Dy(n,e,t,r){let o;switch(t){case"CONTAINS":{o=n.includes(e);break}case"EQUALS":{o=n.trim()===e.trim();break}case"STARTS_WITH":{o=n.trim().startsWith(e);break}case"EXISTS":{o=n.trim().length>0;break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return r?!o:o}import{Jimp as OL}from"jimp";async function Da(n,e){let t=await n.screenshot(e),r=await OL.fromBuffer(t);return{buffer:t,width:Math.ceil(r.bitmap.width??0),height:Math.ceil(r.bitmap.height??0)}}import{Jimp as Uy}from"jimp";import Sp from"jpeg-js";import ML from"pixelmatch";async function By({ctx:n,tracer:e,command:t,disableCache:r,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!ir(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let l={clearHighlights:!0,hideCaret:!0},c;t.target?.elementDescriptor?c=(await i({ctx:n,tracer:e,command:t,target:t.target,cache:t.cache?.target??t.target?.a11yData,action:async z=>Da(o,{locator:z.locator,...l}),options:{...t,disableCache:r,disableGlobalLocatorRedirect:!0}})).result:c=await Da(o,l);let d=await s.prepareGoldenScreenshotForComparison(a,t,c);if((c.height!==d.height||c.width!==d.width)&&a.debug({currHeight:c.height,currWidth:c.width,savedHeight:d.height,savedWidth:d.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(c.height-d.height)>10||Math.abs(c.width-d.width)>10){let H=`${c.width}x${c.height}`,z=`${d.width}x${d.height}`;return{fail:!0,thoughts:`Current screenshot (${H}) does not match saved screenshot dimensions (${z}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:d.buffer,afterScreenshotOverride:c.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let p=await Uy.fromBuffer(c.buffer),u={width:c.width,height:c.height},m=await Uy.fromBuffer(d.buffer),h={width:d.width,height:d.height},g,f=u.width*u.height,S=h.width*h.height,w=Math.abs(u.height-h.height),x=Math.abs(u.width-h.width);if(f>S){let H=p.cover({w:h.width,h:h.height});c.buffer=await H.getBuffer("image/jpeg"),g="current",c.width=h.width,c.height=h.height}else if(S>f){let H=m.cover({w:u.width,h:u.height});d.buffer=await H.getBuffer("image/jpeg"),g="saved"}let y={data:Buffer.alloc(c.width*c.height*4),width:c.width,height:c.height},E=t.threshold??.1,R=ML(Sp.decode(d.buffer).data,Sp.decode(c.buffer).data,y.data,c.width,c.height,{threshold:E,diffColorAlt:[0,255,0]})/(c.width*c.height)*100,L=R>E*100,M=`Visual diff of ${R.toFixed(2)}% detected, which is ${L?"over":"under"} the threshold of ${E*100}%.`;if(g&&(M+=` The ${g} screenshot was cropped since it was taller by ${w} pixels and wider by ${x} pixels.`),L)throw new A("ActionFailureError",M);return{fail:L,thoughts:M,beforeScreenshotOverride:c.buffer,afterScreenshotOverride:Sp.encode(y,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var NL=5e3;async function Tl({timeout:n=Rn,...e}){let t=Date.now(),r=n*1e3,o=r+1e4,i,a=0,s=500;for(;a-t<r;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal.throwIfAborted();let l=Date.now();i=await zy(e),a=Date.now();let c=a-l;if(c>1e3&&e.logger.warn({pageAssertDuration:c},"Page assertion took longer than expected"),!i.success)await te(s,e.signal),s=Math.min(Math.floor(s*1.5),NL);else return i}return i=await zy(e),i}async function zy({assertion:n,browser:e,flagStore:t}){switch(n.type){case"CONTENT":{let o,i=!1,a;try{let s;if(t.isBooleanFlagEnabled("auto_expand_iframes")){let l=await e.evaluateFunctionInAllFrames(Hy,{value:n.value,negated:!!n.negated,returnHtml:!1});i=n.negated?l.every(c=>c.evaluation):l.some(c=>c.evaluation),s=l.find(c=>c.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(Hy,{value:n.value,negated:!!n.negated,returnHtml:!0},"checking page content"));if(!i){let l=n.negated?dr.CONTAINS:pr.CONTAINS;a=new A("AssertionFailureError",`The page ${l} '${n.value}'.`),o=s}}catch(s){a=new A("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n.type)}}function Hy({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 yp=async n=>{let{step:e,resolvedInputs:t}=n.moduleParams,{logger:r,context:o,storage:i,codeEvalTools:a,controller:s}=n.fixtures,l=s.browser,{orgId:c,runId:d}=n.inputs,p=s.executeAbortController.signal;Object.keys(t).length>0&&(o.setInputs(t),r.debug({inputs:t,moduleId:e.moduleId},"Set module inputs"));let u,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await Gt({orgId:c,s:f,context:o,logger:r,localTools:a,signal:p,flagStore:s.flagStore});g={orgId:c,cacheKeys:[S,...Object.entries(t).map(([x,y])=>`${x}:${y}`)]},r.debug({original:f,keyParams:g},"Module cache key params");let w=Date.now();for(;Date.now()-w<hg;){p?.throwIfAborted();let x=await i.getCacheResult(g);if(x){r.debug({cacheResult:x},"Got result from module execution cache"),u=El(e,t,"SUCCESS"),u.message="Used cached module result.",u.data=JSON.parse(x),m=!0;break}else r.debug({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let y=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${kL()};runId:${d}`},p);if(y.acquired){h=y.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 _L(n);else if(e.autoAuth){let f=Ns.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,w=e.advanced?.cacheInvalidation;if(w&&w.type==="PAGE_CHECK"){let x={type:"CONTENT",value:w.substring},y=await Tl({timeout:Rn,assertion:x,browser:l,flagStore:s.flagStore,logger:r,signal:p});y.success?r.debug({invalResult:y},"Cached result still valid after page check, continuing..."):(r.info({invalResult:y},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),yp(n)}}finally{try{h!==void 0&&!m&&u?.status==="SUCCESS"&&await DL({step:e,result:u,browser:s.browser,cacheKeyPrefix:h,logger:r,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return u},_L=async n=>{let{step:e,tracer:t}=n.moduleParams,r=El(e,n.moduleParams.resolvedInputs,"SUCCESS"),o=await t.startSubSteps(),{status:i,results:a}=await br(n.work,()=>n.executeStepList({...n,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}}));return r.results=a,r.status=i,r.finishedAt=new Date,an({asyncTasks:n.work.asyncTasks,nestedResults:a,result:r,logger:n.fixtures.logger}),r};function El(n,e,t){let r={};return Object.entries(e).forEach(([i,a])=>{r[i]=JSON.stringify(a)}),{type:"MODULE",id:n.id,moduleId:n.moduleId,moduleName:n.name,startedAt:new Date,cacheConfig:n.cacheConfig,inputs:r,results:[],finishedAt:new Date,status:t}}async function jy({orgId:n,step:e,context:t,logger:r,flagStore:o,codeEvalTools:i,signal:a}){let s={};try{for(let l of e.parameters??[]){let c=e.inputs?.[l]??e.defaultParameters?.[l];if(!c){r.warn(`No value or default found for parameter '${l}' that is required by module '${e.name}'`);continue}s[l]=await Kn({orgId:n,code:c,fragment:!0,context:t,logger:r,localTools:i,signal:a,flagStore:o})}return s}catch(l){throw a?.throwIfAborted(),new A("UserConfigurationError",`Failed to evaluate module inputs: ${l}`)}}async function DL({step:n,result:e,browser:t,cacheKeyPrefix:r,logger:o,storage:i}){let a=n.cacheConfig?.cacheExpiryMs;(!a||a===Wg)&&(a=n.defaultCacheTtl??Vg);let s;n.autoAuth?s=JSON.stringify(await t.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:r,ttlMs:a,truncatedCacheResultJson:bf(s)},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:r,ttlMs:a})}async function wr(n,e,t){let r=new Date;try{return t.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(t.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof A?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,n.type==="RESOLVED_MODULE"){let l=El(n,{},"FAILED");return l.message=s,l.startedAt=r,l.finishedAt=i,l}return{...Ys(n),startedAt:r,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function br(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 $y}from"crypto";import{cloneDeep as UL}from"lodash-es";function Cl(n,e){n.state.healingDetails?n.state.healingDetails.push(e):n.state.healingDetails=[e]}var Rl=async n=>{let{step:e,tracer:t}=n.presetParams,{logger:r,controller:o,context:i,billingReporter:a}=n.fixtures,{collectDebugData:s}=n.options,{testMetadata:l,suiteMetadata:c}=n.inputs,d=e.command.type,p=r.child({commandType:d,stepId:e.id,commandId:e.command.id}),u=aa(e.command);n.work.asyncTasks.push(a.reportCreditsUsed(p,d,u,{testId:l?.id,testName:l?.name,suiteId:c?.id,suiteName:c?.name}));let m=o.browser.url(),h=new Date,g,f=$y(),S=$y();if(s)try{g=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75});let C=await o.browser.getRawCondensedHtml();t.attachBeforeHtmlSnapshot({logger:p,snapshotId:f,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(p,f,C))}catch(C){p.debug({err:C},"Failed to take screenshot before step, likely because the page is still loading. This is non-fatal and does not affect the test.")}let w,x,y,E=Ps();try{let C=await o.executePresetCommand(E,t,e.command,i,l?.advanced.disableAICaching??!1);C.beforeScreenshotOverride&&(g=C.beforeScreenshotOverride),y=C.afterScreenshotOverride;let{proposedStep:R}=BL({work:n.work,step:e,newTargets:C.newTargets,logger:p}),L=new Date,M=o.browser.url();x={beforeUrl:m,afterUrl:M,startedAt:h,finishedAt:L,viewport:o.browser.getViewport(),status:C.fail?"FAILED":"SUCCESS",elementInteracted:C.elementInteracted},w={...e,message:C.thoughts??zL(C.newTargets)??"Successfully executed preset action.",beforeUrl:m,afterUrl:M,finishedAt:L,startedAt:h,status:C.fail?"FAILED":"SUCCESS",data:C.data,results:[x],details:E.details,proposedStep:R},"assertion"in e.command&&(w.message=C.thoughts||"Assertion passed.")}catch(C){p.error({message:C.message,stack:C.stack},`Failed executing preset step ${$r(e.command)}`);let R=o.browser.url(),L=new Date,M=C instanceof Error?C.message:`${C}`;C instanceof A&&C.getLastScreenshotBuffer()&&(y=C.getLastScreenshotBuffer()),x={beforeUrl:m,afterUrl:R,startedAt:h,finishedAt:L,viewport:o.browser.getViewport(),status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:M},w={...e,startedAt:h,finishedAt:L,beforeUrl:m,afterUrl:R,status:C instanceof DOMException&&C.name==="AbortError"?"CANCELLED":"FAILED",message:M,failureReason:C instanceof A?C.reason:void 0,results:[x],details:E.details}}if(s)try{y||(y=await o.browser.screenshot({retries:1,quality:75}));let C=await o.browser.getRawCondensedHtml();t.attachAfterHtmlSnapshot({logger:p,snapshotId:S,html:C}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeHtmlSnapshot(p,S,C))}catch(C){p.debug({err:C},"Failed store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return x.beforeSnapshot=f,w.beforeSnapshot=f,x.afterSnapshot=S,w.afterSnapshot=S,g&&(t.attachBeforeScreenshot({logger:p,snapshotId:f,screenshot:g}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(p,f,g))),y&&(t.attachAfterScreenshot({logger:p,snapshotId:S,screenshot:y}),n.work.asyncTasks.push(n.fixtures.debugDataStorage.storeScreenshot(p,S,y))),w};function BL({work:n,step:e,newTargets:t,logger:r}){if(!t?.length)return{proposedStep:void 0};let o=e.command;uf(o,t,r);let i=t[0]?.description;if(i&&"target"in o&&o.target&&o.target.type==="description"){let a={...o,target:{...o.target,elementDescriptor:i}},s={...UL(e),command:a};return Cl(n,{type:"DESCRIPTION_UPDATE",thoughts:`Updated element description after the original element could not be found on the page. New element location reasoning: ${t[0]?.thoughts}`}),{proposedStep:s}}return{proposedStep:void 0}}function zL(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}
|
|
@@ -3826,7 +3826,7 @@ ${a.stack}`),l.status(500).send("Internal Server Error")}),n){let a=xv.static(n,
|
|
|
3826
3826
|
for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
|
|
3827
3827
|
`)}import f_ from"events";import Sc from"fs";import S_ from"open";import fc from"path";import{fileURLToPath as y_}from"url";import wk from"diff-lines";import{gt as vk}from"semver";import{execSync as nk}from"child_process";import{platform as rk}from"os";function mu(){return Rv()?(b.dimmed("Setting device pixel ratio to 2 automatically since a Mac OS Retina screen was detected."),b.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.
|
|
3828
3828
|
`),2):(b.dimmed("Setting device pixel ratio to 1."),b.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.
|
|
3829
|
-
l.`),1)}function Rv(){return rk()==="darwin"&&nk("system_profiler SPDisplaysDataType").toString().includes("Retina")}function hu(n){Rv()&&n===1&&(b.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),b.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import ok from"@actions/exec";import ik from"@actions/io";import ak from"quote";import sk from"string-argv";async function Av(n,e=!0){let t=sk(n),r=await ik.which(t[0],!0),o=t.slice(1),i=ok.exec(ak(r),o,{delay:100});if(e)return i}import{existsSync as lk,statSync as ck}from"fs";var Ai=!!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 Iv(n){try{return lk(n)&&ck(n).isDirectory()}catch(e){return b.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import dk from"csv-parser";import{createReadStream as pk}from"fs";function gu(n){return new Promise((e,t)=>{let r=[];pk(n).pipe(dk()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Xl from"semver";import{z as Zl}from"zod";var vn="2.6.1",uk="https://registry.npmjs.org/momentic",mk=Zl.object({versions:Zl.record(Zl.string(),Zl.unknown()).optional()});async function Pv(n){try{await hk(n)}catch(e){b.warn({err:e},"Failed to check CLI version against NPM servers")}}async function hk(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 U(fetch(uk),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=mk.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))Xl.valid(r)&&(!t||Xl.gt(r,t))&&Xl.gt(r,vn)&&Xl.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(b.warn(`Update available: v${vn} -> v${t}`),b.warn("This version may be missing critical fixes, features, and security updates."),b.warn(`Run "npx momentic@${t} -V" to update`))}import{existsSync as fk,mkdirSync as Sk,statSync as yk}from"fs";import{dirname as bk}from"path";import Ov from"readline/promises";import{hostname as gk}from"os";var Q=Vl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:gk(),disableConsoleLogs:!0}).child({version:"2.6.1"});var fu=!1,Mv=(()=>{try{return yk("/.dockerenv"),!0}catch{return!1}})();async function St(n,e){if(Ai||fu||Mv)return!0;Q.flush(),await new Promise(a=>setTimeout(a,500));let t=Ov.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let a=`${r.slice(0,r.length-1).join(".").trim()}.`;e?b.warn(a):b.log(a),o=r[r.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(fu=!0,setTimeout(()=>{fu=!1},3e3),!0):i.toLowerCase()==="y"}async function Su(n){let e=bk(n);return Iv(e)?fk(n)?St(`File '${Lv(n)}' already exists. Overwrite existing content?`,!0):!0:await St(`Directory '${Lv(e)}' doesn't exist. Create it now?`,!0)?(Sk(e,{recursive:!0}),!0):!1}function Lv(n){return n.replace(/(\s+)/g,"\\$1")}async function Nv(n,e){if(Ai||Mv)return e;let t=Ov.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function kv({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){vk(e.schemaVersion,De)&&(b.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)),pf(e.steps).forEach(g=>{t.modules[g]||(b.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 s=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<s&&!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=Zr(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let d,p;if(e.schemaVersion!==De){let{steps:g,newVersion:f}=await pa({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:b});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=wk(JSON.stringify(c,void 0,2),JSON.stringify(u,void 0,2),{n_surrounding:5});b.dimmed("=".repeat(30)),b.dimmed(h),b.dimmed("=".repeat(30)),b.dimmed(""),d&&b.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?")&&(b.dimmed("Cancelled."),process.exit(1)),Wn({relativeTestPath:n.relativePath,steps:u,schemaVersion:d??e.schemaVersion,project:t.project}),b.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as uo}from"crypto";import{z as Zv}from"zod";var Wt=" ".repeat(6);import Xv from"chalk";import{Argument as co,Option as Me}from"@commander-js/extra-typings";import{validateHeaderValue as xk}from"http";import{cpus as _v}from"os";import{parse as Che}from"yaml";import{z as q}from"zod";var Ql=58888,yu=30*60*1e3,Zn=new Me("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),Qn=new Me("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),po=new Me("-y, --yes","Skip all confirmation prompts.").env("CI"),bu=new Me("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),wu=new Me("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${yu/1e3} seconds.`),ec=new Me("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),Fv=new Me("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(na)),Uv=new Me("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. Defaults to 'reports' if unset."),vu=new Me("--output-dir <outputDir>","[Alpha] Output directory to store run artifacts such as screenshots, results, and logs. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. This directory will be cleared at the start of execution."),Bv=new Me("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),xu=new Me("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),Tu=new Me("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),Eu=new Me("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio."),zv=new Me("--port <port>",`Port to run the app on. Defaults to ${Ql}.`),Cu=new Me("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),tc=new Me("--env <env>","Name of the environment to use when running tests."),nc=new Me("--url-override <urlOverride>","Fully qualified url (e.g. https://www.google.com) to start all tests from. Overrides any default starting url set from the test or environment."),Hv=new Me("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),xn=new Me("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),rc=new Me("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),jv=new Me("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),$v=new Me("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),Ru=new Me("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on the protected branches configured in the momentic.config.yaml.").env("CI"),Au=new Me("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),Gv=new co("<tests...>",`One or more test paths to queue on Momentic Cloud.
|
|
3829
|
+
l.`),1)}function Rv(){return rk()==="darwin"&&nk("system_profiler SPDisplaysDataType").toString().includes("Retina")}function hu(n){Rv()&&n===1&&(b.warn("If you are using Momentic on a Retina screen, relaunch with the --pixel-ratio option to avoid incorrect viewport calculations."),b.warn("Confirm your device's pixel-ratio at https://www.mydevice.io."))}import ok from"@actions/exec";import ik from"@actions/io";import ak from"quote";import sk from"string-argv";async function Av(n,e=!0){let t=sk(n),r=await ik.which(t[0],!0),o=t.slice(1),i=ok.exec(ak(r),o,{delay:100});if(e)return i}import{existsSync as lk,statSync as ck}from"fs";var Ai=!!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 Iv(n){try{return lk(n)&&ck(n).isDirectory()}catch(e){return b.error({err:e},`Error reading path ${n} during directory existence check`),!1}}import dk from"csv-parser";import{createReadStream as pk}from"fs";function gu(n){return new Promise((e,t)=>{let r=[];pk(n).pipe(dk()).on("data",o=>r.push(o)).on("end",()=>e(r)).on("error",o=>t(o))})}import Xl from"semver";import{z as Zl}from"zod";var vn="2.6.2",uk="https://registry.npmjs.org/momentic",mk=Zl.object({versions:Zl.record(Zl.string(),Zl.unknown()).optional()});async function Pv(n){try{await hk(n)}catch(e){b.warn({err:e},"Failed to check CLI version against NPM servers")}}async function hk(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 U(fetch(uk),{milliseconds:5e3});if(!o.ok)throw new Error(`Got error status code ${o.statusText}`);let i=await o.json();e=mk.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))Xl.valid(r)&&(!t||Xl.gt(r,t))&&Xl.gt(r,vn)&&Xl.lt(r,"2.0.0")&&!r.includes("alpha")&&(t=r);t&&(b.warn(`Update available: v${vn} -> v${t}`),b.warn("This version may be missing critical fixes, features, and security updates."),b.warn(`Run "npx momentic@${t} -V" to update`))}import{existsSync as fk,mkdirSync as Sk,statSync as yk}from"fs";import{dirname as bk}from"path";import Ov from"readline/promises";import{hostname as gk}from"os";var Q=Vl({app:"cli",clientToken:"pub7eb923f18fb3f1d42ac5eba8c5ea13a5",hostname:gk(),disableConsoleLogs:!0}).child({version:"2.6.2"});var fu=!1,Mv=(()=>{try{return yk("/.dockerenv"),!0}catch{return!1}})();async function St(n,e){if(Ai||fu||Mv)return!0;Q.flush(),await new Promise(a=>setTimeout(a,500));let t=Ov.createInterface({input:process.stdin,output:process.stdout}),r=n.split("."),o;if(r.length===1)o=n;else{let a=`${r.slice(0,r.length-1).join(".").trim()}.`;e?b.warn(a):b.log(a),o=r[r.length-1].trim()}let i=await t.question(`${o} ('y' for yes / n for no / 'A' to accept all) `);return t.close(),i==="A"?(fu=!0,setTimeout(()=>{fu=!1},3e3),!0):i.toLowerCase()==="y"}async function Su(n){let e=bk(n);return Iv(e)?fk(n)?St(`File '${Lv(n)}' already exists. Overwrite existing content?`,!0):!0:await St(`Directory '${Lv(e)}' doesn't exist. Create it now?`,!0)?(Sk(e,{recursive:!0}),!0):!1}function Lv(n){return n.replace(/(\s+)/g,"\\$1")}async function Nv(n,e){if(Ai||Mv)return e;let t=Ov.createInterface({input:process.stdin,output:process.stdout}),r=await t.question(`${n} `);return t.close(),r.trim()||e}async function kv({test:n,fragment:e,entities:t,client:r,logger:o,yes:i}){vk(e.schemaVersion,De)&&(b.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)),pf(e.steps).forEach(g=>{t.modules[g]||(b.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 s=n.lastModified.getTime();e.createdAt.getTime()+60*60*1e3<s&&!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=Zr(n.fullFilePath,o,t),c=l.steps;if(!Array.isArray(c))throw new Error(`Test ${n.fullFilePath} is missing steps array`);let d,p;if(e.schemaVersion!==De){let{steps:g,newVersion:f}=await pa({metadata:{id:e.id,schemaVersion:e.schemaVersion},steps:e.steps,logger:b});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=wk(JSON.stringify(c,void 0,2),JSON.stringify(u,void 0,2),{n_surrounding:5});b.dimmed("=".repeat(30)),b.dimmed(h),b.dimmed("=".repeat(30)),b.dimmed(""),d&&b.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?")&&(b.dimmed("Cancelled."),process.exit(1)),Wn({relativeTestPath:n.relativePath,steps:u,schemaVersion:d??e.schemaVersion,project:t.project}),b.success("Patch applied successfully."),await r.patchTestFragment(e.id,{applied:!0,appliedAt:new Date})}import{randomUUID as uo}from"crypto";import{z as Zv}from"zod";var Wt=" ".repeat(6);import Xv from"chalk";import{Argument as co,Option as Me}from"@commander-js/extra-typings";import{validateHeaderValue as xk}from"http";import{cpus as _v}from"os";import{parse as Che}from"yaml";import{z as q}from"zod";var Ql=58888,yu=30*60*1e3,Zn=new Me("--api-key <key>","API key for authentication. If not supplied, attempts to read the MOMENTIC_API_KEY env var."),Qn=new Me("--server <server>","Momentic server to use. Leave unchanged unless using Momentic on-premise."),po=new Me("-y, --yes","Skip all confirmation prompts.").env("CI"),bu=new Me("-w, --wait","Wait for tests to finish running before exiting. Only applicable when running tests remotely").implies({remote:!0}),wu=new Me("--wait-timeout <waitTimeout>",`The maximum number of seconds to wait for tests to complete. Only applicable when the --wait option is specified. Defaults to ${yu/1e3} seconds.`),ec=new Me("--custom-headers <customHeaders...>","Specify custom headers in the form HEADER=VALUE to be sent with each request during the test. Multiple entries can be provided."),Fv=new Me("--reporter <reporter>","Output report files in a standardized format to a local directory. See the --reporter-dir flag for information on the output directory.").choices(Object.values(na)),Uv=new Me("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. Defaults to 'reports' if unset."),vu=new Me("--output-dir <outputDir>","[Alpha] Output directory to store run artifacts such as screenshots, results, and logs. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml. This directory will be cleared at the start of execution."),Bv=new Me("--upload-results","Upload test results to Momentic Cloud. By default, this option is disabled."),xu=new Me("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),Tu=new Me("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),Eu=new Me("--pixel-ratio <pixelRatio>","Device pixel ratio of your screen or monitor. Mac OS Retina displays and machines marketed as 'HiDPI' should set this to 2. Visit https://www.mydevice.io/ to find your device's pixel ratio."),zv=new Me("--port <port>",`Port to run the app on. Defaults to ${Ql}.`),Cu=new Me("--input-csv <inputCsv>","Path to a CSV file on disk where each row represents a set of inputs that will be made available to all tests that are ran. The first line of the CSV must be the input names."),tc=new Me("--env <env>","Name of the environment to use when running tests."),nc=new Me("--url-override <urlOverride>","Fully qualified url (e.g. https://www.google.com) to start all tests from. Overrides any default starting url set from the test or environment."),Hv=new Me("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),xn=new Me("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file (*.momentic.config.yaml)"),rc=new Me("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),jv=new Me("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(n=>parseInt(n,10)),$v=new Me("--fix","Attempt to fix any issues found. This option will write changes to your local file system."),Ru=new Me("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on the protected branches configured in the momentic.config.yaml.").env("CI"),Au=new Me("--disable-cache","Disable caching of test results. This will cause all tests to be re-run every time."),Gv=new co("<tests...>",`One or more test paths to queue on Momentic Cloud.
|
|
3830
3830
|
|
|
3831
3831
|
A test path is a lowercased version of your test name where spaces are replaced with dashes: 'npx momentic pull hello-world'.`),Wv=new co("<tests...>",`One or more test paths to import from Momentic Cloud.
|
|
3832
3832
|
|
|
@@ -3850,4 +3850,4 @@ ${n.map(u=>`${Wt}- ${u}`).join(`
|
|
|
3850
3850
|
`),b.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."),Sc.existsSync(oi)&&(b.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 Nv("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:rp};ii(t,oi),b.success(`Initialized Momentic project file at ${fc.resolve(oi)}`)});Rt.command("app").addOption(Zn).addOption(Qn).addOption(po).addOption(Eu).addOption(zv).addOption(xn).addOption(Ru).addOption(Au).action(async n=>{let e=await cn(n),{apiKey:t,port:r=Ql,yes:o,server:i,pixelRatio:a,disableCache:s,saveCache:l}=e,c=new ct({baseUrl:i,apiKey:t,logger:Q});await Pu({client:c,skipPrompts:o});let d=y_(import.meta.url),p=fc.dirname(d),u=fc.resolve(p,"..","static"),m=fc.resolve(p,"..","assets"),h=a??mu();hu(h),await Ev({momenticServerUrl:i,apiKey:t,serverPort:r,appPort:r,staticDir:u,assetsDir:m,devicePixelRatio:h,version:vn,noCache:s,alwaysSaveCache:l});let g=`http://localhost:${r}`;await S_(g)});var Bx=Rt.command("queue").description("Queue tests or suites to run on Momentic Cloud");Bx.command("suites").description("Run one or more suites on Momentic Cloud").addOption(Zn).addOption(Qn).addOption(bu).addOption(wu).addOption(po).addArgument(Vv).addOption(nc).addOption(tc).addOption(ec).action(async(n,e)=>{let{apiKey:t,server:r,wait:o,waitTimeout:i,env:a,urlOverride:s,customHeaders:l}=await cn(e),c=new ct({baseUrl:r,apiKey:t,logger:Q});(!n||!Array.isArray(n)||!n.length)&&(b.error("Must pass at least one suite to run."),process.exit(1));let{orgId:d}=await c.getAuthInfo();await fx({client:c,orgId:d,wait:o,suitePaths:n,waitTimeout:i,env:a,urlOverride:s,customHeaders:oc(l)})});Bx.command("tests").description("Run one or more tests on Momentic Cloud").addOption(Zn).addOption(Qn).addOption(po).addOption(ec).addOption(Cu).addOption(nc).addOption(tc).addOption(bu).addOption(wu).addArgument(Gv).action(async(n,e)=>{let t=await cn(e),{all:r,apiKey:o,customHeaders:i,env:a,server:s,inputCsv:l,urlOverride:c,wait:d,waitTimeout:p,yes:u}=t,m=oc(i);for(let S of n)(S.endsWith(".yaml")||Sc.existsSync(S))&&b.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:s,apiKey:o,logger:Q}),{orgId:g}=await h.getAuthInfo(),f;l&&(f=await gu(l)),await Sx({client:h,orgId:g,tests:n,all:r,customHeaders:m,env:a,urlOverride:c,wait:d,waitTimeout:p,testInputMatrix:f,yes:u}),process.exit(0)});var w_=Rt.command("list").description("List test paths");w_.addOption(xn).addOption(rc).addOption(xu).addOption(Tu).addOption(new Vt("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(Iu).action(async(n,e)=>{let t=await cn(e),r=$t({configFilePath:t.config,nameFilter:t.filter}),o=we(r,b),i=await pc({tests:n,momenticFiles:o,yes:!0,project:r,include:t.include,exclude:t.exclude,labels:t.labels,logger:ug});b.info(i.map(a=>a.relativeFilePath).join(`
|
|
3851
3851
|
`)),process.exit(0)});var v_=Rt.command("run").alias("test").description("Run tests on the local machine");v_.addOption(Zn).addOption(Qn).addOption(xn).addOption(rc).addOption(po).addOption(ec).addOption(Cu).addOption(Ru).addOption(Au).addOption(tc).addOption(nc).addOption(Eu).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(Fv).addOption(Uv).addOption(vu).addOption(Bv).addOption(Hv).addOption(jv).addOption(xu).addOption(Tu).addArgument(Iu).action(async(n,e)=>{b.debug("Run tests invoked");let t=await cn(e);b.debug(t,"Parsed CLI options");let r=oc(t.customHeaders),o=$t({configFilePath:t.config,nameFilter:t.filter});b.debug({projectName:o.config.name},"Identified project config");let{errors:i}=await Ou({project:o,fix:!1});i>0&&(b.error(`Found errors in ${i} steps`),b.warn("To fix these errors automatically, run the duplicate-ids check with the --fix flag and then commit the resulting changes"),process.exit(1));let a=new ct({baseUrl:t.server,apiKey:t.apiKey,logger:Q});b.debug("Checking API key and dependencies");let{orgId:s,userId:l}=await Pu({client:a,skipPrompts:t.yes});b.debug("API key check and browser installation complete");let c=new bl(a),d=new wl(a),p=t.outputDir??o.config.outputDir,u=t.reporterDir??o.config.reporterDir,m=Q.child({orgId:s,userId:l,cliVersion:vn,trigger:"CLI"}),h=await ci(Q,a,o);m.debug(h,"Got local git metadata");let g=new li(o.config),f=Fx.child({org_id:s,user_id:l,cli_version:vn,trigger:"CLI"}),S;t.inputCsv&&(S=await gu(t.inputCsv));let w=t.pixelRatio??mu();hu(w);try{(await Mx({...t,retriesOverride:t.retries,devicePixelRatio:w,tests:n,project:o,client:a,debugDataStorage:d,billingReporter:c,analytics:f,flagStore:g,outputDir:p,uploadResults:t.uploadResults,reporterDir:u,customHeaders:r,envName:t.env,orgId:s,testInputMatrix:S,logger:m,regenerateGoldenFiles:t.updateGoldenFiles,gitMetadata:h,alwaysSaveCache:t.saveCache,noCache:t.disableCache})).failed>0?process.exit(1):process.exit(0)}catch(x){b.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),b.error(x),process.exit(1)}});var x_=Rt.command("apply").description("Apply an operation to local resources");x_.command("patch").addOption(Zn).addOption(Qn).addOption(xn).addOption(rc).addOption(po).addOption(new Vt("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new Vt("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async n=>{let e=await cn(n),{apiKey:t,server:r,config:o,yes:i}=e,a=$t({configFilePath:o}),s=Q,l=new ct({baseUrl:r,apiKey:t,logger:s}),c=we(a,b),d=c.tests[n.to]??Object.values(c.tests).find(u=>Ne(u.name)===n.to.trim());d||(b.error(`No test matching '${n.to}' could be found in the current project.`),process.exit(1));let p=await l.fetchTestFragment(n.from);await kv({client:l,test:d,fragment:p,yes:i,entities:c,logger:Q}),process.exit(0)});var zx=Rt.command("results").description("Merge and upload test results.");zx.command("merge").description("Merge test results files.").addOption(vu).addArgument(qv).action(async(n,e)=>{let t=await cn(e),{outputDir:r}=t;r||(b.error("Output directory is required."),process.exit(1)),Sc.existsSync(n)||(b.warn("Results path does not exist, skipping merge."),process.exit(0)),Sc.existsSync(r)&&b.warn(`Output directory ${r} already exists, removing before merging...`),Dx(Q,r,n)});zx.command("upload").description("Upload test results to Momentic cloud.").addOption(Zn).addOption(Qn).addArgument(Kv).action(async(n,e)=>{let t=await cn(e),{apiKey:r,server:o}=t,i=Q,a=new ct({baseUrl:o,apiKey:r,logger:i});await gc({consoleLogger:b,resultsPath:n,client:a}),process.exit(0)});async function T_(){Wu("Main program started"),await Pv(Q),Wu("CLI version check complete");try{await Rt.parseAsync(process.argv)}catch(n){let e={};try{e.playwrightVersion=g_("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(),ki(n,e),b.error(n),process.exit(1)}}f_.setMaxListeners(50);process.on("warning",n=>{Q.warn({err:n},`Node warning received on CLI: ${n.message}`)});Wu("CLI parsing setup complete");T_();
|
|
3852
3852
|
//# sourceMappingURL=cli.js.map
|
|
3853
|
-
//# debugId=
|
|
3853
|
+
//# debugId=b0845e06-7095-5593-aec8-788dac9a2286
|