momentic 2.33.2 → 2.33.3
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 +14 -14
- package/npm-shrinkwrap.json +23 -23
- package/package.json +1 -1
- package/static/assets/{index-lW7FfTNT.js → index-MMbFuNUs.js} +13 -13
- package/static/index.html +1 -1
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 jD=Object.defineProperty;var ht=(t,e)=>()=>(t&&(e=t(t=0)),e);var VD=(t,e)=>{for(var r in e)jD(t,r,{get:e[r],enumerable:!0})};var aM,sM=ht(()=>{"use strict";aM=typeof globalThis=="object"?globalThis:global});var lM=ht(()=>{"use strict";sM()});var cM=ht(()=>{"use strict";lM()});var go,py=ht(()=>{"use strict";go="1.9.0"});function IV(t){var e=new Set([t]),r=new Set,n=t.match(uM);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===t};function i(s){return r.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(r.has(c))return!1;var l=c.match(uM);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var uM,dM,pM=ht(()=>{"use strict";py();uM=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;dM=IV(go)});function _s(t,e,r,n){var o;n===void 0&&(n=!1);var i=_c[xc]=(o=_c[xc])!==null&&o!==void 0?o:{version:go};if(!n&&i[t]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+t);return r.error(a.stack||a.message),!1}if(i.version!==go){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+t+" does not match previously registered API v"+go);return r.error(a.stack||a.message),!1}return i[t]=e,r.debug("@opentelemetry/api: Registered a global for "+t+" v"+go+"."),!0}function fo(t){var e,r,n=(e=_c[xc])===null||e===void 0?void 0:e.version;if(!(!n||!dM(n)))return(r=_c[xc])===null||r===void 0?void 0:r[t]}function Ms(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+go+".");var r=_c[xc];r&&delete r[t]}var PV,xc,_c,Mc=ht(()=>{"use strict";cM();py();pM();PV=go.split(".")[0],xc=Symbol.for("opentelemetry.js.api."+PV),_c=aM});function Ic(t,e,r){var n=fo("diag");if(n)return r.unshift(e),n[t].apply(n,LV([],OV(r),!1))}var OV,LV,mM,hM=ht(()=>{"use strict";Mc();OV=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},LV=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},mM=function(){function t(e){this._namespace=e.namespace||"DiagComponentLogger"}return t.prototype.debug=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("verbose",this._namespace,e)},t}()});var lt,jp=ht(()=>{"use strict";(function(t){t[t.NONE=0]="NONE",t[t.ERROR=30]="ERROR",t[t.WARN=50]="WARN",t[t.INFO=60]="INFO",t[t.DEBUG=70]="DEBUG",t[t.VERBOSE=80]="VERBOSE",t[t.ALL=9999]="ALL"})(lt||(lt={}))});function gM(t,e){t<lt.NONE?t=lt.NONE:t>lt.ALL&&(t=lt.ALL),e=e||{};function r(n,o){var i=e[n];return typeof i=="function"&&t>=o?i.bind(e):function(){}}return{error:r("error",lt.ERROR),warn:r("warn",lt.WARN),info:r("info",lt.INFO),debug:r("debug",lt.DEBUG),verbose:r("verbose",lt.VERBOSE)}}var fM=ht(()=>{"use strict";jp()});var NV,DV,kV,Hn,Pc=ht(()=>{"use strict";hM();fM();jp();Mc();NV=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},DV=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},kV="diag",Hn=function(){function t(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=fo("diag");if(s)return s[o].apply(s,DV([],NV(i),!1))}}var r=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:lt.INFO}),o===r){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return r.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=fo("diag"),d=gM((s=i.logLevel)!==null&&s!==void 0?s:lt.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+p),d.warn("Current logger will overwrite one already registered from "+p)}return _s("diag",d,r,!0)};r.setLogger=n,r.disable=function(){Ms(kV,r)},r.createComponentLogger=function(o){return new mM(o)},r.verbose=e("verbose"),r.debug=e("debug"),r.info=e("info"),r.warn=e("warn"),r.error=e("error")}return t.instance=function(){return this._instance||(this._instance=new t),this._instance},t}()});var SM,yM=ht(()=>{"use strict";SM=Symbol("BaggageEntryMetadata")});function my(t){return typeof t!="string"&&(FV.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:SM,toString:function(){return t}}}var FV,EM=ht(()=>{"use strict";Pc();yM();FV=Hn.instance()});function hy(t){return Symbol.for(t)}var UV,gy,fy=ht(()=>{"use strict";UV=function(){function t(e){var r=this;r._currentContext=e?new Map(e):new Map,r.getValue=function(n){return r._currentContext.get(n)},r.setValue=function(n,o){var i=new t(r._currentContext);return i._currentContext.set(n,o),i},r.deleteValue=function(n){var o=new t(r._currentContext);return o._currentContext.delete(n),o}}return t}(),gy=new UV});function Ey(){return yy}var ea,BV,Vp,zV,HV,GV,jV,Sy,VV,$V,WV,yy,qV,KV,YV,XV,JV,QV,ZV,by=ht(()=>{"use strict";ea=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),BV=function(){function t(){}return t.prototype.createGauge=function(e,r){return KV},t.prototype.createHistogram=function(e,r){return YV},t.prototype.createCounter=function(e,r){return qV},t.prototype.createUpDownCounter=function(e,r){return XV},t.prototype.createObservableGauge=function(e,r){return QV},t.prototype.createObservableCounter=function(e,r){return JV},t.prototype.createObservableUpDownCounter=function(e,r){return ZV},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),Vp=function(){function t(){}return t}(),zV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Vp),HV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Vp),GV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Vp),jV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Vp),Sy=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),VV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Sy),$V=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Sy),WV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Sy),yy=new BV,qV=new zV,KV=new GV,YV=new jV,XV=new HV,JV=new VV,QV=new $V,ZV=new WV});var Mr,bM=ht(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(Mr||(Mr={}))});var e$,t$,TM,vM=ht(()=>{"use strict";fy();e$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},t$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},TM=function(){function t(){}return t.prototype.active=function(){return gy},t.prototype.with=function(e,r,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return r.call.apply(r,t$([n],e$(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var r$,n$,Ty,o$,AM,RM=ht(()=>{"use strict";vM();Mc();Pc();r$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},n$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},Ty="context",o$=new TM,AM=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return _s(Ty,e,Hn.instance())},t.prototype.active=function(){return this._getContextManager().active()},t.prototype.with=function(e,r,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,n$([e,r,n],r$(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return fo(Ty)||o$},t.prototype.disable=function(){this._getContextManager().disable(),Ms(Ty,Hn.instance())},t}()});var Is,CM=ht(()=>{"use strict";RM();Is=AM.getInstance()});var W,wM=ht(()=>{"use strict";Pc();W=Hn.instance()});var i$,xM,_M=ht(()=>{"use strict";by();i$=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return yy},t}(),xM=new i$});var vy,MM,IM=ht(()=>{"use strict";_M();Mc();Pc();vy="metrics",MM=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return _s(vy,e,Hn.instance())},t.prototype.getMeterProvider=function(){return fo(vy)||xM},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){Ms(vy,Hn.instance())},t}()});var $p,PM=ht(()=>{"use strict";IM();$p=MM.getInstance()});var et=ht(()=>{"use strict";EM();fy();jp();by();bM();CM();wM();PM()});var ol=(t,e)=>{},Ph=!1;try{let t=await import("@sentry/node");ol=t.captureException,t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),Ph=!0}catch{}import{Command as f4,Option as gr}from"@commander-js/extra-typings";import{execSync as S4}from"child_process";import{existsSync as ZB,statSync as ez}from"fs";import{z as Oh}from"zod";var M4=Oh.object({input:Oh.string(),agentConfigVersion:Oh.string().optional()});import{z as It}from"zod";var O4=It.object({srcs:It.array(It.string()),urls:It.array(It.string()),desiredSrc:It.string().optional(),desiredUrl:It.string().optional()}),vb=It.object({srcRegex:It.string().optional(),urlRegex:It.string().optional()}),Ab=It.object({x:It.number(),y:It.number(),correlation:It.number()}),L4=It.object({searchImageBase64String:It.string(),pageImageBase64String:It.string(),id:It.string().uuid(),timeoutMs:It.number().max(1e4).min(0).optional()});import{z as I}from"zod";import*as F from"zod";import{extendZodWithOpenApi as $D}from"zod-openapi";import il from"zod";var al=il.object({updatedAt:il.coerce.date().optional()}),Ei=il.object({contentType:il.enum(["image/jpeg","image/png"]),id:il.string()});$D(F);var Ro=(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))(Ro||{}),WD=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),sl=F.object({result:F.number(),traceId:F.string()}).array(),Xn=F.object({type:F.literal("GCS_TRACES"),traces:sl}),fr=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(fr||{}),Rb=F.object({attributes:F.record(F.string(),F.string()).optional(),text:F.string().optional(),position:F.object({x1:F.number(),y1:F.number(),x2:F.number(),y2:F.number(),tolerance:F.nativeEnum(fr)}).optional(),shape:F.object({width:F.number(),height:F.number(),tolerance:F.nativeEnum(fr)}).optional(),boundingBox:F.object({x:F.number(),y:F.number(),width:F.number(),height:F.number()}).optional()}),qD=F.object({selectors:F.string().array(),requirements:Rb.optional()}),Co=F.object({id:F.number().int(),dataMomenticId:F.number().int().optional(),selector:F.string().optional(),hybridSelector:F.object({textContent:F.string().nullish(),attributes:F.record(F.string(),F.string().optional()),tagName:F.string(),expandShadowRoot:F.boolean().optional(),classNames:F.string().array(),nthChild:F.number()}).array().optional(),generatedSelectors:F.string().array().optional(),requirements:Rb.optional(),additionalElements:qD.array().optional(),role:F.string().optional(),name:F.string().optional(),numChildren:F.number().optional(),content:F.string().optional(),pathFromRoot: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().or(Ei.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:WD.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(Ro).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional(),cacheResolutionUpdateSource:F.string().optional(),cacheResolutionUpdateTime:F.string().optional(),cacheResolutionUpdateLoggerTags:F.record(F.string(),F.string()).optional(),memory:Xn.optional()}).openapi({ref:"ElementTargetCache"});function vu(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var KD=F.object({type:F.literal("description"),elementDescriptor:F.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),YD=F.object({x:F.number(),y:F.number()}),XD=F.object({type:F.literal("coordinates"),pixels:YD}).openapi({ref:"CoordinatesTarget"});function wo(t){return t.type==="description"}function Cn(t){return t.type==="coordinates"}var $t=F.discriminatedUnion("type",[KD,XD]).openapi({ref:"ElementTarget"});function Lh(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function Wt(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function Au(t){return Xn.safeParse(t).success}import{v4 as Ue}from"uuid";import*as R from"zod";import{extendZodWithOpenApi as sk}from"zod-openapi";import{z as be}from"zod";import{extendZodWithOpenApi as JD}from"zod-openapi";import{z as ll}from"zod";var cl=ll.object({result:ll.boolean(),traceId:ll.string()}).array(),bi=ll.object({type:ll.literal("GCS_TRACES"),traces:cl}),Ru=al.extend({memory:bi.optional()});JD(be);var Cb=be.object({thoughts:be.string(),result:be.boolean(),relevantElements:be.array(be.number()).optional(),updatedMemory:cl.optional()}),an=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(an||{});var QD=be.object({type:be.literal("ELEMENT_NAME"),negated:be.boolean().optional(),operation:be.nativeEnum(an),value:be.string()}).openapi({ref:"ElementNameAssertion"}),ZD=be.object({type:be.literal("ELEMENT_STYLE"),negated:be.boolean().optional(),operation:be.nativeEnum(an),property:be.string(),value:be.string()}).openapi({ref:"ElementStyleAssertion"}),ek=be.object({type:be.literal("ELEMENT_CONTENT"),negated:be.boolean().optional(),operation:be.nativeEnum(an),value:be.string()}).openapi({ref:"ElementContentAssertion"}),tk=be.object({type:be.literal("ELEMENT_ATTRIBUTE"),negated:be.boolean().optional(),operation:be.nativeEnum(an),attr:be.string(),value:be.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Jn=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Jn||{});var rk=be.object({type:be.literal("ELEMENT_EXISTENCE"),negated:be.boolean().optional(),condition:be.nativeEnum(Jn).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Cu=be.discriminatedUnion("type",[ek,tk,rk,QD,ZD]).openapi({ref:"ManualElementAssertion"});var nk=be.object({type:be.literal("CONTENT"),negated:be.boolean().optional(),value:be.string()}).openapi({ref:"PageContentAssertion"}),wb=be.discriminatedUnion("type",[nk]).openapi({ref:"ManualPageAssertion"});import or from"zod";var Nh=or.discriminatedUnion("type",[or.object({type:or.literal("SUBSTRING"),url:or.string()}),or.object({type:or.literal("GLOB"),glob:or.string()}),or.object({type:or.literal("REGEX"),regex:or.string()}),or.object({type:or.literal("DOMAIN"),domain:or.string()})]),ul=or.object({urlMatcher:Nh,method:or.string().optional()});import{z as ge}from"zod";var ok=ge.object({type:ge.literal("json"),content:ge.string().describe("The JSON content to send in the request body")}),ik=ge.object({type:ge.literal("form-urlencoded"),content:ge.record(ge.string(),ge.string()).describe("The form fields to send in the request body")}),ak=ge.discriminatedUnion("type",[ok,ik]),Ti=ge.object({url:ge.string(),method:ge.union([ge.literal("GET"),ge.literal("POST"),ge.literal("PUT"),ge.literal("DELETE"),ge.literal("PATCH")]),headers:ge.record(ge.string(),ge.string()).optional(),params:ge.record(ge.string(),ge.string()).optional(),body:ak.optional(),timeout:ge.number().int().optional().describe("Max seconds to wait for the request to complete")}),xb=ge.object({url:ge.string(),headers:ge.record(ge.string(),ge.string()).optional(),query:ge.string(),variables:ge.string().optional(),timeout:ge.number().int().optional().describe("Max seconds to wait for the request to complete")}),wu=ge.object({code:ge.string(),fragment:ge.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:ge.union([ge.literal("NODE"),ge.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:ge.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ke=(X=>(X.AI_EXTRACT="AI_EXTRACT",X.AI_ASSERTION="AI_ASSERTION",X.AUTH_LOAD="AUTH_LOAD",X.AUTH_SAVE="AUTH_SAVE",X.BLUR="BLUR",X.CAPTCHA="CAPTCHA",X.CLICK="CLICK",X.COOKIE="COOKIE",X.COPY="COPY",X.DIALOG="DIALOG",X.DRAG="DRAG",X.ELEMENT_CHECK="ELEMENT_CHECK",X.FILE_UPLOAD="FILE_UPLOAD",X.FOCUS="FOCUS",X.GO_BACK="GO_BACK",X.GO_FORWARD="GO_FORWARD",X.HOVER="HOVER",X.JAVASCRIPT="JAVASCRIPT",X.LOCAL_STORAGE="LOCAL_STORAGE",X.MOUSE_DRAG="MOUSE_DRAG",X.NAVIGATE="NAVIGATE",X.NEW_TAB="NEW_TAB",X.PAGE_CHECK="PAGE_CHECK",X.PASTE="PASTE",X.PRESS="PRESS",X.KEY_DOWN="KEY_DOWN",X.KEY_UP="KEY_UP",X.REFRESH="REFRESH",X.REQUEST="REQUEST",X.GRAPHQL_REQUEST="GRAPHQL_REQUEST",X.SCROLL_DOWN="SCROLL_DOWN",X.SCROLL_UP="SCROLL_UP",X.SCROLL_LEFT="SCROLL_LEFT",X.SCROLL_RIGHT="SCROLL_RIGHT",X.SELECT_OPTION="SELECT_OPTION",X.SWITCH_TAB="TAB",X.TYPE="TYPE",X.VISUAL_DIFF="VISUAL_DIFF",X.WAIT="WAIT",X.WAIT_FOR_URL="WAIT_FOR_URL",X.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",X.AWAIT_LISTENER="AWAIT_LISTENER",X.RECORD_REQUESTS="RECORD_REQUESTS",X.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",X.SET_HEADER="SET_HEADER",X.MOCK_ROUTE="MOCK_ROUTE",X.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",X.OFFLINE_MODE="OFFLINE_MODE",X.SUCCESS="SUCCESS",X))(Ke||{});sk(R);var te=R.object({thoughts:R.string().optional(),id:R.string().uuid().describe("unique identifier to this step, used for step cache")}),Nr=R.object({useSelector:R.boolean().optional(),force:R.boolean().optional(),disableCache:R.boolean().optional().describe("disable element caching for this step"),iframeUrl:R.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Rr=al.extend({target:Co}).optional().openapi({ref:"SingleTargetCache"});function _b(t){return Rr.safeParse(t).success}var _u=R.object({loadTimeout:R.number().int().max(60).optional().describe("Max seconds for the page to load")}),Mb=te.merge(_u).merge(R.object({type:R.literal("NAVIGATE"),url:R.string()})).openapi({ref:"NavigateCommand"}),Mu=Nr.merge(R.object({cache:Rr})),vi=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_UP"),deltaY:R.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Ai=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_DOWN"),deltaY:R.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ca=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_LEFT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),wa=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_RIGHT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollRightCommand"}),hX=R.discriminatedUnion("type",[vi,Ai,Ca,wa]).openapi({ref:"AllScrollCommands"}),lk=te.merge(R.object({type:R.literal("DIALOG"),action:R.union([R.literal("ACCEPT"),R.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Ib=te.merge(R.object({type:R.literal("WAIT"),delay:R.number()})).openapi({ref:"WaitCommand"}),ck=R.object({caseInsensitive:R.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:R.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:R.number().int().optional().describe("Max seconds to wait for the URL to match")}),Pb=te.extend({type:R.literal("WAIT_FOR_URL"),matcher:Nh}).merge(ck).openapi({ref:"WaitUrlCommand"}),Ob=te.merge(_u).merge(R.object({type:R.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Lb=te.merge(R.object({type:R.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Nb=te.merge(R.object({type:R.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),uk=te.extend({type:R.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),dk=te.extend({type:R.literal("AUTH_LOAD"),storageState:R.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Dh=te.merge(Nr).extend({type:R.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Db=te.extend({type:R.literal("COPY"),value:R.string()}).openapi({ref:"CopyCommand"}),kb=te.extend({type:R.literal("PASTE")}).openapi({ref:"PasteCommand"}),Fb=te.merge(wu).extend({type:R.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),xa=te.merge(Nr).extend({type:R.literal("CLICK"),target:$t,doubleClick:R.boolean().optional(),rightClick:R.boolean().optional(),waitForDownload:R.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:R.number().optional(),downloadTimeoutMs:R.number().optional(),cache:Rr,relativePosition:R.object({x:R.number(),y:R.number()}).optional()}).openapi({ref:"ClickCommand"}),kh=al.extend({fromTarget:Co.optional(),toTarget:Co.optional()}),_a=te.merge(Nr).merge(R.object({type:R.literal("DRAG"),fromTarget:$t,toTarget:$t,steps:R.number().optional(),hoverSeconds:R.number().optional().describe("Seconds to hover the object before dropping"),cache:kh.optional()})).openapi({ref:"DragCommand"}),Ma=te.merge(Nr).merge(R.object({type:R.literal("MOUSE_DRAG"),target:$t.optional(),deltaX:R.string().describe("pixels to move horizontally, can be template"),deltaY:R.string().describe("pixels to move vertically, can be template"),steps:R.number().optional(),cache:Rr})).openapi({ref:"MouseDragCommand"}),Ia=te.merge(Nr).merge(R.object({type:R.literal("HOVER"),target:$t,cache:Rr})).openapi({ref:"HoverCommand"}),dl=te.merge(Nr).merge(R.object({type:R.literal("FOCUS"),target:$t,cache:Rr})).openapi({ref:"FocusCommand"}),pl=te.merge(Nr).extend({type:R.literal("BLUR"),target:$t.optional(),cache:Rr}).openapi({ref:"BlurCommand"}),pk=R.object({type:R.literal("URL"),url:R.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),mk=R.object({type:R.literal("USER_FILE"),name:R.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),hk=te.extend({type:R.literal("FILE_UPLOAD"),fileSource:R.discriminatedUnion("type",[pk,mk]),filename:R.string().optional()}).openapi({ref:"FileUploadCommand"}),Fh=R.discriminatedUnion("type",[R.object({type:R.literal("VALUE"),value:R.string()}),R.object({type:R.literal("LABEL"),label:R.string()}),R.object({type:R.literal("INDEX"),index:R.coerce.string()})]),Pa=te.merge(Nr).extend({type:R.literal("SELECT_OPTION"),target:$t,cache:Rr,choice:Fh.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Uh=R.union([R.literal("MULTIMODAL"),R.literal("VISION_ONLY")]),ml=te.merge(R.object({type:R.literal("AI_ASSERTION"),assertion:R.string(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional(),contextChoice:Uh.optional(),timeout:R.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:Ru.optional(),source:R.string().optional()})).openapi({ref:"AIAssertionCommand"}),wn=5,Ri=600,Oa=te.merge(Nr).extend({type:R.literal("ELEMENT_CHECK"),target:$t,assertion:Cu,cache:Rr.or(Ru).optional(),timeout:R.number().int().min(0).max(Ri).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Ub=te.extend({type:R.literal("PAGE_CHECK"),assertion:wb,iframeUrl:R.string().optional().describe("url or url regex for the iframe"),timeout:R.number().int().min(0).max(Ri).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Bb=te.merge(R.object({type:R.literal("AI_EXTRACT"),goal:R.string(),schema:R.string().optional(),envKey:R.string().optional(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional()})).openapi({ref:"AIExtractCommand"}),gk=R.object({clearContent:R.boolean().optional(),forceClearContent:R.boolean().optional(),delay:R.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:R.boolean().optional(),pressEnter:R.boolean().optional(),relativePosition:R.object({x:R.number(),y:R.number()}).optional()}),zb=25,La=te.merge(Nr).merge(gk).extend({type:R.literal("TYPE"),target:$t.optional(),value:R.string(),cache:Rr}).openapi({ref:"TypeCommand"}),Hb=te.merge(R.object({type:R.literal("PRESS"),value:R.string(),repeat:R.number().optional(),convertMeta:R.boolean().optional(),delayMs:R.number().optional()})).openapi({ref:"PressCommand"}),Gb=te.merge(R.object({type:R.literal("KEY_DOWN"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyDownCommand"}),jb=te.merge(R.object({type:R.literal("KEY_UP"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyUpCommand"}),fk=R.object({type:R.literal("SUBSTRING"),substring:R.string()}),Sk=R.object({type:R.literal("REGEX"),pattern:R.string()}),yk=R.object({type:R.literal("INDEX"),index:R.coerce.string()}),Ek=R.discriminatedUnion("type",[fk,Sk,yk]),bk=te.merge(_u).merge(R.object({type:R.literal("TAB"),action:Ek})).openapi({ref:"TabCommand"}),Vb=te.merge(_u).merge(R.object({type:R.literal("NEW_TAB"),url:R.string()})).openapi({ref:"NewTabCommand"}),Tk=te.merge(R.object({type:R.literal("COOKIE"),value:R.string()})).openapi({ref:"CookieCommand"}),$b=te.merge(R.object({type:R.literal("LOCAL_STORAGE"),key:R.string(),value:R.string()})).openapi({ref:"LocalStorageCommand"}),Wb=te.extend({type:R.literal("REQUEST")}).merge(Ti).openapi({ref:"RequestCommand"}),hl=R.object({status:R.number().optional(),headers:R.record(R.string(),R.string()),json:R.unknown().optional(),text:R.string().optional(),cookies:R.record(R.string(),R.unknown()).array().optional(),request:R.object({url:R.string(),method:R.string(),headers:R.record(R.string(),R.string()),json:R.unknown().optional()})}),qb=te.extend({type:R.literal("GRAPHQL_REQUEST")}).merge(xb).openapi({ref:"GraphQLRequestCommand"}),Kb=te.merge(R.object({type:R.literal("SUCCESS"),condition:ml.optional()})).openapi({ref:"SuccessCommand"}),Yb=te.merge(R.object({type:R.literal("FAILURE")})).openapi({ref:"FailureCommand"}),vk=R.object({data:R.union([R.string().describe("location at which to find a jpg - public URL or local"),Ei]),width:R.number(),height:R.number()});function Xb(t){return t?Ei.safeParse(t).success:!1}var gl=te.merge(Nr).merge(R.object({type:R.literal("VISUAL_DIFF"),threshold:R.number().optional().describe("default 0.1"),target:$t.optional(),screenshot:vk.optional(),cache:Rr})).openapi({ref:"VisualDiffCommand"}),Ak=te.merge(R.object({type:R.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:ul,key:R.string()})).openapi({ref:"RegisterRequestListenerCommand"}),Rk=te.merge(R.object({type:R.literal("AWAIT_LISTENER"),key:R.string(),timeout:R.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),Ck=te.merge(R.object({type:R.literal("RECORD_REQUESTS"),requestMatcher:ul,key:R.string()})).openapi({ref:"RecordRequestsCommand"}),wk=te.merge(R.object({type:R.literal("GET_RECORDED_REQUESTS"),key:R.string()})).openapi({ref:"GetRecordedRequestsCommand"}),xk=te.merge(R.object({type:R.literal("SET_HEADER"),name:R.string(),value:R.string(),requestMatcher:ul.optional()})).openapi({ref:"SetHeaderCommand"}),_k=te.merge(R.object({type:R.literal("MOCK_ROUTE"),requestMatcher:ul,responseGenerator:R.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:R.boolean().optional().describe("Whether to fetch the real response and pass it to the response generator. If enabled, the original response will be available as `response` in the code."),key:R.string().optional().describe("Key to reference this mock. This only needs to be set if you plan to remove the mock later in the test.")}).openapi({ref:"MockRouteCommandOptions"})),Mk=te.merge(R.object({type:R.literal("REMOVE_ROUTE_MOCK"),key:R.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),Ik=te.merge(R.object({type:R.literal("OFFLINE_MODE"),enable:R.boolean()})).openapi({ref:"OfflineModeCommand"}),Pk=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],gX=[...Pk,"DRAG"],Ok=R.discriminatedUnion("type",[xa,La,Hb,Gb,jb,Pa,Mb,Ai,vi,ml,Lb,Ia,Ib]),Lk=R.discriminatedUnion("type",[...Ok.options,_a]),Nk=R.discriminatedUnion("type",[...Lk.options]),Jb=R.discriminatedUnion("type",[...Nk.options,Kb]),Bh=R.discriminatedUnion("type",[Kb,xa,La,Hb,Gb,jb,Pa,Mb,Ai,vi,ml,Lb,Ia,Ib,Fb,Oa,Ub,Vb,Pb,Bb,Db,Nb,$b,_a,Ma,kb,Ob,Wb,qb]),Dk=R.discriminatedUnion("type",[Bb,dk,uk,Dh,Tk,Db,lk,Oa,hk,Nb,Fb,$b,Ma,Vb,Ub,kb,Ob,Wb,qb,Ca,wa,bk,gl,dl,pl,Pb,Ak,Rk,Ck,wk,xk,_k,Mk,Ik]),Na=R.discriminatedUnion("type",[...Jb.options,...Dk.options]).openapi({ref:"Command"}),Iu=R.discriminatedUnion("type",[...Jb.options,Yb]),fX=R.discriminatedUnion("type",[...Bh.options,Yb]);function Qn(t){let e;switch(t){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:Ue(),type:t};break;case"AUTH_LOAD":{e={id:Ue(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:Ue(),type:t,goal:""};break;case"DIALOG":e={id:Ue(),type:t,action:"DISMISS"};break;case"DRAG":e={id:Ue(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Ue(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Ue(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Ue(),type:t,delay:1};break;case"BLUR":e={id:Ue(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Ue(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Ue(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Ue(),type:t,value:""};break;case"SELECT_OPTION":e={id:Ue(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Ue(),type:t,url:""};case"TAB":e={id:Ue(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Ue(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Ue(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Ue(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:Ue(),type:t,code:""};break;case"AI_ASSERTION":e={id:Ue(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:Ue(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Ue(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Ue(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Ue(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Ue(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:Ue(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Ue(),type:t,key:""};break}case"SET_HEADER":{e={id:Ue(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Ue(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Ue(),type:t};break}case"OFFLINE_MODE":{e={id:Ue(),type:t,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function Qb(t){switch(t.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":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var EX={AI_ASSERTION:"AI Check",JAVASCRIPT:"JavaScript"};import{z as kk}from"zod";var RX=kk.discriminatedUnion("type",[pl,Dh,xa,_a,dl,Ia,Ma,vi,Ai,Ca,wa,Pa,La,gl,Oa]);function Zb(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as Fk}from"zod";import{z as _o}from"zod";function fl(t){return _o.object({key:_o.string(),testId:_o.string().optional(),moduleId:_o.string().optional(),organizationId:_o.string(),value:t})}function Sl(t){return fl(t).extend({uniqueKey:_o.string()})}function Pu(t){return _o.record(_o.string(),Sl(t))}var ir={type:!0,cache:!0},Zn=Fk.discriminatedUnion("type",[ml.pick(ir),pl.pick(ir),xa.pick(ir),_a.pick(ir),Oa.pick(ir),dl.pick(ir),Ia.pick(ir),Ma.pick(ir),vi.pick(ir),Ai.pick(ir),Ca.pick(ir),wa.pick(ir),Pa.pick(ir),La.pick(ir),gl.pick(ir)]),Ou=Object.values(Ke).filter(t=>Zn.options.some(e=>e.shape.type.safeParse(t).success));Na.options.forEach(t=>{if("target"in t.shape&&!Ou.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function Lu(t){return Ou.includes(t.type)}var eT=fl(Zn),tT=Sl(Zn),OX=Pu(Zn);import{v4 as Qe}from"uuid";import{z as w}from"zod";var nT=Symbol("Let zodToJsonSchema decide on which parser to use");var rT={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},oT=t=>typeof t=="string"?{...rT,name:t}:{...rT,...t};var iT=t=>{let e=oT(t),r=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function zh(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function xe(t,e,r,n,o){t[e]=r,zh(t,e,n,o)}var Nu=(t,e)=>{let r=0;for(;r<t.length&&r<e.length&&t[r]===e[r];r++);return[(t.length-r).toString(),...e.slice(r)].join("/")};import{ZodFirstPartyTypeKind as Re}from"zod";function ct(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?Nu(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as Uk}from"zod";function aT(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==Uk.ZodAny&&(r.items=re(t.type._def,{...e,currentPath:[...e.currentPath,"items"]})),t.minLength&&xe(r,"minItems",t.minLength.value,t.minLength.message,e),t.maxLength&&xe(r,"maxItems",t.maxLength.value,t.maxLength.message,e),t.exactLength&&(xe(r,"minItems",t.exactLength.value,t.exactLength.message,e),xe(r,"maxItems",t.exactLength.value,t.exactLength.message,e)),r}function sT(t,e){let r={type:"integer",format:"int64"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?xe(r,"minimum",n.value,n.message,e):xe(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),xe(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?xe(r,"maximum",n.value,n.message,e):xe(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),xe(r,"maximum",n.value,n.message,e));break;case"multipleOf":xe(r,"multipleOf",n.value,n.message,e);break}return r}function lT(){return{type:"boolean"}}function Du(t,e){return re(t.type._def,e)}var cT=(t,e)=>re(t.innerType._def,e);function Hh(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Hh(t,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return Bk(t,e)}}var Bk=(t,e)=>{let r={type:"integer",format:"unix-time"};if(e.target==="openApi3")return r;for(let n of t.checks)switch(n.kind){case"min":xe(r,"minimum",n.value,n.message,e);break;case"max":xe(r,"maximum",n.value,n.message,e);break}return r};function uT(t,e){return{...re(t.innerType._def,e),default:t.defaultValue()}}function dT(t,e){return e.effectStrategy==="input"?re(t.schema._def,e):ct(e)}function pT(t){return{type:"string",enum:Array.from(t.values)}}var zk=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function mT(t,e){let r=[re(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),re(t.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach(i=>{if(zk(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function hT(t,e){let r=typeof t.value;return r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string"?{type:Array.isArray(t.value)?"array":"object"}:e.target==="openApi3"?{type:r==="bigint"?"integer":r,enum:[t.value]}:{type:r==="bigint"?"integer":r,const:t.value}}import{ZodFirstPartyTypeKind as yl}from"zod";var Gh,sn={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Gh===void 0&&(Gh=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Gh),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function ku(t,e){let r={type:"string"};if(t.checks)for(let n of t.checks)switch(n.kind){case"min":xe(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e);break;case"max":xe(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":ln(r,"email",n.message,e);break;case"format:idn-email":ln(r,"idn-email",n.message,e);break;case"pattern:zod":ar(r,sn.email,n.message,e);break}break;case"url":ln(r,"uri",n.message,e);break;case"uuid":ln(r,"uuid",n.message,e);break;case"regex":ar(r,n.regex,n.message,e);break;case"cuid":ar(r,sn.cuid,n.message,e);break;case"cuid2":ar(r,sn.cuid2,n.message,e);break;case"startsWith":ar(r,RegExp(`^${jh(n.value,e)}`),n.message,e);break;case"endsWith":ar(r,RegExp(`${jh(n.value,e)}$`),n.message,e);break;case"datetime":ln(r,"date-time",n.message,e);break;case"date":ln(r,"date",n.message,e);break;case"time":ln(r,"time",n.message,e);break;case"duration":ln(r,"duration",n.message,e);break;case"length":xe(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e),xe(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"includes":{ar(r,RegExp(jh(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&ln(r,"ipv4",n.message,e),n.version!=="v4"&&ln(r,"ipv6",n.message,e);break}case"base64url":ar(r,sn.base64url,n.message,e);break;case"jwt":ar(r,sn.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&ar(r,sn.ipv4Cidr,n.message,e),n.version!=="v4"&&ar(r,sn.ipv6Cidr,n.message,e);break}case"emoji":ar(r,sn.emoji(),n.message,e);break;case"ulid":{ar(r,sn.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{ln(r,"binary",n.message,e);break}case"contentEncoding:base64":{xe(r,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{ar(r,sn.base64,n.message,e);break}}break}case"nanoid":ar(r,sn.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return r}function jh(t,e){return e.patternStrategy==="escape"?Gk(t):t}var Hk=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function Gk(t){let e="";for(let r=0;r<t.length;r++)Hk.has(t[r])||(e+="\\"),e+=t[r];return e}function ln(t,e,r,n){t.format||t.anyOf?.some(o=>o.format)?(t.anyOf||(t.anyOf=[]),t.format&&(t.anyOf.push({format:t.format,...t.errorMessage&&n.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage&&(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.anyOf.push({format:e,...r&&n.errorMessages&&{errorMessage:{format:r}}})):xe(t,"format",e,r,n)}function ar(t,e,r,n){t.pattern||t.allOf?.some(o=>o.pattern)?(t.allOf||(t.allOf=[]),t.pattern&&(t.allOf.push({pattern:t.pattern,...t.errorMessage&&n.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage&&(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.allOf.push({pattern:gT(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):xe(t,"pattern",gT(e,n),r,n)}function gT(t,e){if(!e.applyRegexFlags||!t.flags)return t.source;let r={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},n=r.i?t.source.toLowerCase():t.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(r.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(r.m){if(n[c]==="^"){o+=`(^|(?<=[\r
|
|
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]="619cf562-3a23-55a0-b1c8-7a57b6a502ff")}catch(e){}}();
|
|
4
|
+
var jD=Object.defineProperty;var ht=(t,e)=>()=>(t&&(e=t(t=0)),e);var VD=(t,e)=>{for(var r in e)jD(t,r,{get:e[r],enumerable:!0})};var aM,sM=ht(()=>{"use strict";aM=typeof globalThis=="object"?globalThis:global});var lM=ht(()=>{"use strict";sM()});var cM=ht(()=>{"use strict";lM()});var go,py=ht(()=>{"use strict";go="1.9.0"});function IV(t){var e=new Set([t]),r=new Set,n=t.match(uM);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===t};function i(s){return r.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(r.has(c))return!1;var l=c.match(uM);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var uM,dM,pM=ht(()=>{"use strict";py();uM=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;dM=IV(go)});function _s(t,e,r,n){var o;n===void 0&&(n=!1);var i=_c[xc]=(o=_c[xc])!==null&&o!==void 0?o:{version:go};if(!n&&i[t]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+t);return r.error(a.stack||a.message),!1}if(i.version!==go){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+t+" does not match previously registered API v"+go);return r.error(a.stack||a.message),!1}return i[t]=e,r.debug("@opentelemetry/api: Registered a global for "+t+" v"+go+"."),!0}function fo(t){var e,r,n=(e=_c[xc])===null||e===void 0?void 0:e.version;if(!(!n||!dM(n)))return(r=_c[xc])===null||r===void 0?void 0:r[t]}function Ms(t,e){e.debug("@opentelemetry/api: Unregistering a global for "+t+" v"+go+".");var r=_c[xc];r&&delete r[t]}var PV,xc,_c,Mc=ht(()=>{"use strict";cM();py();pM();PV=go.split(".")[0],xc=Symbol.for("opentelemetry.js.api."+PV),_c=aM});function Ic(t,e,r){var n=fo("diag");if(n)return r.unshift(e),n[t].apply(n,LV([],OV(r),!1))}var OV,LV,mM,hM=ht(()=>{"use strict";Mc();OV=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},LV=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},mM=function(){function t(e){this._namespace=e.namespace||"DiagComponentLogger"}return t.prototype.debug=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("debug",this._namespace,e)},t.prototype.error=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("error",this._namespace,e)},t.prototype.info=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("info",this._namespace,e)},t.prototype.warn=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("warn",this._namespace,e)},t.prototype.verbose=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return Ic("verbose",this._namespace,e)},t}()});var lt,jp=ht(()=>{"use strict";(function(t){t[t.NONE=0]="NONE",t[t.ERROR=30]="ERROR",t[t.WARN=50]="WARN",t[t.INFO=60]="INFO",t[t.DEBUG=70]="DEBUG",t[t.VERBOSE=80]="VERBOSE",t[t.ALL=9999]="ALL"})(lt||(lt={}))});function gM(t,e){t<lt.NONE?t=lt.NONE:t>lt.ALL&&(t=lt.ALL),e=e||{};function r(n,o){var i=e[n];return typeof i=="function"&&t>=o?i.bind(e):function(){}}return{error:r("error",lt.ERROR),warn:r("warn",lt.WARN),info:r("info",lt.INFO),debug:r("debug",lt.DEBUG),verbose:r("verbose",lt.VERBOSE)}}var fM=ht(()=>{"use strict";jp()});var NV,DV,kV,Hn,Pc=ht(()=>{"use strict";hM();fM();jp();Mc();NV=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},DV=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},kV="diag",Hn=function(){function t(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=fo("diag");if(s)return s[o].apply(s,DV([],NV(i),!1))}}var r=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:lt.INFO}),o===r){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return r.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=fo("diag"),d=gM((s=i.logLevel)!==null&&s!==void 0?s:lt.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+p),d.warn("Current logger will overwrite one already registered from "+p)}return _s("diag",d,r,!0)};r.setLogger=n,r.disable=function(){Ms(kV,r)},r.createComponentLogger=function(o){return new mM(o)},r.verbose=e("verbose"),r.debug=e("debug"),r.info=e("info"),r.warn=e("warn"),r.error=e("error")}return t.instance=function(){return this._instance||(this._instance=new t),this._instance},t}()});var SM,yM=ht(()=>{"use strict";SM=Symbol("BaggageEntryMetadata")});function my(t){return typeof t!="string"&&(FV.error("Cannot create baggage metadata from unknown type: "+typeof t),t=""),{__TYPE__:SM,toString:function(){return t}}}var FV,EM=ht(()=>{"use strict";Pc();yM();FV=Hn.instance()});function hy(t){return Symbol.for(t)}var UV,gy,fy=ht(()=>{"use strict";UV=function(){function t(e){var r=this;r._currentContext=e?new Map(e):new Map,r.getValue=function(n){return r._currentContext.get(n)},r.setValue=function(n,o){var i=new t(r._currentContext);return i._currentContext.set(n,o),i},r.deleteValue=function(n){var o=new t(r._currentContext);return o._currentContext.delete(n),o}}return t}(),gy=new UV});function Ey(){return yy}var ea,BV,Vp,zV,HV,GV,jV,Sy,VV,$V,WV,yy,qV,KV,YV,XV,JV,QV,ZV,by=ht(()=>{"use strict";ea=function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),BV=function(){function t(){}return t.prototype.createGauge=function(e,r){return KV},t.prototype.createHistogram=function(e,r){return YV},t.prototype.createCounter=function(e,r){return qV},t.prototype.createUpDownCounter=function(e,r){return XV},t.prototype.createObservableGauge=function(e,r){return QV},t.prototype.createObservableCounter=function(e,r){return JV},t.prototype.createObservableUpDownCounter=function(e,r){return ZV},t.prototype.addBatchObservableCallback=function(e,r){},t.prototype.removeBatchObservableCallback=function(e){},t}(),Vp=function(){function t(){}return t}(),zV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Vp),HV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.add=function(r,n){},e}(Vp),GV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Vp),jV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.record=function(r,n){},e}(Vp),Sy=function(){function t(){}return t.prototype.addCallback=function(e){},t.prototype.removeCallback=function(e){},t}(),VV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Sy),$V=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Sy),WV=function(t){ea(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e}(Sy),yy=new BV,qV=new zV,KV=new GV,YV=new jV,XV=new HV,JV=new VV,QV=new $V,ZV=new WV});var Mr,bM=ht(()=>{"use strict";(function(t){t[t.INT=0]="INT",t[t.DOUBLE=1]="DOUBLE"})(Mr||(Mr={}))});var e$,t$,TM,vM=ht(()=>{"use strict";fy();e$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},t$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},TM=function(){function t(){}return t.prototype.active=function(){return gy},t.prototype.with=function(e,r,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return r.call.apply(r,t$([n],e$(o),!1))},t.prototype.bind=function(e,r){return r},t.prototype.enable=function(){return this},t.prototype.disable=function(){return this},t}()});var r$,n$,Ty,o$,AM,RM=ht(()=>{"use strict";vM();Mc();Pc();r$=function(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var n=r.call(t),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},n$=function(t,e,r){if(r||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return t.concat(i||Array.prototype.slice.call(e))},Ty="context",o$=new TM,AM=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalContextManager=function(e){return _s(Ty,e,Hn.instance())},t.prototype.active=function(){return this._getContextManager().active()},t.prototype.with=function(e,r,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,n$([e,r,n],r$(i),!1))},t.prototype.bind=function(e,r){return this._getContextManager().bind(e,r)},t.prototype._getContextManager=function(){return fo(Ty)||o$},t.prototype.disable=function(){this._getContextManager().disable(),Ms(Ty,Hn.instance())},t}()});var Is,CM=ht(()=>{"use strict";RM();Is=AM.getInstance()});var W,wM=ht(()=>{"use strict";Pc();W=Hn.instance()});var i$,xM,_M=ht(()=>{"use strict";by();i$=function(){function t(){}return t.prototype.getMeter=function(e,r,n){return yy},t}(),xM=new i$});var vy,MM,IM=ht(()=>{"use strict";_M();Mc();Pc();vy="metrics",MM=function(){function t(){}return t.getInstance=function(){return this._instance||(this._instance=new t),this._instance},t.prototype.setGlobalMeterProvider=function(e){return _s(vy,e,Hn.instance())},t.prototype.getMeterProvider=function(){return fo(vy)||xM},t.prototype.getMeter=function(e,r,n){return this.getMeterProvider().getMeter(e,r,n)},t.prototype.disable=function(){Ms(vy,Hn.instance())},t}()});var $p,PM=ht(()=>{"use strict";IM();$p=MM.getInstance()});var et=ht(()=>{"use strict";EM();fy();jp();by();bM();CM();wM();PM()});var ol=(t,e)=>{},Ph=!1;try{let t=await import("@sentry/node");ol=t.captureException,t.init({dsn:"https://89e980855f7b9c6e56fc6c7e7143888b@o4506426201800704.ingest.us.sentry.io/4508343221354497",environment:"production",release:process.env.SENTRY_RELEASE_NAME,tracesSampleRate:0}),Ph=!0}catch{}import{Command as f4,Option as gr}from"@commander-js/extra-typings";import{execSync as S4}from"child_process";import{existsSync as ZB,statSync as ez}from"fs";import{z as Oh}from"zod";var M4=Oh.object({input:Oh.string(),agentConfigVersion:Oh.string().optional()});import{z as It}from"zod";var O4=It.object({srcs:It.array(It.string()),urls:It.array(It.string()),desiredSrc:It.string().optional(),desiredUrl:It.string().optional()}),vb=It.object({srcRegex:It.string().optional(),urlRegex:It.string().optional()}),Ab=It.object({x:It.number(),y:It.number(),correlation:It.number()}),L4=It.object({searchImageBase64String:It.string(),pageImageBase64String:It.string(),id:It.string().uuid(),timeoutMs:It.number().max(1e4).min(0).optional()});import{z as I}from"zod";import*as F from"zod";import{extendZodWithOpenApi as $D}from"zod-openapi";import il from"zod";var al=il.object({updatedAt:il.coerce.date().optional()}),Ei=il.object({contentType:il.enum(["image/jpeg","image/png"]),id:il.string()});$D(F);var Ro=(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))(Ro||{}),WD=F.object({mPathSelectorTokens:F.string().array(),frameSrcRegex:F.string().optional(),frameUrlRegex:F.string().optional(),indices:F.number().array()}),sl=F.object({result:F.number(),traceId:F.string()}).array(),Xn=F.object({type:F.literal("GCS_TRACES"),traces:sl}),fr=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(fr||{}),Rb=F.object({attributes:F.record(F.string(),F.string()).optional(),text:F.string().optional(),position:F.object({x1:F.number(),y1:F.number(),x2:F.number(),y2:F.number(),tolerance:F.nativeEnum(fr)}).optional(),shape:F.object({width:F.number(),height:F.number(),tolerance:F.nativeEnum(fr)}).optional(),boundingBox:F.object({x:F.number(),y:F.number(),width:F.number(),height:F.number()}).optional()}),qD=F.object({selectors:F.string().array(),requirements:Rb.optional()}),Co=F.object({id:F.number().int(),dataMomenticId:F.number().int().optional(),selector:F.string().optional(),hybridSelector:F.object({textContent:F.string().nullish(),attributes:F.record(F.string(),F.string().optional()),tagName:F.string(),expandShadowRoot:F.boolean().optional(),classNames:F.string().array(),nthChild:F.number()}).array().optional(),generatedSelectors:F.string().array().optional(),requirements:Rb.optional(),additionalElements:qD.array().optional(),role:F.string().optional(),name:F.string().optional(),numChildren:F.number().optional(),content:F.string().optional(),pathFromRoot: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().or(Ei.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:WD.optional(),inputDescription:F.string().optional().describe("the description that generated this cache"),targetSource:F.nativeEnum(Ro).optional(),targetUpdateTime:F.string().optional(),targetUpdateLoggerTags:F.record(F.string(),F.string()).optional(),cacheResolutionUpdateSource:F.string().optional(),cacheResolutionUpdateTime:F.string().optional(),cacheResolutionUpdateLoggerTags:F.record(F.string(),F.string()).optional(),memory:Xn.optional()}).openapi({ref:"ElementTargetCache"});function vu(t){return!!(t.serializedHtml||t.screenshotUrl||t.generatedSelectors||t.hybridSelector)}var KD=F.object({type:F.literal("description"),elementDescriptor:F.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),YD=F.object({x:F.number(),y:F.number()}),XD=F.object({type:F.literal("coordinates"),pixels:YD}).openapi({ref:"CoordinatesTarget"});function wo(t){return t.type==="description"}function Cn(t){return t.type==="coordinates"}var $t=F.discriminatedUnion("type",[KD,XD]).openapi({ref:"ElementTarget"});function Lh(t){if(!t)return!1;switch(t.type){case"description":return!!t.elementDescriptor}return!0}function Wt(t){if(!t)return"";switch(t.type){case"description":return t.elementDescriptor;case"coordinates":return`x: ${t.pixels.x}, y: ${t.pixels.y}`}}function Au(t){return Xn.safeParse(t).success}import{v4 as Ue}from"uuid";import*as R from"zod";import{extendZodWithOpenApi as sk}from"zod-openapi";import{z as be}from"zod";import{extendZodWithOpenApi as JD}from"zod-openapi";import{z as ll}from"zod";var cl=ll.object({result:ll.boolean(),traceId:ll.string()}).array(),bi=ll.object({type:ll.literal("GCS_TRACES"),traces:cl}),Ru=al.extend({memory:bi.optional()});JD(be);var Cb=be.object({thoughts:be.string(),result:be.boolean(),relevantElements:be.array(be.number()).optional(),updatedMemory:cl.optional()}),an=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(an||{});var QD=be.object({type:be.literal("ELEMENT_NAME"),negated:be.boolean().optional(),operation:be.nativeEnum(an),value:be.string()}).openapi({ref:"ElementNameAssertion"}),ZD=be.object({type:be.literal("ELEMENT_STYLE"),negated:be.boolean().optional(),operation:be.nativeEnum(an),property:be.string(),value:be.string()}).openapi({ref:"ElementStyleAssertion"}),ek=be.object({type:be.literal("ELEMENT_CONTENT"),negated:be.boolean().optional(),operation:be.nativeEnum(an),value:be.string()}).openapi({ref:"ElementContentAssertion"}),tk=be.object({type:be.literal("ELEMENT_ATTRIBUTE"),negated:be.boolean().optional(),operation:be.nativeEnum(an),attr:be.string(),value:be.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Jn=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Jn||{});var rk=be.object({type:be.literal("ELEMENT_EXISTENCE"),negated:be.boolean().optional(),condition:be.nativeEnum(Jn).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Cu=be.discriminatedUnion("type",[ek,tk,rk,QD,ZD]).openapi({ref:"ManualElementAssertion"});var nk=be.object({type:be.literal("CONTENT"),negated:be.boolean().optional(),value:be.string()}).openapi({ref:"PageContentAssertion"}),wb=be.discriminatedUnion("type",[nk]).openapi({ref:"ManualPageAssertion"});import or from"zod";var Nh=or.discriminatedUnion("type",[or.object({type:or.literal("SUBSTRING"),url:or.string()}),or.object({type:or.literal("GLOB"),glob:or.string()}),or.object({type:or.literal("REGEX"),regex:or.string()}),or.object({type:or.literal("DOMAIN"),domain:or.string()})]),ul=or.object({urlMatcher:Nh,method:or.string().optional()});import{z as ge}from"zod";var ok=ge.object({type:ge.literal("json"),content:ge.string().describe("The JSON content to send in the request body")}),ik=ge.object({type:ge.literal("form-urlencoded"),content:ge.record(ge.string(),ge.string()).describe("The form fields to send in the request body")}),ak=ge.discriminatedUnion("type",[ok,ik]),Ti=ge.object({url:ge.string(),method:ge.union([ge.literal("GET"),ge.literal("POST"),ge.literal("PUT"),ge.literal("DELETE"),ge.literal("PATCH")]),headers:ge.record(ge.string(),ge.string()).optional(),params:ge.record(ge.string(),ge.string()).optional(),body:ak.optional(),timeout:ge.number().int().optional().describe("Max seconds to wait for the request to complete")}),xb=ge.object({url:ge.string(),headers:ge.record(ge.string(),ge.string()).optional(),query:ge.string(),variables:ge.string().optional(),timeout:ge.number().int().optional().describe("Max seconds to wait for the request to complete")}),wu=ge.object({code:ge.string(),fragment:ge.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:ge.union([ge.literal("NODE"),ge.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:ge.number().int().max(60).optional().describe("Max seconds for the code to complete")});var Ye=(X=>(X.AI_EXTRACT="AI_EXTRACT",X.AI_ASSERTION="AI_ASSERTION",X.AUTH_LOAD="AUTH_LOAD",X.AUTH_SAVE="AUTH_SAVE",X.BLUR="BLUR",X.CAPTCHA="CAPTCHA",X.CLICK="CLICK",X.COOKIE="COOKIE",X.COPY="COPY",X.DIALOG="DIALOG",X.DRAG="DRAG",X.ELEMENT_CHECK="ELEMENT_CHECK",X.FILE_UPLOAD="FILE_UPLOAD",X.FOCUS="FOCUS",X.GO_BACK="GO_BACK",X.GO_FORWARD="GO_FORWARD",X.HOVER="HOVER",X.JAVASCRIPT="JAVASCRIPT",X.LOCAL_STORAGE="LOCAL_STORAGE",X.MOUSE_DRAG="MOUSE_DRAG",X.NAVIGATE="NAVIGATE",X.NEW_TAB="NEW_TAB",X.PAGE_CHECK="PAGE_CHECK",X.PASTE="PASTE",X.PRESS="PRESS",X.KEY_DOWN="KEY_DOWN",X.KEY_UP="KEY_UP",X.REFRESH="REFRESH",X.REQUEST="REQUEST",X.GRAPHQL_REQUEST="GRAPHQL_REQUEST",X.SCROLL_DOWN="SCROLL_DOWN",X.SCROLL_UP="SCROLL_UP",X.SCROLL_LEFT="SCROLL_LEFT",X.SCROLL_RIGHT="SCROLL_RIGHT",X.SELECT_OPTION="SELECT_OPTION",X.SWITCH_TAB="TAB",X.TYPE="TYPE",X.VISUAL_DIFF="VISUAL_DIFF",X.WAIT="WAIT",X.WAIT_FOR_URL="WAIT_FOR_URL",X.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",X.AWAIT_LISTENER="AWAIT_LISTENER",X.RECORD_REQUESTS="RECORD_REQUESTS",X.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",X.SET_HEADER="SET_HEADER",X.MOCK_ROUTE="MOCK_ROUTE",X.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",X.OFFLINE_MODE="OFFLINE_MODE",X.SUCCESS="SUCCESS",X))(Ye||{});sk(R);var te=R.object({thoughts:R.string().optional(),id:R.string().uuid().describe("unique identifier to this step, used for step cache")}),Nr=R.object({useSelector:R.boolean().optional(),force:R.boolean().optional(),disableCache:R.boolean().optional().describe("disable element caching for this step"),iframeUrl:R.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),Rr=al.extend({target:Co}).optional().openapi({ref:"SingleTargetCache"});function _b(t){return Rr.safeParse(t).success}var _u=R.object({loadTimeout:R.number().int().max(60).optional().describe("Max seconds for the page to load")}),Mb=te.merge(_u).merge(R.object({type:R.literal("NAVIGATE"),url:R.string()})).openapi({ref:"NavigateCommand"}),Mu=Nr.merge(R.object({cache:Rr})),vi=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_UP"),deltaY:R.number().optional()}))).openapi({ref:"ScrollUpCommand"}),Ai=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_DOWN"),deltaY:R.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ca=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_LEFT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),wa=te.merge(Mu.merge(R.object({target:$t.optional(),type:R.literal("SCROLL_RIGHT"),deltaX:R.number().optional()}))).openapi({ref:"ScrollRightCommand"}),hX=R.discriminatedUnion("type",[vi,Ai,Ca,wa]).openapi({ref:"AllScrollCommands"}),lk=te.merge(R.object({type:R.literal("DIALOG"),action:R.union([R.literal("ACCEPT"),R.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Ib=te.merge(R.object({type:R.literal("WAIT"),delay:R.number()})).openapi({ref:"WaitCommand"}),ck=R.object({caseInsensitive:R.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:R.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:R.number().int().optional().describe("Max seconds to wait for the URL to match")}),Pb=te.extend({type:R.literal("WAIT_FOR_URL"),matcher:Nh}).merge(ck).openapi({ref:"WaitUrlCommand"}),Ob=te.merge(_u).merge(R.object({type:R.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Lb=te.merge(R.object({type:R.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Nb=te.merge(R.object({type:R.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),uk=te.extend({type:R.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),dk=te.extend({type:R.literal("AUTH_LOAD"),storageState:R.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Dh=te.merge(Nr).extend({type:R.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Db=te.extend({type:R.literal("COPY"),value:R.string()}).openapi({ref:"CopyCommand"}),kb=te.extend({type:R.literal("PASTE")}).openapi({ref:"PasteCommand"}),Fb=te.merge(wu).extend({type:R.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),xa=te.merge(Nr).extend({type:R.literal("CLICK"),target:$t,doubleClick:R.boolean().optional(),rightClick:R.boolean().optional(),waitForDownload:R.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:R.number().optional(),downloadTimeoutMs:R.number().optional(),cache:Rr,relativePosition:R.object({x:R.number(),y:R.number()}).optional()}).openapi({ref:"ClickCommand"}),kh=al.extend({fromTarget:Co.optional(),toTarget:Co.optional()}),_a=te.merge(Nr).merge(R.object({type:R.literal("DRAG"),fromTarget:$t,toTarget:$t,steps:R.number().optional(),hoverSeconds:R.number().optional().describe("Seconds to hover the object before dropping"),cache:kh.optional()})).openapi({ref:"DragCommand"}),Ma=te.merge(Nr).merge(R.object({type:R.literal("MOUSE_DRAG"),target:$t.optional(),deltaX:R.string().describe("pixels to move horizontally, can be template"),deltaY:R.string().describe("pixels to move vertically, can be template"),steps:R.number().optional(),cache:Rr})).openapi({ref:"MouseDragCommand"}),Ia=te.merge(Nr).merge(R.object({type:R.literal("HOVER"),target:$t,cache:Rr})).openapi({ref:"HoverCommand"}),dl=te.merge(Nr).merge(R.object({type:R.literal("FOCUS"),target:$t,cache:Rr})).openapi({ref:"FocusCommand"}),pl=te.merge(Nr).extend({type:R.literal("BLUR"),target:$t.optional(),cache:Rr}).openapi({ref:"BlurCommand"}),pk=R.object({type:R.literal("URL"),url:R.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),mk=R.object({type:R.literal("USER_FILE"),name:R.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),hk=te.extend({type:R.literal("FILE_UPLOAD"),fileSource:R.discriminatedUnion("type",[pk,mk]),filename:R.string().optional()}).openapi({ref:"FileUploadCommand"}),Fh=R.discriminatedUnion("type",[R.object({type:R.literal("VALUE"),value:R.string()}),R.object({type:R.literal("LABEL"),label:R.string()}),R.object({type:R.literal("INDEX"),index:R.coerce.string()})]),Pa=te.merge(Nr).extend({type:R.literal("SELECT_OPTION"),target:$t,cache:Rr,choice:Fh.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Uh=R.union([R.literal("MULTIMODAL"),R.literal("VISION_ONLY")]),ml=te.merge(R.object({type:R.literal("AI_ASSERTION"),assertion:R.string(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional(),contextChoice:Uh.optional(),timeout:R.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:Ru.optional(),source:R.string().optional()})).openapi({ref:"AIAssertionCommand"}),wn=5,Ri=600,Oa=te.merge(Nr).extend({type:R.literal("ELEMENT_CHECK"),target:$t,assertion:Cu,cache:Rr.or(Ru).optional(),timeout:R.number().int().min(0).max(Ri).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Ub=te.extend({type:R.literal("PAGE_CHECK"),assertion:wb,iframeUrl:R.string().optional().describe("url or url regex for the iframe"),timeout:R.number().int().min(0).max(Ri).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Bb=te.merge(R.object({type:R.literal("AI_EXTRACT"),goal:R.string(),schema:R.string().optional(),envKey:R.string().optional(),disableCache:R.boolean().optional(),iframeUrl:R.string().optional()})).openapi({ref:"AIExtractCommand"}),gk=R.object({clearContent:R.boolean().optional(),forceClearContent:R.boolean().optional(),delay:R.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:R.boolean().optional(),pressEnter:R.boolean().optional(),relativePosition:R.object({x:R.number(),y:R.number()}).optional()}),zb=25,La=te.merge(Nr).merge(gk).extend({type:R.literal("TYPE"),target:$t.optional(),value:R.string(),cache:Rr}).openapi({ref:"TypeCommand"}),Hb=te.merge(R.object({type:R.literal("PRESS"),value:R.string(),repeat:R.number().optional(),convertMeta:R.boolean().optional(),delayMs:R.number().optional()})).openapi({ref:"PressCommand"}),Gb=te.merge(R.object({type:R.literal("KEY_DOWN"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyDownCommand"}),jb=te.merge(R.object({type:R.literal("KEY_UP"),value:R.string(),convertMeta:R.boolean().optional()})).openapi({ref:"KeyUpCommand"}),fk=R.object({type:R.literal("SUBSTRING"),substring:R.string()}),Sk=R.object({type:R.literal("REGEX"),pattern:R.string()}),yk=R.object({type:R.literal("INDEX"),index:R.coerce.string()}),Ek=R.discriminatedUnion("type",[fk,Sk,yk]),bk=te.merge(_u).merge(R.object({type:R.literal("TAB"),action:Ek})).openapi({ref:"TabCommand"}),Vb=te.merge(_u).merge(R.object({type:R.literal("NEW_TAB"),url:R.string()})).openapi({ref:"NewTabCommand"}),Tk=te.merge(R.object({type:R.literal("COOKIE"),value:R.string()})).openapi({ref:"CookieCommand"}),$b=te.merge(R.object({type:R.literal("LOCAL_STORAGE"),key:R.string(),value:R.string()})).openapi({ref:"LocalStorageCommand"}),Wb=te.extend({type:R.literal("REQUEST")}).merge(Ti).openapi({ref:"RequestCommand"}),hl=R.object({status:R.number().optional(),headers:R.record(R.string(),R.string()),json:R.unknown().optional(),text:R.string().optional(),cookies:R.record(R.string(),R.unknown()).array().optional(),request:R.object({url:R.string(),method:R.string(),headers:R.record(R.string(),R.string()),json:R.unknown().optional()})}),qb=te.extend({type:R.literal("GRAPHQL_REQUEST")}).merge(xb).openapi({ref:"GraphQLRequestCommand"}),Kb=te.merge(R.object({type:R.literal("SUCCESS"),condition:ml.optional()})).openapi({ref:"SuccessCommand"}),Yb=te.merge(R.object({type:R.literal("FAILURE")})).openapi({ref:"FailureCommand"}),vk=R.object({data:R.union([R.string().describe("location at which to find a jpg - public URL or local"),Ei]),width:R.number(),height:R.number()});function Xb(t){return t?Ei.safeParse(t).success:!1}var gl=te.merge(Nr).merge(R.object({type:R.literal("VISUAL_DIFF"),threshold:R.number().optional().describe("default 0.1"),target:$t.optional(),screenshot:vk.optional(),cache:Rr})).openapi({ref:"VisualDiffCommand"}),Ak=te.merge(R.object({type:R.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:ul,key:R.string()})).openapi({ref:"RegisterRequestListenerCommand"}),Rk=te.merge(R.object({type:R.literal("AWAIT_LISTENER"),key:R.string(),timeout:R.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),Ck=te.merge(R.object({type:R.literal("RECORD_REQUESTS"),requestMatcher:ul,key:R.string()})).openapi({ref:"RecordRequestsCommand"}),wk=te.merge(R.object({type:R.literal("GET_RECORDED_REQUESTS"),key:R.string()})).openapi({ref:"GetRecordedRequestsCommand"}),xk=te.merge(R.object({type:R.literal("SET_HEADER"),name:R.string(),value:R.string(),requestMatcher:ul.optional()})).openapi({ref:"SetHeaderCommand"}),_k=te.merge(R.object({type:R.literal("MOCK_ROUTE"),requestMatcher:ul,responseGenerator:R.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:R.boolean().optional().describe("Whether to fetch the real response and pass it to the response generator. If enabled, the original response will be available as `response` in the code."),key:R.string().optional().describe("Key to reference this mock. This only needs to be set if you plan to remove the mock later in the test.")}).openapi({ref:"MockRouteCommandOptions"})),Mk=te.merge(R.object({type:R.literal("REMOVE_ROUTE_MOCK"),key:R.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),Ik=te.merge(R.object({type:R.literal("OFFLINE_MODE"),enable:R.boolean()})).openapi({ref:"OfflineModeCommand"}),Pk=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],gX=[...Pk,"DRAG"],Ok=R.discriminatedUnion("type",[xa,La,Hb,Gb,jb,Pa,Mb,Ai,vi,ml,Lb,Ia,Ib]),Lk=R.discriminatedUnion("type",[...Ok.options,_a]),Nk=R.discriminatedUnion("type",[...Lk.options]),Jb=R.discriminatedUnion("type",[...Nk.options,Kb]),Bh=R.discriminatedUnion("type",[Kb,xa,La,Hb,Gb,jb,Pa,Mb,Ai,vi,ml,Lb,Ia,Ib,Fb,Oa,Ub,Vb,Pb,Bb,Db,Nb,$b,_a,Ma,kb,Ob,Wb,qb]),Dk=R.discriminatedUnion("type",[Bb,dk,uk,Dh,Tk,Db,lk,Oa,hk,Nb,Fb,$b,Ma,Vb,Ub,kb,Ob,Wb,qb,Ca,wa,bk,gl,dl,pl,Pb,Ak,Rk,Ck,wk,xk,_k,Mk,Ik]),Na=R.discriminatedUnion("type",[...Jb.options,...Dk.options]).openapi({ref:"Command"}),Iu=R.discriminatedUnion("type",[...Jb.options,Yb]),fX=R.discriminatedUnion("type",[...Bh.options,Yb]);function Qn(t){let e;switch(t){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:Ue(),type:t};break;case"AUTH_LOAD":{e={id:Ue(),type:t,storageState:""};break}case"AI_EXTRACT":e={id:Ue(),type:t,goal:""};break;case"DIALOG":e={id:Ue(),type:t,action:"DISMISS"};break;case"DRAG":e={id:Ue(),type:t,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:Ue(),type:t,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:Ue(),type:t,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:Ue(),type:t,delay:1};break;case"BLUR":e={id:Ue(),type:t};break;case"HOVER":case"FOCUS":case"CLICK":e={id:Ue(),type:t,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:Ue(),type:t,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:Ue(),type:t,value:""};break;case"SELECT_OPTION":e={id:Ue(),type:t,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:Ue(),type:t,url:""};case"TAB":e={id:Ue(),type:t,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:Ue(),type:t,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:Ue(),type:t,url:"",query:""};break;case"LOCAL_STORAGE":e={id:Ue(),type:t,key:"",value:""};break;case"JAVASCRIPT":e={id:Ue(),type:t,code:""};break;case"AI_ASSERTION":e={id:Ue(),type:t,assertion:""};break;case"FILE_UPLOAD":{e={id:Ue(),type:t,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:Ue(),type:t,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:Ue(),type:t,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:Ue(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:Ue(),type:t,key:""};break}case"RECORD_REQUESTS":{e={id:Ue(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:Ue(),type:t,key:""};break}case"SET_HEADER":{e={id:Ue(),type:t,name:"",value:""};break}case"MOCK_ROUTE":{e={id:Ue(),type:t,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:Ue(),type:t};break}case"OFFLINE_MODE":{e={id:Ue(),type:t,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}return e}function Qb(t){switch(t.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":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var EX={AI_ASSERTION:"AI Check",JAVASCRIPT:"JavaScript"};import{z as kk}from"zod";var RX=kk.discriminatedUnion("type",[pl,Dh,xa,_a,dl,Ia,Ma,vi,Ai,Ca,wa,Pa,La,gl,Oa]);function Zb(t){return["AI_ASSERTION","ELEMENT_CHECK","PAGE_CHECK"].includes(t)}import{z as Fk}from"zod";import{z as _o}from"zod";function fl(t){return _o.object({key:_o.string(),testId:_o.string().optional(),moduleId:_o.string().optional(),organizationId:_o.string(),value:t})}function Sl(t){return fl(t).extend({uniqueKey:_o.string()})}function Pu(t){return _o.record(_o.string(),Sl(t))}var ir={type:!0,cache:!0},Zn=Fk.discriminatedUnion("type",[ml.pick(ir),pl.pick(ir),xa.pick(ir),_a.pick(ir),Oa.pick(ir),dl.pick(ir),Ia.pick(ir),Ma.pick(ir),vi.pick(ir),Ai.pick(ir),Ca.pick(ir),wa.pick(ir),Pa.pick(ir),La.pick(ir),gl.pick(ir)]),Ou=Object.values(Ye).filter(t=>Zn.options.some(e=>e.shape.type.safeParse(t).success));Na.options.forEach(t=>{if("target"in t.shape&&!Ou.includes(t.shape.type.value))throw new Error(`Command ${t.shape.type.value} has a target but no cache`)});function Lu(t){return Ou.includes(t.type)}var eT=fl(Zn),tT=Sl(Zn),OX=Pu(Zn);import{v4 as Qe}from"uuid";import{z as w}from"zod";var nT=Symbol("Let zodToJsonSchema decide on which parser to use");var rT={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},oT=t=>typeof t=="string"?{...rT,name:t}:{...rT,...t};var iT=t=>{let e=oT(t),r=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function zh(t,e,r,n){n?.errorMessages&&r&&(t.errorMessage={...t.errorMessage,[e]:r})}function xe(t,e,r,n,o){t[e]=r,zh(t,e,n,o)}var Nu=(t,e)=>{let r=0;for(;r<t.length&&r<e.length&&t[r]===e[r];r++);return[(t.length-r).toString(),...e.slice(r)].join("/")};import{ZodFirstPartyTypeKind as Re}from"zod";function ct(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?Nu(e,t.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as Uk}from"zod";function aT(t,e){let r={type:"array"};return t.type?._def&&t.type?._def?.typeName!==Uk.ZodAny&&(r.items=re(t.type._def,{...e,currentPath:[...e.currentPath,"items"]})),t.minLength&&xe(r,"minItems",t.minLength.value,t.minLength.message,e),t.maxLength&&xe(r,"maxItems",t.maxLength.value,t.maxLength.message,e),t.exactLength&&(xe(r,"minItems",t.exactLength.value,t.exactLength.message,e),xe(r,"maxItems",t.exactLength.value,t.exactLength.message,e)),r}function sT(t,e){let r={type:"integer",format:"int64"};if(!t.checks)return r;for(let n of t.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?xe(r,"minimum",n.value,n.message,e):xe(r,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(r.exclusiveMinimum=!0),xe(r,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?xe(r,"maximum",n.value,n.message,e):xe(r,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(r.exclusiveMaximum=!0),xe(r,"maximum",n.value,n.message,e));break;case"multipleOf":xe(r,"multipleOf",n.value,n.message,e);break}return r}function lT(){return{type:"boolean"}}function Du(t,e){return re(t.type._def,e)}var cT=(t,e)=>re(t.innerType._def,e);function Hh(t,e,r){let n=r??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Hh(t,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return Bk(t,e)}}var Bk=(t,e)=>{let r={type:"integer",format:"unix-time"};if(e.target==="openApi3")return r;for(let n of t.checks)switch(n.kind){case"min":xe(r,"minimum",n.value,n.message,e);break;case"max":xe(r,"maximum",n.value,n.message,e);break}return r};function uT(t,e){return{...re(t.innerType._def,e),default:t.defaultValue()}}function dT(t,e){return e.effectStrategy==="input"?re(t.schema._def,e):ct(e)}function pT(t){return{type:"string",enum:Array.from(t.values)}}var zk=t=>"type"in t&&t.type==="string"?!1:"allOf"in t;function mT(t,e){let r=[re(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),re(t.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach(i=>{if(zk(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function hT(t,e){let r=typeof t.value;return r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string"?{type:Array.isArray(t.value)?"array":"object"}:e.target==="openApi3"?{type:r==="bigint"?"integer":r,enum:[t.value]}:{type:r==="bigint"?"integer":r,const:t.value}}import{ZodFirstPartyTypeKind as yl}from"zod";var Gh,sn={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Gh===void 0&&(Gh=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Gh),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function ku(t,e){let r={type:"string"};if(t.checks)for(let n of t.checks)switch(n.kind){case"min":xe(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e);break;case"max":xe(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":ln(r,"email",n.message,e);break;case"format:idn-email":ln(r,"idn-email",n.message,e);break;case"pattern:zod":ar(r,sn.email,n.message,e);break}break;case"url":ln(r,"uri",n.message,e);break;case"uuid":ln(r,"uuid",n.message,e);break;case"regex":ar(r,n.regex,n.message,e);break;case"cuid":ar(r,sn.cuid,n.message,e);break;case"cuid2":ar(r,sn.cuid2,n.message,e);break;case"startsWith":ar(r,RegExp(`^${jh(n.value,e)}`),n.message,e);break;case"endsWith":ar(r,RegExp(`${jh(n.value,e)}$`),n.message,e);break;case"datetime":ln(r,"date-time",n.message,e);break;case"date":ln(r,"date",n.message,e);break;case"time":ln(r,"time",n.message,e);break;case"duration":ln(r,"duration",n.message,e);break;case"length":xe(r,"minLength",typeof r.minLength=="number"?Math.max(r.minLength,n.value):n.value,n.message,e),xe(r,"maxLength",typeof r.maxLength=="number"?Math.min(r.maxLength,n.value):n.value,n.message,e);break;case"includes":{ar(r,RegExp(jh(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&ln(r,"ipv4",n.message,e),n.version!=="v4"&&ln(r,"ipv6",n.message,e);break}case"base64url":ar(r,sn.base64url,n.message,e);break;case"jwt":ar(r,sn.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&ar(r,sn.ipv4Cidr,n.message,e),n.version!=="v4"&&ar(r,sn.ipv6Cidr,n.message,e);break}case"emoji":ar(r,sn.emoji(),n.message,e);break;case"ulid":{ar(r,sn.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{ln(r,"binary",n.message,e);break}case"contentEncoding:base64":{xe(r,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{ar(r,sn.base64,n.message,e);break}}break}case"nanoid":ar(r,sn.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return r}function jh(t,e){return e.patternStrategy==="escape"?Gk(t):t}var Hk=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function Gk(t){let e="";for(let r=0;r<t.length;r++)Hk.has(t[r])||(e+="\\"),e+=t[r];return e}function ln(t,e,r,n){t.format||t.anyOf?.some(o=>o.format)?(t.anyOf||(t.anyOf=[]),t.format&&(t.anyOf.push({format:t.format,...t.errorMessage&&n.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage&&(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.anyOf.push({format:e,...r&&n.errorMessages&&{errorMessage:{format:r}}})):xe(t,"format",e,r,n)}function ar(t,e,r,n){t.pattern||t.allOf?.some(o=>o.pattern)?(t.allOf||(t.allOf=[]),t.pattern&&(t.allOf.push({pattern:t.pattern,...t.errorMessage&&n.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage&&(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0&&delete t.errorMessage)),t.allOf.push({pattern:gT(e,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})):xe(t,"pattern",gT(e,n),r,n)}function gT(t,e){if(!e.applyRegexFlags||!t.flags)return t.source;let r={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},n=r.i?t.source.toLowerCase():t.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(r.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(r.m){if(n[c]==="^"){o+=`(^|(?<=[\r
|
|
5
5
|
]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
|
|
6
6
|
]))`;continue}}if(r.s&&n[c]==="."){o+=a?`${n[c]}\r
|
|
7
7
|
`:`[${n[c]}\r
|
|
@@ -18,24 +18,24 @@ ${this.decisions.map(e=>e.toString()).join(`
|
|
|
18
18
|
Swipe in a direction within a container (screen/app/webview).
|
|
19
19
|
`),sU=Ae.object({type:Ae.literal("SCROLL_TO"),targetDescription:Ae.string().describe("Description of the element or text to scroll to inside the container. Scrolling up will bring you up in the page, and vice versa."),direction:Ae.enum(["down","up"]).describe("Direction to scroll while searching for the target."),container:TA,scrollStepPercent:Ae.number().min(.1).max(1).nullish().describe("How much of the container height to scroll at each step (0.1 - 1). Defaults to 0.8 when omitted.")}).describe(`
|
|
20
20
|
Scroll within a container until the described target is visible. Scrolling up or down will scroll until it finds it or can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If a scroll fails, we do not restore the position automatically.
|
|
21
|
-
`),loe=Ae.discriminatedUnion("type",[rU,nU,oU,iU,aU,sU]);var coe={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",ROTATE_ORIENTATION:"Rotate the device orientation.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true."};var uoe=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","ROTATE_ORIENTATION","AI_CHECK"];import lU from"zod";var Fi={type:!0,cache:!0},Xa=lU.discriminatedUnion("type",[Dl.pick(Fi),Pl.pick(Fi),Ul.pick(Fi),zl.pick(Fi),Ll.pick(Fi),Ol.pick(Fi),Il.pick(Fi)]),foe=Object.values(Ne).filter(t=>Xa.options.some(e=>e.shape.type.safeParse(t).success));var vA=fl(Xa),AA=Sl(Xa),Soe=Pu(Xa);import RA from"zod";var Kl=(n=>(n.US_WEST_1="us-west1",n.EU_NORTH_1="eu-north1",n.AS_SOUTH_1="as-south1",n))(Kl||{}),CA=(e=>(e.LOCAL="local",e))(CA||{}),wA=RA.nativeEnum(Kl).or(RA.nativeEnum(CA)),Yl=(r=>(r.ANDROID_14="14",r.ANDROID_15="15",r))(Yl||{});var lf=(e=>(e.IOS_26="26",e))(lf||{});import{cloneDeep as voe}from"lodash-es";import Roe from"truncate-json";import bt from"zod";import{z as pn}from"zod";import{z as ut}from"zod";var Jt=ut.object({id:ut.string(),name:eo,baseUrl:$u,description:ut.string().optional().nullish(),schemaVersion:ut.string(),advanced:Di,retries:ut.number(),envs:ut.array(rd).nullish(),parameters:td.nullish(),disabled:ut.boolean().optional(),labels:ut.array(ut.string()).optional().catch([])}),Poe=ut.enum(["INHERIT","ENABLED","DISABLED"]);var cU=Di.extend({failureRecovery:ut.boolean().or(ut.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED"),useMemory:ut.boolean().or(ut.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED")});var Ooe=Jt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:cU}),Loe=Jt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),uU=ut.object({labels:ut.array(ut.string()).optional(),outputs:xv.nullish()}),jr=Jt.merge(uU),dU=ut.object({createdAt:ut.coerce.date(),updatedAt:ut.coerce.date(),updatedBy:ut.string().nullable(),schedule:ja,notification:Va,createdBy:ut.string(),organizationId:ut.string(),folderId:ut.string().nullable().optional()}),pU=Jt.merge(dU),Noe=pU.merge(Io),Td=Jt.merge(Io),Doe=Jt.merge(_i);var mU="test",hU="module",gU="mobile-test",fU="mobile-module";var ye=(o=>(o.TEST=`momentic/${mU}`,o.MODULE=`momentic/${hU}`,o.MOBILE_TEST=`momentic/${gU}`,o.MOBILE_MODULE=`momentic/${fU}`,o))(ye||{}),Goe=Jt.merge(_i),cf=Sr.extend({steps:pn.array(pn.record(pn.string(),pn.unknown())),schemaVersion:pn.string()}),joe=cf.extend({fileType:pn.literal(ye.MODULE)}),Voe=pn.object({test:pn.string().describe("YAML for the test, including metadata and steps"),modules:pn.record(pn.string(),pn.string()).describe("Map of module name to YAML for the module")});function vd(t){if(t===void 0)return"__undefined__";if(t===null)return null;if(typeof t!="object")return t;if(Array.isArray(t))return t.map(vd);let e={};for(let[r,n]of Object.entries(t))e[r]=vd(n);return e}var uf=bt.object({parameterNames:bt.string().array(),defaultParameters:bt.record(bt.string(),bt.string()).optional(),parameterEnums:bt.record(bt.string(),bt.string().array()).optional()}),xA=bt.object({moduleId:bt.string().uuid(),name:bt.string(),description:bt.string().nullish(),parameters:uf.optional(),enabled:bt.boolean().nullish(),schemaVersion:bt.string()}),Ad=xA.omit({name:!0}),_A=Ad.extend({steps:bt.array(bt.record(bt.string(),bt.unknown()))}),SU=bt.object({fileType:bt.literal(ye.MOBILE_MODULE)}).merge(_A),yU=xA.omit({schemaVersion:!0}).extend({steps:bt.array(ro)});import Ve from"zod";import*as Ja from"zod";var Joe=Ja.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."}),df=Ja.preprocess(t=>{if(typeof t!="string")return t;let e=t.trim();return e.length===0?void 0:e},Ja.string().optional());import Xl from"zod";var Bo=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Bo||{}),pf=Sd.extend({steps:Xl.lazy(()=>Qa.array()),description:Xl.string().optional(),name:Xl.string().describe("name of the module"),parameters:uf.optional()}),EU=Gl.merge(pf).extend({type:Xl.literal("RESOLVED_MOBILE_MODULE")}),Qa=Xl.discriminatedUnion("type",[EU,jl,Vl]);function MA(t){return Object.values(Bo).includes(t)||Object.values(un).includes(t)}var bU=Ve.object({disableMomenticAccessibilityTree:Ve.boolean().optional(),autoGrantPermissions:Ve.boolean().optional(),browserSettings:Ga.optional()}),mf=bU.extend({region:wA.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Ve.object({androidVersion:Ve.nativeEnum(Yl).optional()}).optional(),localEmulatorSettings:Ve.object({avdId:df}).optional(),geolocation:Ve.object({latitude:Ve.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Ve.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:Ve.boolean().optional().describe("wait for stability before every targeting action")}),Za=Ve.object({retries:Ve.number().optional().describe("number of retries to run"),defaultChannel:Ve.string().optional().describe("default channel to use"),defaultTag:Ve.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Ve.string().optional(),defaultApkFilePath:df.describe("APK to install when using the emulator in the local region."),emulator:mf.optional(),ai:vg.optional()}),es=Ve.object({id:Ve.string().uuid(),description:Ve.string(),schemaVersion:Ve.string(),settings:Za.optional(),disabled:Ve.boolean().optional(),labels:Ve.array(Ve.string()).optional()}),IA=Ve.object({fileType:Ve.literal(ye.MOBILE_TEST)}).merge(es),TU=es.merge(Ve.object({steps:Ve.array(ro)})),fie=IA.merge(TU),Sie=Ve.object({name:Ve.string(),steps:Ve.array(ro).optional(),settings:Za.optional()}),PA=es.extend({steps:Qa.array()});import ne from"zod";var mn=ne.object({startTime:ne.number(),endTime:ne.number().optional(),durationMs:ne.number().optional(),error:ne.string().optional(),result:ne.unknown().optional(),attributes:ne.record(ne.string(),ne.unknown())});var vU=mn.extend({type:ne.literal("SECTION"),name:ne.string(),subSpans:ne.lazy(()=>hn.array())}),AU=mn.extend({type:ne.literal("AI_LOCATOR_CALL"),result:ne.object({id:ne.number(),thoughts:ne.string()}).optional(),subSpans:ne.lazy(()=>hn.array())}),RU=mn.extend({type:ne.literal("AI_ASSERTION_CALL"),result:ne.object({thoughts:ne.string(),result:ne.boolean()}).optional(),subSpans:ne.lazy(()=>hn.array())}),CU=mn.extend({type:ne.literal("TARGET_RESOLUTION"),result:ne.object({serializedElement:ne.string()}).optional(),subSpans:ne.lazy(()=>hn.array())}),wU=mn.extend({type:ne.literal("EMULATOR_INTERACTION"),name:ne.string(),withinWebview:ne.boolean().optional(),subSpans:ne.lazy(()=>hn.array())}),xU=mn.extend({type:ne.literal("EMULATOR_READ_STATE"),name:ne.string(),subSpans:ne.lazy(()=>hn.array())}),_U=mn.extend({type:ne.literal("ELEMENT_ASSERTION"),name:ne.string(),result:ne.object({success:ne.boolean(),message:ne.string().optional()}).optional(),subSpans:ne.lazy(()=>hn.array())}),MU=mn.extend({type:ne.literal("CACHE_RESOLUTION"),subSpans:ne.lazy(()=>hn.array())}),IU=mn.extend({type:ne.literal("WAIT_FOR_SCREENSHOT_STABILITY"),subSpans:ne.lazy(()=>hn.array())}),PU=mn.extend({type:ne.literal("WAIT_FOR_PAGE_STABILITY"),subSpans:ne.lazy(()=>hn.array())}),OU=mn.extend({type:ne.literal("GENERIC"),name:ne.string(),subSpans:ne.lazy(()=>hn.array())}),hn=ne.discriminatedUnion("type",[vU,AU,RU,CU,wU,xU,_U,MU,IU,PU,OU]);import{parse as vie}from"date-fns";import{z as ts}from"zod";var Rie=ts.object({testId:ts.string(),sessionId:ts.string()}),OA=ts.object({uploadUrl:ts.string(),id:ts.string()});var Yie=new Set(Object.values(Ke));var LU={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",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",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},Xie={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],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:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},Jie={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.",CONDITIONAL:"Execute steps based on the outcome of an AI Check",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.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},Qie={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ROTATE_ORIENTATION:"Rotate orientation",ADB:"ADB command",STATE:"Debug state"},Zie={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ROTATE_ORIENTATION:"Rotate the device orientation to portrait or landscape.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen."};import NU from"semver";import{z as DU}from"zod";var nae=DU.string().refine(t=>NU.valid(t),{message:"must be a valid semver string"});import{Faker as aae,en as sae}from"@faker-js/faker";import{z as U}from"zod";var rs=55555,cae=U.object({body:U.string(),to:U.string(),from:U.string()}),uae=U.object({from:U.string().optional(),to:U.string(),timeout:U.number().optional(),beforeDate:U.string().pipe(U.coerce.date()).or(U.date()).optional(),afterDate:U.string().pipe(U.coerce.date()).or(U.date()).optional()}),dae=U.object({to:U.string().email(),from:U.string(),subject:U.string(),body:U.string(),html:U.string().optional()}),pae=U.object({inbox:U.string().transform(t=>t.toLowerCase()),afterDate:U.string().pipe(U.coerce.date()).or(U.date()).optional(),timeout:U.number().optional(),trimWhitespace:U.boolean().optional()}),mae=U.object({inbox:U.string(),limit:U.number().optional(),afterDate:U.string().pipe(U.coerce.date()).or(U.date()).optional(),trimWhitespace:U.boolean().optional()});var Rd=(r=>(r.RAW="RAW",r.RESPONSE="RESPONSE",r))(Rd||{}),LA=U.object({body:U.string().nullish(),status:U.number().optional(),headers:U.array(U.tuple([U.string(),U.string()])).optional()}),kU=U.object({url:U.string(),options:U.object({method:U.string(),body:U.string().nullish(),headers:U.array(U.tuple([U.string(),U.string()])).optional()}).optional()}).optional(),FU=U.object({body:U.string().nullish(),options:U.object({status:U.number(),statusText:U.string().optional(),headers:U.array(U.tuple([U.string(),U.string()])).optional()}).optional()}).optional(),NA=U.object({result:U.unknown(),variableUpdates:U.record(U.string(),U.unknown()).optional(),persistentVariableUpdates:U.record(U.string(),U.unknown()).optional(),error:U.string().optional(),success:U.boolean()}),hae=U.object({id:U.string().optional(),orgId:U.string(),momenticLambdaAuthHash:U.string(),code:U.string(),fragment:U.boolean(),state:U.object({env:U.record(U.string(),U.unknown()),request:kU,response:FU,additionalBindings:U.record(U.string(),U.unknown()).optional()}),timeoutMs:U.number().optional(),disallowVariableUpdates:U.boolean().optional(),responseSerialization:U.nativeEnum(Rd).optional()}),zo=15e3;import*as Qt from"zod";import{extendZodWithOpenApi as UU}from"zod-openapi";UU(Qt);var BU=Qt.object({url:Qt.string(),lineNumber:Qt.number(),columnNumber:Qt.number()}).openapi({ref:"CodeLocation"}),Cd=Qt.object({timestamp:Qt.number(),text:Qt.string(),type:Qt.string(),tabIndex:Qt.number(),args:Qt.unknown().array().optional(),url:Qt.string().optional(),location:BU.optional()}).openapi({ref:"ConsoleLog"}),DA=Cd.array(),hf=DA.array();import*as gf from"zod";import{extendZodWithOpenApi as zU}from"zod-openapi";zU(gf);var HU=gf.object({logsPerPage:Cd.array().array()}).openapi({ref:"DebugData"});var Jl=class{async getConsoleLogsForRunAttempt(e,r,n){}async getNetworkLogsForRunAttempt(e,r,n){}async getHtmlSnapshot(e,r){}async getA11yTreeSnapshot(e,r){}async getScreenshot(e,r){}async storeConsoleLogsForRunAttempt(e,r,n,o){}async storeNetworkLogsForRunAttempt(e,r,n,o){}listVideoAssetPaths(){return[]}close(){}async storeScreenshot(e,r,n){}async storeOnDemandScreenshotById(e,r,n,o){}async storeHtmlSnapshot(e,r,n){}};import{z as P}from"zod";var GU=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),jU=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),VU=P.object({onContentLoad:P.number().optional(),onLoad:P.number().optional(),comment:P.string().optional()}),Ql=P.object({startedDateTime:P.string(),id:P.string(),title:P.string().optional(),pageTimings:VU,comment:P.string().optional()}),$U=P.array(Ql),WU=P.object({name:P.string(),value:P.string(),path:P.string().optional(),domain:P.string().optional(),expires:P.string().optional(),httpOnly:P.boolean().optional(),secure:P.boolean().optional(),comment:P.string().optional()}),FA=P.array(WU),qU=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),UA=P.array(qU),KU=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),YU=P.array(KU),XU=P.object({name:P.string(),value:P.string().optional(),fileName:P.string().optional(),contentType:P.string().optional(),comment:P.string().optional()}),JU=P.array(XU),QU=P.object({mimeType:P.string(),params:JU,text:P.string(),comment:P.string().optional(),_redactedReason:P.string().optional()}),ZU=P.object({method:P.string(),url:P.string(),httpVersion:P.string().optional(),cookies:FA,headers:UA,queryString:YU,postData:QU.optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional()}),eB=P.object({size:P.number().optional(),compression:P.number().optional(),mimeType:P.string().optional(),text:P.string().optional(),encoding:P.string().optional(),comment:P.string().optional(),_redactedReason:P.string().optional()}),tB=P.object({status:P.number(),statusText:P.string(),httpVersion:P.string().optional(),cookies:FA,headers:UA,content:eB,redirectURL:P.string().optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional(),_mocked:P.boolean().optional()}),kA=P.object({expires:P.string().optional(),lastAccess:P.string(),eTag:P.string(),hitCount:P.number(),comment:P.string().optional()}),rB=P.object({beforeRequest:kA.optional(),afterRequest:kA.optional(),comment:P.string().optional()}),nB=P.object({blocked:P.number().optional(),dns:P.number().optional(),connect:P.number().optional(),send:P.number(),wait:P.number(),receive:P.number(),ssl:P.number().optional(),comment:P.string().optional()}),Zl=P.object({pageref:P.string().optional(),startedDateTime:P.string(),time:P.number().optional(),request:ZU,response:tB.optional(),cache:rB.optional(),timings:nB,serverIPAddress:P.string().optional(),connection:P.string().optional(),comment:P.string().optional(),_resourceType:P.string().optional()}),oB=P.array(Zl),iB=P.object({version:P.string().default("1.1"),creator:GU.optional(),browser:jU.optional(),pages:$U.optional(),entries:oB,comment:P.string().optional()}),aB=P.object({log:iB}),xae=P.record(P.string(),Ql),_ae=P.record(P.string(),Zl);function ff(t,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(t).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}import{cloneDeep as sB}from"lodash-es";import{z as In}from"zod";var Sf=(c=>(c.DisableClickhouseCaches="disable_clickhouse_caches",c.ShowZeroOpacityElements="show_zero_opacity_elements",c.VisualActions="visual_actions",c.RagV2="rag_v2",c.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",c.GlobalLocatorRedirect="global_locator_redirect",c.FakerConstantSeed="faker_constant_seed",c.AutoExpandIframes="auto_expand_iframes",c))(Sf||{});var BA=In.union([In.string(),In.number(),In.boolean(),In.null(),In.record(In.string(),In.lazy(()=>BA)),In.array(In.lazy(()=>BA))]),ec=class{flags;payloads;constructor(e,r){this.flags=e,this.payloads=r}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=sB(this.flags);return Object.entries(e).forEach(([r,n])=>{typeof n=="boolean"&&Object.values(Sf).includes(r)&&(e[r]=this.isBooleanFlagEnabled(r))}),e}getFlagPayload(e){let r=this.payloads[e];if(r!==void 0){if(typeof r=="string")try{return JSON.parse(r)}catch{return r}return r}}refresh(){throw new Error("Not implemented")}},Uae=new ec({},{});var yf={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},zA=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],zae=Object.keys(yf);import{z as Ho}from"zod";var jae=Ho.object({id:Ho.string(),name:Ho.string(),createdAt:Ho.coerce.date(),createdBy:Ho.string(),updatedAt:Ho.coerce.date(),updatedBy:Ho.string().nullable(),organizationId:Ho.string()});import{z as D}from"zod";import Go from"zod";var ns=Go.object({platformSep:Go.string(),fullPathSegments:Go.string().array(),relativePathSegments:Go.string().array(),relativePath:Go.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:Go.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:Go.coerce.date(),createdAt:Go.coerce.date()});var lB=D.array(ns.extend({id:D.string(),name:D.string(),description:D.string().optional(),labels:D.string().array().optional()})),cB=ns.extend({id:D.string(),name:D.string(),description:D.string().optional(),content:ig}),uB=D.array(cB),rse=D.object({tests:lB,modules:uB,labels:D.string().array()}),nse=Td.merge(jr),HA=D.object({schemaVersion:D.string(),stepLists:Io}),GA=jr.partial().merge(Jt.pick({id:!0})),Ef={name:D.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:D.string().optional(),baseUrl:D.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:D.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:D.nativeEnum(Mn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:qu.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:D.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},jA=D.object(Ef),ose=Td.merge(D.object({relativeFilePath:D.string().describe("relative to project root")})),VA=D.object({name:D.string()}),ise=D.object({relativeFilePath:D.string()}),$A=D.object({name:D.string()}),ase=D.object({relativeFilePath:D.string()}),WA=D.object({name:D.string(),description:D.string(),enabled:D.boolean(),steps:D.lazy(()=>St.array()),testFilePath:D.string().describe("relative to the project root"),folderPath:D.string().optional().describe("user selected folder path")}),qA=D.object({name:D.string(),description:D.string(),enabled:D.boolean()}).partial();var sse=D.array(Tv),KA=D.object({defaultEnv:D.string().optional().describe("name of the default env, or undefined to unset")}),YA=D.object({configFilePath:D.string().describe("full path on disk")}),lse=D.string().array(),cse=D.object({message:D.string(),newRelativeTestPath:D.string().optional()}),bf=D.object({name:D.string(),absolutePath:D.string(),relativePath:D.string(),pathSegments:D.array(D.string()),isDirectory:D.boolean(),size:D.number(),createdAt:D.coerce.date(),modifiedAt:D.coerce.date(),accessedAt:D.coerce.date()}),XA=D.object({pathSegments:D.array(D.string())}),use=D.object({absolutePath:D.string(),pathSegments:D.array(D.string()),contents:D.array(bf)}),JA=D.object({pathSegments:D.array(D.string())}),QA=D.object({pathSegments:D.array(D.string()),newPathSegments:D.array(D.string())}),ZA=D.object({pathSegments:D.array(D.string()),recursive:D.boolean().optional()}),dse=D.object({success:D.boolean(),message:D.string(),pathSegments:D.array(D.string()).optional()}),pse=D.object({gitBranch:D.string(),fileMtime:D.coerce.date(),gitCommitSha:D.string()});var wd=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],xd=wd.map(t=>`**/${t}/**`),eR=!0,Vr=!1,tR=15e4;import Pn from"chalk";import dB from"safe-stable-stringify";import pB from"truncate-json";import mB from"zod";var Ui=dB.configure({deterministic:!1});function rR(t){let e=Ui(t),{jsonString:r}=pB(e,5e4);return r}var hB=["app","version","env","namespace","host"];function $e(t){let e=t.bindings()??{},r={};for(let n of Object.keys(e)){let o=e[n];!hB.includes(n)&&typeof o=="string"&&(r[n]=o)}return r}var Tf=mB.enum(["debug","info","warn","error"]);var tc={debug:20,info:30,warn:40,error:50},nR={20:"debug",30:"info",40:"warn",50:"error"},Bi=class t{minLogLevel;logBindings;constructor(e,r){typeof e=="string"?this.minLogLevel=tc[e]:this.minLogLevel=e,this.logBindings=r}logWithLevel(e,r,...n){try{this.logWithLevelHelper(e,r,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,r=" "){return e.split(`
|
|
21
|
+
`),loe=Ae.discriminatedUnion("type",[rU,nU,oU,iU,aU,sU]);var coe={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",ROTATE_ORIENTATION:"Rotate the device orientation.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true."};var uoe=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","ROTATE_ORIENTATION","AI_CHECK"];import lU from"zod";var Fi={type:!0,cache:!0},Xa=lU.discriminatedUnion("type",[Dl.pick(Fi),Pl.pick(Fi),Ul.pick(Fi),zl.pick(Fi),Ll.pick(Fi),Ol.pick(Fi),Il.pick(Fi)]),foe=Object.values(Ne).filter(t=>Xa.options.some(e=>e.shape.type.safeParse(t).success));var vA=fl(Xa),AA=Sl(Xa),Soe=Pu(Xa);import RA from"zod";var Kl=(n=>(n.US_WEST_1="us-west1",n.EU_NORTH_1="eu-north1",n.AS_SOUTH_1="as-south1",n))(Kl||{}),CA=(e=>(e.LOCAL="local",e))(CA||{}),wA=RA.nativeEnum(Kl).or(RA.nativeEnum(CA)),Yl=(r=>(r.ANDROID_14="14",r.ANDROID_15="15",r))(Yl||{});var lf=(e=>(e.IOS_26="26",e))(lf||{});import{cloneDeep as voe}from"lodash-es";import Roe from"truncate-json";import bt from"zod";import{z as pn}from"zod";import{z as ut}from"zod";var Jt=ut.object({id:ut.string(),name:eo,baseUrl:$u,description:ut.string().optional().nullish(),schemaVersion:ut.string(),advanced:Di,retries:ut.number(),envs:ut.array(rd).nullish(),parameters:td.nullish(),disabled:ut.boolean().optional(),labels:ut.array(ut.string()).optional().catch([])}),Poe=ut.enum(["INHERIT","ENABLED","DISABLED"]);var cU=Di.extend({failureRecovery:ut.boolean().or(ut.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED"),useMemory:ut.boolean().or(ut.string()).optional().transform(t=>typeof t=="string"?t:t===void 0?"INHERIT":t?"ENABLED":"DISABLED")});var Ooe=Jt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:cU}),Loe=Jt.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),uU=ut.object({labels:ut.array(ut.string()).optional(),outputs:xv.nullish()}),jr=Jt.merge(uU),dU=ut.object({createdAt:ut.coerce.date(),updatedAt:ut.coerce.date(),updatedBy:ut.string().nullable(),schedule:ja,notification:Va,createdBy:ut.string(),organizationId:ut.string(),folderId:ut.string().nullable().optional()}),pU=Jt.merge(dU),Noe=pU.merge(Io),Td=Jt.merge(Io),Doe=Jt.merge(_i);var mU="test",hU="module",gU="mobile-test",fU="mobile-module";var ye=(o=>(o.TEST=`momentic/${mU}`,o.MODULE=`momentic/${hU}`,o.MOBILE_TEST=`momentic/${gU}`,o.MOBILE_MODULE=`momentic/${fU}`,o))(ye||{}),Goe=Jt.merge(_i),cf=Sr.extend({steps:pn.array(pn.record(pn.string(),pn.unknown())),schemaVersion:pn.string()}),joe=cf.extend({fileType:pn.literal(ye.MODULE)}),Voe=pn.object({test:pn.string().describe("YAML for the test, including metadata and steps"),modules:pn.record(pn.string(),pn.string()).describe("Map of module name to YAML for the module")});function vd(t){if(t===void 0)return"__undefined__";if(t===null)return null;if(typeof t!="object")return t;if(Array.isArray(t))return t.map(vd);let e={};for(let[r,n]of Object.entries(t))e[r]=vd(n);return e}var uf=bt.object({parameterNames:bt.string().array(),defaultParameters:bt.record(bt.string(),bt.string()).optional(),parameterEnums:bt.record(bt.string(),bt.string().array()).optional()}),xA=bt.object({moduleId:bt.string().uuid(),name:bt.string(),description:bt.string().nullish(),parameters:uf.optional(),enabled:bt.boolean().nullish(),schemaVersion:bt.string()}),Ad=xA.omit({name:!0}),_A=Ad.extend({steps:bt.array(bt.record(bt.string(),bt.unknown()))}),SU=bt.object({fileType:bt.literal(ye.MOBILE_MODULE)}).merge(_A),yU=xA.omit({schemaVersion:!0}).extend({steps:bt.array(ro)});import Ve from"zod";import*as Ja from"zod";var Joe=Ja.custom().refine(t=>t&&t.length>0).refine(t=>t&&t[0]instanceof File,{message:"Please upload a valid file."}),df=Ja.preprocess(t=>{if(typeof t!="string")return t;let e=t.trim();return e.length===0?void 0:e},Ja.string().optional());import Xl from"zod";var Bo=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(Bo||{}),pf=Sd.extend({steps:Xl.lazy(()=>Qa.array()),description:Xl.string().optional(),name:Xl.string().describe("name of the module"),parameters:uf.optional()}),EU=Gl.merge(pf).extend({type:Xl.literal("RESOLVED_MOBILE_MODULE")}),Qa=Xl.discriminatedUnion("type",[EU,jl,Vl]);function MA(t){return Object.values(Bo).includes(t)||Object.values(un).includes(t)}var bU=Ve.object({disableMomenticAccessibilityTree:Ve.boolean().optional(),autoGrantPermissions:Ve.boolean().optional(),browserSettings:Ga.optional()}),mf=bU.extend({region:wA.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Ve.object({androidVersion:Ve.nativeEnum(Yl).optional()}).optional(),localEmulatorSettings:Ve.object({avdId:df}).optional(),geolocation:Ve.object({latitude:Ve.coerce.number().refine(t=>t>=-90&&t<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Ve.coerce.number().refine(t=>t>=-180&&t<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),waitForStability:Ve.boolean().optional().describe("wait for stability before every targeting action")}),Za=Ve.object({retries:Ve.number().optional().describe("number of retries to run"),defaultChannel:Ve.string().optional().describe("default channel to use"),defaultTag:Ve.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Ve.string().optional(),defaultApkFilePath:df.describe("APK to install when using the emulator in the local region."),emulator:mf.optional(),ai:vg.optional()}),es=Ve.object({id:Ve.string().uuid(),description:Ve.string(),schemaVersion:Ve.string(),settings:Za.optional(),disabled:Ve.boolean().optional(),labels:Ve.array(Ve.string()).optional()}),IA=Ve.object({fileType:Ve.literal(ye.MOBILE_TEST)}).merge(es),TU=es.merge(Ve.object({steps:Ve.array(ro)})),fie=IA.merge(TU),Sie=Ve.object({name:Ve.string(),steps:Ve.array(ro).optional(),settings:Za.optional()}),PA=es.extend({steps:Qa.array()});import ne from"zod";var mn=ne.object({startTime:ne.number(),endTime:ne.number().optional(),durationMs:ne.number().optional(),error:ne.string().optional(),result:ne.unknown().optional(),attributes:ne.record(ne.string(),ne.unknown())});var vU=mn.extend({type:ne.literal("SECTION"),name:ne.string(),subSpans:ne.lazy(()=>hn.array())}),AU=mn.extend({type:ne.literal("AI_LOCATOR_CALL"),result:ne.object({id:ne.number(),thoughts:ne.string()}).optional(),subSpans:ne.lazy(()=>hn.array())}),RU=mn.extend({type:ne.literal("AI_ASSERTION_CALL"),result:ne.object({thoughts:ne.string(),result:ne.boolean()}).optional(),subSpans:ne.lazy(()=>hn.array())}),CU=mn.extend({type:ne.literal("TARGET_RESOLUTION"),result:ne.object({serializedElement:ne.string()}).optional(),subSpans:ne.lazy(()=>hn.array())}),wU=mn.extend({type:ne.literal("EMULATOR_INTERACTION"),name:ne.string(),withinWebview:ne.boolean().optional(),subSpans:ne.lazy(()=>hn.array())}),xU=mn.extend({type:ne.literal("EMULATOR_READ_STATE"),name:ne.string(),subSpans:ne.lazy(()=>hn.array())}),_U=mn.extend({type:ne.literal("ELEMENT_ASSERTION"),name:ne.string(),result:ne.object({success:ne.boolean(),message:ne.string().optional()}).optional(),subSpans:ne.lazy(()=>hn.array())}),MU=mn.extend({type:ne.literal("CACHE_RESOLUTION"),subSpans:ne.lazy(()=>hn.array())}),IU=mn.extend({type:ne.literal("WAIT_FOR_SCREENSHOT_STABILITY"),subSpans:ne.lazy(()=>hn.array())}),PU=mn.extend({type:ne.literal("WAIT_FOR_PAGE_STABILITY"),subSpans:ne.lazy(()=>hn.array())}),OU=mn.extend({type:ne.literal("GENERIC"),name:ne.string(),subSpans:ne.lazy(()=>hn.array())}),hn=ne.discriminatedUnion("type",[vU,AU,RU,CU,wU,xU,_U,MU,IU,PU,OU]);import{parse as vie}from"date-fns";import{z as ts}from"zod";var Rie=ts.object({testId:ts.string(),sessionId:ts.string()}),OA=ts.object({uploadUrl:ts.string(),id:ts.string()});var Yie=new Set(Object.values(Ye));var LU={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",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",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},Xie={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],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:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},Jie={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.",CONDITIONAL:"Execute steps based on the outcome of an AI Check",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.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},Qie={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ROTATE_ORIENTATION:"Rotate orientation",ADB:"ADB command",STATE:"Debug state"},Zie={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ROTATE_ORIENTATION:"Rotate the device orientation to portrait or landscape.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen."};import NU from"semver";import{z as DU}from"zod";var nae=DU.string().refine(t=>NU.valid(t),{message:"must be a valid semver string"});import{Faker as aae,en as sae}from"@faker-js/faker";import{z as U}from"zod";var rs=55555,cae=U.object({body:U.string(),to:U.string(),from:U.string()}),uae=U.object({from:U.string().optional(),to:U.string(),timeout:U.number().optional(),beforeDate:U.string().pipe(U.coerce.date()).or(U.date()).optional(),afterDate:U.string().pipe(U.coerce.date()).or(U.date()).optional()}),dae=U.object({to:U.string().email(),from:U.string(),subject:U.string(),body:U.string(),html:U.string().optional()}),pae=U.object({inbox:U.string().transform(t=>t.toLowerCase()),afterDate:U.string().pipe(U.coerce.date()).or(U.date()).optional(),timeout:U.number().optional(),trimWhitespace:U.boolean().optional()}),mae=U.object({inbox:U.string(),limit:U.number().optional(),afterDate:U.string().pipe(U.coerce.date()).or(U.date()).optional(),trimWhitespace:U.boolean().optional()});var Rd=(r=>(r.RAW="RAW",r.RESPONSE="RESPONSE",r))(Rd||{}),LA=U.object({body:U.string().nullish(),status:U.number().optional(),headers:U.array(U.tuple([U.string(),U.string()])).optional()}),kU=U.object({url:U.string(),options:U.object({method:U.string(),body:U.string().nullish(),headers:U.array(U.tuple([U.string(),U.string()])).optional()}).optional()}).optional(),FU=U.object({body:U.string().nullish(),options:U.object({status:U.number(),statusText:U.string().optional(),headers:U.array(U.tuple([U.string(),U.string()])).optional()}).optional()}).optional(),NA=U.object({result:U.unknown(),variableUpdates:U.record(U.string(),U.unknown()).optional(),persistentVariableUpdates:U.record(U.string(),U.unknown()).optional(),error:U.string().optional(),success:U.boolean()}),hae=U.object({id:U.string().optional(),orgId:U.string(),momenticLambdaAuthHash:U.string(),code:U.string(),fragment:U.boolean(),state:U.object({env:U.record(U.string(),U.unknown()),request:kU,response:FU,additionalBindings:U.record(U.string(),U.unknown()).optional()}),timeoutMs:U.number().optional(),disallowVariableUpdates:U.boolean().optional(),responseSerialization:U.nativeEnum(Rd).optional()}),zo=15e3;import*as Qt from"zod";import{extendZodWithOpenApi as UU}from"zod-openapi";UU(Qt);var BU=Qt.object({url:Qt.string(),lineNumber:Qt.number(),columnNumber:Qt.number()}).openapi({ref:"CodeLocation"}),Cd=Qt.object({timestamp:Qt.number(),text:Qt.string(),type:Qt.string(),tabIndex:Qt.number(),args:Qt.unknown().array().optional(),url:Qt.string().optional(),location:BU.optional()}).openapi({ref:"ConsoleLog"}),DA=Cd.array(),hf=DA.array();import*as gf from"zod";import{extendZodWithOpenApi as zU}from"zod-openapi";zU(gf);var HU=gf.object({logsPerPage:Cd.array().array()}).openapi({ref:"DebugData"});var Jl=class{async getConsoleLogsForRunAttempt(e,r,n){}async getNetworkLogsForRunAttempt(e,r,n){}async getHtmlSnapshot(e,r){}async getA11yTreeSnapshot(e,r){}async getScreenshot(e,r){}async storeConsoleLogsForRunAttempt(e,r,n,o){}async storeNetworkLogsForRunAttempt(e,r,n,o){}listVideoAssetPaths(){return[]}close(){}async storeScreenshot(e,r,n){}async storeOnDemandScreenshotById(e,r,n,o){}async storeHtmlSnapshot(e,r,n){}};import{z as P}from"zod";var GU=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),jU=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),VU=P.object({onContentLoad:P.number().optional(),onLoad:P.number().optional(),comment:P.string().optional()}),Ql=P.object({startedDateTime:P.string(),id:P.string(),title:P.string().optional(),pageTimings:VU,comment:P.string().optional()}),$U=P.array(Ql),WU=P.object({name:P.string(),value:P.string(),path:P.string().optional(),domain:P.string().optional(),expires:P.string().optional(),httpOnly:P.boolean().optional(),secure:P.boolean().optional(),comment:P.string().optional()}),FA=P.array(WU),qU=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),UA=P.array(qU),KU=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),YU=P.array(KU),XU=P.object({name:P.string(),value:P.string().optional(),fileName:P.string().optional(),contentType:P.string().optional(),comment:P.string().optional()}),JU=P.array(XU),QU=P.object({mimeType:P.string(),params:JU,text:P.string(),comment:P.string().optional(),_redactedReason:P.string().optional()}),ZU=P.object({method:P.string(),url:P.string(),httpVersion:P.string().optional(),cookies:FA,headers:UA,queryString:YU,postData:QU.optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional()}),eB=P.object({size:P.number().optional(),compression:P.number().optional(),mimeType:P.string().optional(),text:P.string().optional(),encoding:P.string().optional(),comment:P.string().optional(),_redactedReason:P.string().optional()}),tB=P.object({status:P.number(),statusText:P.string(),httpVersion:P.string().optional(),cookies:FA,headers:UA,content:eB,redirectURL:P.string().optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional(),_mocked:P.boolean().optional()}),kA=P.object({expires:P.string().optional(),lastAccess:P.string(),eTag:P.string(),hitCount:P.number(),comment:P.string().optional()}),rB=P.object({beforeRequest:kA.optional(),afterRequest:kA.optional(),comment:P.string().optional()}),nB=P.object({blocked:P.number().optional(),dns:P.number().optional(),connect:P.number().optional(),send:P.number(),wait:P.number(),receive:P.number(),ssl:P.number().optional(),comment:P.string().optional()}),Zl=P.object({pageref:P.string().optional(),startedDateTime:P.string(),time:P.number().optional(),request:ZU,response:tB.optional(),cache:rB.optional(),timings:nB,serverIPAddress:P.string().optional(),connection:P.string().optional(),comment:P.string().optional(),_resourceType:P.string().optional()}),oB=P.array(Zl),iB=P.object({version:P.string().default("1.1"),creator:GU.optional(),browser:jU.optional(),pages:$U.optional(),entries:oB,comment:P.string().optional()}),aB=P.object({log:iB}),xae=P.record(P.string(),Ql),_ae=P.record(P.string(),Zl);function ff(t,e){return{log:{version:"1.2",creator:{name:"Momentic, Inc.",version:"1.0.0"},pages:Object.values(t).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime()),entries:Object.values(e).sort((r,n)=>new Date(r.startedDateTime).getTime()-new Date(n.startedDateTime).getTime())}}}import{cloneDeep as sB}from"lodash-es";import{z as In}from"zod";var Sf=(c=>(c.DisableClickhouseCaches="disable_clickhouse_caches",c.ShowZeroOpacityElements="show_zero_opacity_elements",c.VisualActions="visual_actions",c.RagV2="rag_v2",c.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",c.GlobalLocatorRedirect="global_locator_redirect",c.FakerConstantSeed="faker_constant_seed",c.AutoExpandIframes="auto_expand_iframes",c))(Sf||{});var BA=In.union([In.string(),In.number(),In.boolean(),In.null(),In.record(In.string(),In.lazy(()=>BA)),In.array(In.lazy(()=>BA))]),ec=class{flags;payloads;constructor(e,r){this.flags=e,this.payloads=r}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=sB(this.flags);return Object.entries(e).forEach(([r,n])=>{typeof n=="boolean"&&Object.values(Sf).includes(r)&&(e[r]=this.isBooleanFlagEnabled(r))}),e}getFlagPayload(e){let r=this.payloads[e];if(r!==void 0){if(typeof r=="string")try{return JSON.parse(r)}catch{return r}return r}}refresh(){throw new Error("Not implemented")}},Uae=new ec({},{});var yf={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},zA=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],zae=Object.keys(yf);import{z as Ho}from"zod";var jae=Ho.object({id:Ho.string(),name:Ho.string(),createdAt:Ho.coerce.date(),createdBy:Ho.string(),updatedAt:Ho.coerce.date(),updatedBy:Ho.string().nullable(),organizationId:Ho.string()});import{z as D}from"zod";import Go from"zod";var ns=Go.object({platformSep:Go.string(),fullPathSegments:Go.string().array(),relativePathSegments:Go.string().array(),relativePath:Go.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:Go.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:Go.coerce.date(),createdAt:Go.coerce.date()});var lB=D.array(ns.extend({id:D.string(),name:D.string(),description:D.string().optional(),labels:D.string().array().optional()})),cB=ns.extend({id:D.string(),name:D.string(),description:D.string().optional(),content:ig}),uB=D.array(cB),rse=D.object({tests:lB,modules:uB,labels:D.string().array()}),nse=Td.merge(jr),HA=D.object({schemaVersion:D.string(),stepLists:Io}),GA=jr.partial().merge(Jt.pick({id:!0})),Ef={name:D.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:D.string().optional(),baseUrl:D.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:D.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:D.nativeEnum(Mn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:qu.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:D.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},jA=D.object(Ef),ose=Td.merge(D.object({relativeFilePath:D.string().describe("relative to project root")})),VA=D.object({name:D.string()}),ise=D.object({relativeFilePath:D.string()}),$A=D.object({name:D.string()}),ase=D.object({relativeFilePath:D.string()}),WA=D.object({name:D.string(),description:D.string(),enabled:D.boolean(),steps:D.lazy(()=>St.array()),testFilePath:D.string().describe("relative to the project root"),folderPath:D.string().optional().describe("user selected folder path")}),qA=D.object({name:D.string(),description:D.string(),enabled:D.boolean()}).partial();var sse=D.array(Tv),KA=D.object({defaultEnv:D.string().optional().describe("name of the default env, or undefined to unset")}),YA=D.object({configFilePath:D.string().describe("full path on disk")}),lse=D.string().array(),cse=D.object({message:D.string(),newRelativeTestPath:D.string().optional()}),bf=D.object({name:D.string(),absolutePath:D.string(),relativePath:D.string(),pathSegments:D.array(D.string()),isDirectory:D.boolean(),size:D.number(),createdAt:D.coerce.date(),modifiedAt:D.coerce.date(),accessedAt:D.coerce.date()}),XA=D.object({pathSegments:D.array(D.string())}),use=D.object({absolutePath:D.string(),pathSegments:D.array(D.string()),contents:D.array(bf)}),JA=D.object({pathSegments:D.array(D.string())}),QA=D.object({pathSegments:D.array(D.string()),newPathSegments:D.array(D.string())}),ZA=D.object({pathSegments:D.array(D.string()),recursive:D.boolean().optional()}),dse=D.object({success:D.boolean(),message:D.string(),pathSegments:D.array(D.string()).optional()}),pse=D.object({gitBranch:D.string(),fileMtime:D.coerce.date(),gitCommitSha:D.string()});var wd=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],xd=wd.map(t=>`**/${t}/**`),eR=!0,Vr=!1,tR=15e4;import Pn from"chalk";import dB from"safe-stable-stringify";import pB from"truncate-json";import mB from"zod";var Ui=dB.configure({deterministic:!1});function rR(t){let e=Ui(t),{jsonString:r}=pB(e,5e4);return r}var hB=["app","version","env","namespace","host"];function $e(t){let e=t.bindings()??{},r={};for(let n of Object.keys(e)){let o=e[n];!hB.includes(n)&&typeof o=="string"&&(r[n]=o)}return r}var Tf=mB.enum(["debug","info","warn","error"]);var tc={debug:20,info:30,warn:40,error:50},nR={20:"debug",30:"info",40:"warn",50:"error"},Bi=class t{minLogLevel;logBindings;constructor(e,r){typeof e=="string"?this.minLogLevel=tc[e]:this.minLogLevel=e,this.logBindings=r}logWithLevel(e,r,...n){try{this.logWithLevelHelper(e,r,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,r=" "){return e.split(`
|
|
22
22
|
`).map((n,o)=>o>0?`${r}${n}`:n).join(`
|
|
23
23
|
`)}logWithLevelHelper(e,r,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(r(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(r(` ${s}:`,l)),console.log(r(" stack:",c.stack));let d=Object.entries(c).filter(([p])=>p!=="message"&&p!=="stack");for(let[p,m]of d){if(m instanceof Error){console.log(r(` ${s}.${p}:`,m.message)),m.stack&&console.log(r(` ${s}.${p}.stack:`,m.stack));continue}if(typeof m=="object"&&m!==null){let h=this.indentMultiline(Ui(m,void 0,2)," ");console.log(r(` ${s}.${p}:`,h));continue}console.log(r(` ${s}.${p}:`,m))}}else typeof c=="object"?(l=Ui(c,void 0,2),l=this.indentMultiline(l),console.log(r(` ${s}:`,l))):console.log(r(` ${s}:`,l))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=Ui(a,void 0,2),s=s.split(`
|
|
24
24
|
`).map((c,l)=>l>0?` ${c}`:c).join(`
|
|
25
|
-
`)),console.log(" ",r(s))}}setMinLevel(e){typeof e=="string"?this.minLogLevel=tc[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Pn.reset,...e)}info(...e){this.logWithLevel(30,Pn.white,...e)}debug(...e){this.logWithLevel(20,Pn.dim,...e)}warn(...e){this.logWithLevel(40,Pn.yellow,...e)}error(...e){this.logWithLevel(50,Pn.red,...e)}success(...e){this.logWithLevel(1/0,Pn.green,...e)}dimmed(...e){this.logWithLevel(30,Pn.dim,...e)}underline(...e){this.logWithLevel(40,Pn.underline,...e)}bold(...e){this.logWithLevel(40,Pn.bold,...e)}grey(...e){this.logWithLevel(20,Pn.grey,...e)}child(e){return new t(this.minLogLevel,{...this.logBindings,...e})}async flush(){}bindings(){return this.logBindings}},vf=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}async flush(){}bindings(){return{}}},bse=new vf,gB=typeof window>"u"&&typeof process<"u"&&Tf.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?Tf.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,b=new Bi(gB,{}),On={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>On,flush:async()=>{},bindings:()=>({})},_d={},Md=({logger:t,logKey:e,maxCount:r,intervalMs:n},o,i,...a)=>{let s=_d[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},_d[e]=s),s.totalCount++,s.count<r&&(s.count++,t.debug(o,i,...a)),s.timer=setTimeout(()=>{let c=_d[e];c?.totalCount!==c?.count&&t.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete _d[e]},n)};import{z as Q}from"zod";var fB=Q.array(ns.extend({id:Q.string(),name:Q.string(),description:Q.string().optional(),labels:Q.string().array().optional()})),SB=Q.array(ns.extend({id:Q.string(),name:Q.string(),description:Q.string().optional(),content:pf})),wse=Q.object({name:Q.string(),description:Q.string().optional(),settings:Za.optional(),pathSegments:Q.string().array(),defaultEnv:Q.string().optional()}),xse=Q.object({id:Q.string(),fileName:Q.string(),fullPath:Q.string(),relativeFilePath:Q.string().describe("relative to project root")}),_se=PA.extend({name:Q.string()}),Mse=Q.object({steps:Qa.array().optional(),settings:Za.optional(),labels:Q.array(Q.string()).optional()}),Ise=Q.object({message:Q.literal("ok")}),Pse=Q.object({name:eo.optional(),description:Q.string().min(1).optional(),settings:Za.optional(),disabled:Q.boolean().optional(),labels:Q.array(Q.string()).optional()}),Ose=Q.object({message:Q.string(),newRelativeTestPath:Q.string().optional()}),Lse=Q.object({tag:Q.string(),channel:Q.string(),filePath:Q.string()}),Nse=Q.object({name:eo}),Dse=Q.object({tests:fB,modules:SB,labels:Q.string().array()}),kse=Q.object({name:Q.string(),description:Q.string(),enabled:Q.boolean()}).partial(),Fse=Q.object({name:Q.string(),description:Q.string(),enabled:Q.boolean(),steps:Qa.array(),testFilePath:Q.string().describe("relative to the project root"),folderPath:Q.string().optional().describe("user selected folder path")}),Use=Q.object({packages:Q.string().array()}),Bse=Q.object({name:Q.string()}),zse=Q.object({relativeFilePath:Q.string()});import{z as Tt}from"zod";var oR=Tt.object({id:Tt.string(),createdAt:Tt.coerce.date(),createdBy:Tt.string(),organizationId:Tt.string(),name:Tt.string(),description:Tt.string().nullish(),enabled:Tt.boolean(),schemaVersion:Tt.string().describe("Schema version for steps"),parameters:Tt.string().array().nullish().describe("Parameter list"),parameterEnums:Tt.record(Tt.string(),Tt.string().array()).nullish(),defaultParameters:Tt.record(Tt.string(),Tt.string()).nullish(),defaultCacheKey:Tt.string().nullish(),defaultCacheTtl:Tt.number().nullish(),defaultCacheAllInvocations:Tt.boolean().nullish(),autoAuth:Tt.boolean().nullish(),advanced:rg.nullish()}),Yse=oR.extend({steps:Tt.lazy(()=>rt.array())}),iR=5*60*1e3,Af=Sr.merge(oR.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as Qse}from"date-fns-tz";import{z as Ye}from"zod";var Rf=Tg.extend({aiAction:Ye.boolean().optional(),stepLintSuggestions:Ye.boolean().optional(),agentConfig:Ye.record(Ye.string(),Ye.string()).optional(),aiFailureAnalysis:Ye.boolean().optional(),aiPageFiltering:Ye.boolean().optional().describe("rag v2 feature flag")}),yB=Ye.object({cliOnly:Ye.boolean().optional()}),Cf=Ye.object({fakerConstantSeed:Ye.boolean().optional()}),aR=Ye.object({ai:Rf.optional(),githubAppInstallationId:Ye.number().nullish(),githubAppSummaryMessageEnabled:Ye.boolean().nullish(),githubReleaseAppInstallationId:Ye.number().nullish(),gitlabAppAccessToken:Ye.string().nullish(),gitlabAppBaseUrl:Ye.string().nullish(),qaseAccessToken:Ye.string().nullish(),testSuggestionsEnabled:Ye.boolean().nullish(),browser:fg.optional(),internal:yB.optional(),advanced:Cf.optional()}),ole=Ye.object({globalOverrides:Ye.record(Ye.string()).optional(),agentConfig:Ye.record(Ye.string(),Ye.string()).optional()}),ile=Ye.record(Ye.string(),Ye.string()).nullish();import*as A from"zod";import{z as yt}from"zod";var wf=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(wf||{});var EB=yt.object({type:yt.literal("DESCRIPTION_UPDATE"),thoughts:yt.string()}),Id=yt.discriminatedUnion("type",[EB]),bB=yt.object({testId:yt.string(),name:yt.string(),orgId:yt.string(),runId:yt.string(),steps:St.array(),purpose:yt.nativeEnum(wf),details:Id.or(Id.array()).optional()});var cle=bB.pick({name:!0,orgId:!0}),TB=yt.object({id:yt.string(),name:yt.string().nullish(),createdAt:yt.string().pipe(yt.coerce.date()).or(yt.date()),organizationId:yt.string(),schemaVersion:yt.string(),runId:yt.string().nullish(),purpose:yt.nativeEnum(wf),details:Id.or(Id.array()).optional(),applied:yt.boolean().nullish(),appliedAt:yt.coerce.date().nullish()}),sR=TB.extend({steps:St.array()});var Pd="x-momentic-cli-version",lR="x-momentic-client-mode",cR="x-momentic-cli-type",uR="x-momentic-logger-tags",vB="x-momentic-main-branch-name",AB="x-momentic-branch-name",RB="x-momentic-commit-timestamp",CB="x-momentic-last-commit-on-main",wB="x-momentic-last-commit-on-main-timestamp",xB="x-momentic-merged-branch-name",dR="x-momentic-session-id",_le=A.object({error:A.boolean(),reason:A.string(),message:A.string()}),Mle=wt.merge(wg),pR=Iu,Ile=wt.merge(wg);var Ple=wt.merge(zv).extend({useConsensus:A.boolean().optional(),attemptNumber:A.number().optional()}),xf=Cb,Ole=wt.merge(Gv),mR=iv,Lle=wt.merge(jv),hR=av,Nle=wt.merge(Vv),gR=sv,Dle=wt.merge(Hv),fR=ov,kle=wt.merge(Fv),SR=nv,Fle=wt.merge(Uv),yR=tv,Ule=wt.merge(Bv);var Ble=wt.merge(Kv),zle=wt.merge(Yv),Hle=A.object({testPaths:A.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:A.string().optional(),all:A.boolean().optional(),urlOverride:A.string().optional(),customHeaders:A.record(A.string(),A.string()).optional(),testInputMatrix:A.record(A.string(),A.string()).array().optional()}),ER=A.object({queuedTests:A.unknown().array(),runIds:A.string().uuid().array(),runGroupId:A.string().optional()});var Gle=A.string().array(),jle=A.union([A.object({paths:A.string().array().describe("run specific test paths (e.g. todo-test)"),all:A.boolean().describe("run all tests").optional()}),A.object({path:A.string().describe("deprecated; present for backcompat")})]),bR=A.object({tests:A.record(A.string().describe("Test name"),A.string().describe("Test YAML")),modules:A.record(A.string().describe("Module name"),A.string().describe("Module YAML"))}),_B=A.object({test:A.string().describe("test YAML"),modules:A.record(A.string().describe("moduleId"),A.string().describe("module YAML"))}),Vle=_B.array(),$le=A.object({testId:A.string(),schemaVersion:A.string()}).merge(_i);function _f(t){let{gitMainBranch:e,gitBranchName:r,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=t,a={};return e&&(a[vB]=encodeURIComponent(e)),r&&(a[AB]=encodeURIComponent(r)),n&&(a[RB]=n.toISOString()),o&&(a[CB]=encodeURIComponent(o)),i&&(a[wB]=i.toISOString()),t.mergedGitBranchName&&(a[xB]=encodeURIComponent(t.mergedGitBranchName)),a}var Wle=A.object({entries:A.array(eT),testId:A.string()}),qle=A.object({entries:A.array(vA),testId:A.string()}),Kle=A.object({testId:A.string()});function TR(t){return A.record(A.unknown()).transform(e=>{let r={};for(let[n,o]of Object.entries(e)){let i=t.safeParse(o);i.success&&(r[n]=i.data)}return r})}var vR=TR(tT),AR=TR(AA),RR=A.object({trigger:A.nativeEnum(Br),status:A.nativeEnum(Ie),startedAt:A.coerce.date().optional(),gitCommitSha:A.string().optional(),gitCommitShaShort:A.string().optional(),gitCommitTimestamp:A.coerce.date().optional(),gitBranchName:A.string().optional(),gitOriginUrl:A.string().optional(),gitCommitMessage:A.string().optional(),gitCommitAuthorName:A.string().optional(),githubRepository:A.string().optional(),gitlabProjectPath:A.string().optional(),pipelineId:A.string().optional(),cliVersion:A.string().optional()}),Yle=A.object({id:A.string()}),CR=A.object({status:A.nativeEnum(Ie),updatedAt:A.coerce.date().optional(),finishedAt:A.coerce.date().optional()}),wR=A.object({stepsSnapshot:A.array(A.record(A.unknown())).optional(),runGroupId:A.string().optional(),testId:A.string(),testName:A.string(),resolvedBaseUrl:A.string().optional(),environmentName:A.string().optional(),labels:A.array(A.string()).optional(),cliVersion:A.string().optional(),trigger:A.nativeEnum(Br),schemaVersion:A.string().optional(),section:A.nativeEnum(nd).optional(),resolvedInputs:A.record(A.string(),A.string()).optional(),quarantined:A.boolean().optional().default(!1),quarantinedReason:A.string().optional()}),Xle=A.object({id:A.string()}),MB=Ag.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),xR=MB.array(),_R=Ag.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),Jle=A.object({id:A.string()}),MR=A.object({status:A.nativeEnum(Ie),finishedAt:A.coerce.date().optional(),schemaVersion:A.string().optional().default("1.0.19"),results:A.record(A.string(),A.unknown()).array().optional(),beforeResults:A.record(A.string(),A.unknown()).array().optional(),afterResults:A.record(A.string(),A.unknown()).array().optional()}),Qle=A.object({screenshot:A.string(),contentType:A.enum(["image/jpeg","image/png"]).optional()}),Zle=A.object({id:A.string(),screenshot:A.string(),contentType:A.enum(["image/jpeg","image/png"])}),IR=A.object({key:A.string()}),PR=A.object({orgId:A.string(),userId:A.string()}),OR=A.array(bv),ece=A.record(A.string(),A.union([A.string(),A.boolean()])),tce=A.object({paths:A.string().array(),env:A.string().optional(),urlOverride:A.string().optional(),customHeaders:A.record(A.string(),A.string()).optional()}),LR=A.object({suiteRunIds:A.string().array(),runGroupIds:A.string().array()}),rce=A.object({suiteRunIds:A.string().array()}),nce=Lv.array(),oce=A.object({runGroupIds:A.string().array()}),IB=A.object({uploadUrl:A.string()}),ice=wt.merge($v),ace=wt.merge(qv),sce=wt.merge(Wv),PB=A.object({testId:A.string().optional().default(""),testName:A.string().optional().default(""),suiteId:A.string().optional().default(""),suiteName:A.string().optional().default(""),creditsUsed:A.number().optional()}),OB=A.object({transactionId:A.string(),timestamp:A.string(),event:A.nativeEnum(ql),properties:PB}),lce=OB.array(),NR=sR.omit({steps:!0}).extend({steps:A.array(A.record(A.string(),A.unknown())).describe("unparsed ResolvedStep[]")}),cce=A.object({limit:A.number().max(10).optional(),afterTime:A.number().optional()}),DR=_v.array(),uce=A.object({applied:A.boolean().optional(),appliedAt:A.coerce.date().optional()}),kR=IB.extend({id:A.string()}),dce=A.object({runGroupId:A.string().uuid().optional()}),FR=A.object({runGroupId:A.string().uuid()}),UR=A.object({quarantined:A.object({testId:A.string().uuid(),quarantinedAt:A.coerce.date(),quarantinedBy:A.string().optional(),quarantinedReason:A.string()}).array()}),pce=A.object({testId:A.string().uuid(),testName:A.string().optional(),reason:A.string(),gitLocalUsername:A.string().optional(),gitLocalEmail:A.string().optional(),gitLocalName:A.string().optional()}),mce=A.object({testName:A.string().optional(),reason:A.string().optional(),gitLocalUsername:A.string().optional(),gitLocalEmail:A.string().optional(),gitLocalName:A.string().optional()}),hce=wt.merge(uA),gce=wt.merge(dA),fce=wt.merge(pA),Sce=A.object({apkToInstall:A.object({channel:A.string(),tag:A.string().optional()}).optional(),hostname:A.string().optional(),region:A.nativeEnum(Kl).optional(),osVersion:A.nativeEnum(Yl).optional(),sessionId:A.string().optional()}),BR=A.object({name:A.string(),webRtcUrl:A.string(),adbUrl:A.string(),token:A.string(),apkDownloadUrl:A.string().optional(),playwrightServerUrl:A.string().optional(),region:A.string().optional()}),yce=A.object({hostname:A.string().optional(),region:A.nativeEnum(Kl).optional(),osVersion:A.nativeEnum(lf).optional(),sessionId:A.string().optional()}),zR=A.object({id:A.string(),apiUrl:A.string(),webRtcUrl:A.string(),wdaUrl:A.string(),token:A.string(),region:A.string().optional()}),Ece=A.object({channel:A.string(),tag:A.string(),md5:A.string()}),HR=A.object({id:A.string(),uploadUrl:A.string().optional(),downloadUrl:A.string(),md5:A.string().optional()}),GR=A.object({assets:A.array(A.object({channel:A.string(),tag:A.string(),md5:A.string(),createdAt:A.number().describe("Unix timestamp in milliseconds")}))}),jR=A.object({downloadUrl:A.string()});import{z as ae}from"zod";var VR=7,LB=3,vce=ae.object({localTestId:ae.string(),quarantinedAt:ae.date(),quarantinedBy:ae.string().optional(),quarantinedReason:ae.string(),quarantinedByGitEmail:ae.string().optional(),quarantinedByGitName:ae.string().optional(),quarantinedByGitUsername:ae.string().optional()}).or(ae.object({cloudTestId:ae.string(),quarantinedAt:ae.date(),quarantinedBy:ae.string().optional(),quarantinedReason:ae.string(),quarantinedByGitEmail:ae.string().optional(),quarantinedByGitName:ae.string().optional(),quarantinedByGitUsername:ae.string().optional()})),$R=(r=>(r.QUARANTINE="QUARANTINE",r.UNQUARANTINE="UNQUARANTINE",r))($R||{});var Mf=ae.object({name:ae.string(),description:ae.string().nullish(),effect:ae.nativeEnum($R),labels:ae.array(ae.string()).nullish(),githubRepository:ae.string().nullish(),gitlabProjectPath:ae.string().nullish(),gitBranchName:ae.string().nullish(),slackNotificationChannel:ae.string().nullish()}),NB=ae.object({type:ae.literal("LAST_N_RUNS"),lastN:ae.number().min(LB)}),DB=ae.object({type:ae.literal("LAST_N_HOURS"),lastN:ae.number().min(1).max(VR*24)}),kB=ae.object({type:ae.literal("LAST_N_DAYS"),lastN:ae.number().min(1).max(VR)}),If=ae.discriminatedUnion("type",[NB,DB,kB]),FB=ae.object({flakeRateThreshold:ae.number().min(1).max(100),evaluationWindow:If}),UB=Mf.extend({type:ae.literal("FLAKE_RATE"),config:FB}),BB=ae.object({passRateThreshold:ae.number().min(1).max(100),evaluationWindow:If}),zB=Mf.extend({type:ae.literal("PASS_RATE"),config:BB}),HB=ae.object({failureCountThreshold:ae.number().min(0),evaluationWindow:If}),GB=Mf.extend({type:ae.literal("FAILURE_COUNT"),config:HB}),Ace=ae.discriminatedUnion("type",[UB,zB,GB]);import{z as vt}from"zod";var wce=vt.object({repositoriesIndexed:vt.boolean(),indexingInProgress:vt.boolean(),indexesOutdated:vt.boolean()}),WR=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(WR||{}),qR=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(qR||{}),xce=vt.object({name:vt.string(),status:vt.nativeEnum(WR),conclusion:vt.nativeEnum(qR).nullable()}),rc=vt.object({sha:vt.string(),message:vt.string(),author:vt.object({name:vt.string().optional(),email:vt.string().optional(),date:vt.coerce.date().optional()}),committer:vt.object({name:vt.string().optional(),email:vt.string().optional(),date:vt.coerce.date().optional()})}),Pf=vt.object({mergedBranch:vt.string().optional()});import{z as dt}from"zod";var KR=dt.object({orgId:dt.string(),cacheKeys:dt.string().array()}),Ice=dt.object({keyParams:KR,clientMetadata:dt.string(),lockAcquisitionTimeoutMs:dt.number().optional()}),YR=dt.object({acquired:dt.boolean(),acquiredByMetadata:dt.string(),keyPrefix:dt.string()}),Pce=dt.object({keyPrefix:dt.string(),result:dt.string(),ttlMs:dt.number()}),Oce=dt.union([dt.object({keyPrefix:dt.string()}),KR]),jB=dt.object({remainingTtlMs:dt.number(),value:dt.string().nullish()}),Lce=dt.object({results:dt.record(dt.string(),jB),activeLocks:dt.string().array()}),XR=0,JR=5*60*1e3;var Fce=90*24*60*60*1e3,Uce=7*24*60*60*1e3;import{z as QR}from"zod";var Hce=QR.object({quarantineNotifications:QR.string().nullish()});function os(t){if(t.startsWith("https://api"))return t.replace("https://api","https://app");if(t.startsWith("http://localhost:8000"))return t.replace("http://localhost:8000","http://localhost:3000");throw new Error(`Unknown Momentic app server URL pattern: ${t}`)}import{z as Ut}from"zod";var VB=Ut.object({version:Ut.string(),json:Ut.record(Ut.unknown()),hash:Ut.string()}),ZR=Ut.record(Ut.unknown()),$ce=Ut.object({newSvgs:Ut.array(VB),metadata:ZR.optional()}),$B=Ut.object({version:Ut.string(),json:Ut.record(Ut.unknown()).nullish(),hash:Ut.string(),description:Ut.string().nullish(),metadata:ZR.nullish()}),eC=Ut.record(Ut.string().describe("icon hash"),$B);import{z as gt}from"zod";var Of=gt.object({assertion:gt.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),WB=gt.object({instruction:gt.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Of.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),tC=WB.extend({subSteps:gt.lazy(()=>tC.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),rC=gt.object({name:gt.string().describe("Short name describing the test plan"),description:gt.string().nullish().transform(t=>t??void 0).describe("Longer form description of the high level goal of the test plan")}),nC=rC.extend({id:gt.string(),createdAt:gt.coerce.date(),updatedAt:gt.coerce.date(),updatedBy:gt.string(),createdBy:gt.string(),test:gt.object({id:gt.string(),name:gt.string()}).nullish().transform(t=>t??void 0)}),Yce=nC.extend({testGenRuns:gt.tuple([]).or(gt.tuple([gt.object({id:gt.string(),startedAt:gt.coerce.date(),status:gt.nativeEnum(Ie)})]))}),oC=gt.object({preConditions:Of.array().nullish().transform(t=>t??[]),postConditions:Of.array().nullish().transform(t=>t??[]),steps:tC.array().nullish().transform(t=>t??[])}),Xce=nC.extend({plan:oC.nullish().transform(t=>t??{preConditions:[],postConditions:[],steps:[]})}),qB=rC.extend({plan:oC.nullish().transform(t=>t??{preConditions:[],postConditions:[],steps:[]})}),Jce=qB.array().nullish().transform(t=>t??[]);import{validator as KB}from"@exodus/schemasafe";function iC(t){let e;try{e=JSON.parse(t)}catch(r){return`The schema is not valid JSON. ${r}`}try{KB(e)}catch(r){return`The schema is not a valid JSON schema. ${r}`}}var aC=t=>{t.extraHeaders&&(t.extraHeaders=Object.fromEntries(Object.entries(t.extraHeaders).filter(([e,r])=>e.trim()&&r.trim())))};import{z as hue}from"zod";var Od=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};var Nf="browser-crash-dump.zip",Lf=class{loggerBindings;getParentStepIdChain(){return[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}recordStepDuration(){}async finish(){}async startSubSteps(){return new nc}},nc=class{getParentStepIdChain(){return[]}async getScreenshot(){}async getHtmlSnapshot(){}async startStep(){return new Lf}};import{z as Df}from"zod";var Rue=Df.object({parentStepIdChain:Df.array(Df.string()),result:dn});import{z as Z}from"zod";var ur="assets",YB=Z.object({step:St,status:Z.nativeEnum(Ge),startedAt:Z.coerce.date(),finishedAt:Z.coerce.date().optional(),healMetadata:Z.object({healType:Z.nativeEnum(Rl).or(Z.literal("AI")),healedAt:Z.coerce.date()}).optional(),beforeSnapshotId:Z.string().uuid().optional(),afterSnapshotId:Z.string().uuid().optional(),message:Z.string().optional()}),XB=YB.extend({finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),Lue=XB.extend({step:Z.unknown()}),kf=Z.object({avdId:Z.string().optional(),channel:Z.string().optional(),tag:Z.string().optional()}),sC="1.0.0",Ff=MR.extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),runAttemptSchemaVersion:Z.string().optional(),schemaVersion:Z.string().optional().default("1.0.19"),results:Z.record(Z.string(),Z.unknown()).array().optional(),beforeResults:Z.record(Z.string(),Z.unknown()).array().optional(),afterResults:Z.record(Z.string(),Z.unknown()).array().optional(),assetDetails:kf.optional(),activeVideos:Z.array(Z.object({videoName:Z.string(),timestamp:Z.coerce.date()})).optional()}),lC=Ff.extend({assetDetails:kf.optional(),finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),Nue=Ff.merge(wl),Due=lC.merge(wl),cC=Z.object({results:Z.array(dn),beforeResults:Z.array(dn).optional(),afterResults:Z.array(dn).optional()}),kue=Ff.merge(cC),Fue=lC.merge(cC),uC=_R.merge(wR).extend({executionType:Z.nativeEnum(Ha).optional().default("WEB"),testId:Z.string().uuid(),testDescription:Z.string().optional(),runGroupId:Z.string().uuid(),status:Z.nativeEnum(Ie),startedAt:Z.coerce.date(),attempts:Z.number(),failureRecoveryDetails:Z.object({attempts:Z.number()}).optional()}),JB=uC.merge(kf),Uue=uC.extend({finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),Bue=JB.extend({finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),QB=RR.merge(CR).extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),cliVersion:Z.string(),labels:Z.string().array().optional().default([])}),Ld=QB.extend({updatedAt:Z.coerce.date().optional().transform(t=>t??new Date),finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)});function dC(t){try{return ZB(t)&&ez(t).isDirectory()}catch(e){return b.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as tz,input as rz}from"@inquirer/prompts";import{existsSync as nz,mkdirSync as oz,statSync as iz}from"fs";var zi=!!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;import{dirname as az}from"path";var sz=!1,mC=(()=>{try{return iz("/.dockerenv"),!0}catch{return!1}})();async function Bt(t){return zi||sz||mC?!0:(await b.flush(),await new Promise(r=>setTimeout(r,100)),await tz({message:t}))}async function Uf(t){let e=az(t);return dC(e)?nz(t)?Bt(`File '${pC(t)}' already exists. Overwrite existing content?`):!0:await Bt(`Directory '${pC(e)}' doesn't exist. Create it now?`)?(oz(e,{recursive:!0}),!0):!1}function pC(t){return t.replace(/(\s+)/g,"\\$1")}async function hC(t,e){return zi||mC?e:(await rz({message:t,default:e})).trim()||e}import Ln,{supportsColor as yz}from"chalk";import{Console as gC}from"console";import{format as oc}from"util";var Bf=class extends Error{constructor(e,r,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,r),Error.stackTraceLimit=o}},Nd=class t extends gC{_buffer=[];_groupDepth=0;Console=gC;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new Bf(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
25
|
+
`)),console.log(" ",r(s))}}setMinLevel(e){typeof e=="string"?this.minLogLevel=tc[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Pn.reset,...e)}info(...e){this.logWithLevel(30,Pn.white,...e)}debug(...e){this.logWithLevel(20,Pn.dim,...e)}warn(...e){this.logWithLevel(40,Pn.yellow,...e)}error(...e){this.logWithLevel(50,Pn.red,...e)}success(...e){this.logWithLevel(1/0,Pn.green,...e)}dimmed(...e){this.logWithLevel(30,Pn.dim,...e)}underline(...e){this.logWithLevel(40,Pn.underline,...e)}bold(...e){this.logWithLevel(40,Pn.bold,...e)}grey(...e){this.logWithLevel(20,Pn.grey,...e)}child(e){return new t(this.minLogLevel,{...this.logBindings,...e})}async flush(){}bindings(){return this.logBindings}},vf=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}async flush(){}bindings(){return{}}},bse=new vf,gB=typeof window>"u"&&typeof process<"u"&&Tf.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?Tf.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,b=new Bi(gB,{}),On={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>On,flush:async()=>{},bindings:()=>({})},_d={},Md=({logger:t,logKey:e,maxCount:r,intervalMs:n},o,i,...a)=>{let s=_d[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},_d[e]=s),s.totalCount++,s.count<r&&(s.count++,t.debug(o,i,...a)),s.timer=setTimeout(()=>{let c=_d[e];c?.totalCount!==c?.count&&t.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete _d[e]},n)};import{z as Q}from"zod";var fB=Q.array(ns.extend({id:Q.string(),name:Q.string(),description:Q.string().optional(),labels:Q.string().array().optional()})),SB=Q.array(ns.extend({id:Q.string(),name:Q.string(),description:Q.string().optional(),content:pf})),wse=Q.object({name:Q.string(),description:Q.string().optional(),settings:Za.optional(),pathSegments:Q.string().array(),defaultEnv:Q.string().optional()}),xse=Q.object({id:Q.string(),fileName:Q.string(),fullPath:Q.string(),relativeFilePath:Q.string().describe("relative to project root")}),_se=PA.extend({name:Q.string()}),Mse=Q.object({steps:Qa.array().optional(),settings:Za.optional(),labels:Q.array(Q.string()).optional()}),Ise=Q.object({message:Q.literal("ok")}),Pse=Q.object({name:eo.optional(),description:Q.string().min(1).optional(),settings:Za.optional(),disabled:Q.boolean().optional(),labels:Q.array(Q.string()).optional()}),Ose=Q.object({message:Q.string(),newRelativeTestPath:Q.string().optional()}),Lse=Q.object({tag:Q.string(),channel:Q.string(),filePath:Q.string()}),Nse=Q.object({name:eo}),Dse=Q.object({tests:fB,modules:SB,labels:Q.string().array()}),kse=Q.object({name:Q.string(),description:Q.string(),enabled:Q.boolean()}).partial(),Fse=Q.object({name:Q.string(),description:Q.string(),enabled:Q.boolean(),steps:Qa.array(),testFilePath:Q.string().describe("relative to the project root"),folderPath:Q.string().optional().describe("user selected folder path")}),Use=Q.object({packages:Q.string().array()}),Bse=Q.object({name:Q.string()}),zse=Q.object({relativeFilePath:Q.string()});import{z as Tt}from"zod";var oR=Tt.object({id:Tt.string(),createdAt:Tt.coerce.date(),createdBy:Tt.string(),organizationId:Tt.string(),name:Tt.string(),description:Tt.string().nullish(),enabled:Tt.boolean(),schemaVersion:Tt.string().describe("Schema version for steps"),parameters:Tt.string().array().nullish().describe("Parameter list"),parameterEnums:Tt.record(Tt.string(),Tt.string().array()).nullish(),defaultParameters:Tt.record(Tt.string(),Tt.string()).nullish(),defaultCacheKey:Tt.string().nullish(),defaultCacheTtl:Tt.number().nullish(),defaultCacheAllInvocations:Tt.boolean().nullish(),autoAuth:Tt.boolean().nullish(),advanced:rg.nullish()}),Yse=oR.extend({steps:Tt.lazy(()=>rt.array())}),iR=5*60*1e3,Af=Sr.merge(oR.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as Qse}from"date-fns-tz";import{z as We}from"zod";var Rf=Tg.extend({aiAction:We.boolean().optional(),stepLintSuggestions:We.boolean().optional(),agentConfig:We.record(We.string(),We.string()).optional(),aiFailureAnalysis:We.boolean().optional(),aiPageFiltering:We.boolean().optional().describe("rag v2 feature flag")}),yB=We.object({cliOnly:We.boolean().optional(),neverShowUsageBanner:We.boolean().optional()}),Cf=We.object({fakerConstantSeed:We.boolean().optional()}),aR=We.object({ai:Rf.optional(),githubAppInstallationId:We.number().nullish(),githubAppSummaryMessageEnabled:We.boolean().nullish(),githubReleaseAppInstallationId:We.number().nullish(),gitlabAppAccessToken:We.string().nullish(),gitlabAppBaseUrl:We.string().nullish(),qaseAccessToken:We.string().nullish(),testSuggestionsEnabled:We.boolean().nullish(),browser:fg.optional(),internal:yB.optional(),advanced:Cf.optional()}),ole=We.object({globalOverrides:We.record(We.string()).optional(),agentConfig:We.record(We.string(),We.string()).optional()}),ile=We.record(We.string(),We.string()).nullish();import*as A from"zod";import{z as yt}from"zod";var wf=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(wf||{});var EB=yt.object({type:yt.literal("DESCRIPTION_UPDATE"),thoughts:yt.string()}),Id=yt.discriminatedUnion("type",[EB]),bB=yt.object({testId:yt.string(),name:yt.string(),orgId:yt.string(),runId:yt.string(),steps:St.array(),purpose:yt.nativeEnum(wf),details:Id.or(Id.array()).optional()});var cle=bB.pick({name:!0,orgId:!0}),TB=yt.object({id:yt.string(),name:yt.string().nullish(),createdAt:yt.string().pipe(yt.coerce.date()).or(yt.date()),organizationId:yt.string(),schemaVersion:yt.string(),runId:yt.string().nullish(),purpose:yt.nativeEnum(wf),details:Id.or(Id.array()).optional(),applied:yt.boolean().nullish(),appliedAt:yt.coerce.date().nullish()}),sR=TB.extend({steps:St.array()});var Pd="x-momentic-cli-version",lR="x-momentic-client-mode",cR="x-momentic-cli-type",uR="x-momentic-logger-tags",vB="x-momentic-main-branch-name",AB="x-momentic-branch-name",RB="x-momentic-commit-timestamp",CB="x-momentic-last-commit-on-main",wB="x-momentic-last-commit-on-main-timestamp",xB="x-momentic-merged-branch-name",dR="x-momentic-session-id",_le=A.object({error:A.boolean(),reason:A.string(),message:A.string()}),Mle=wt.merge(wg),pR=Iu,Ile=wt.merge(wg);var Ple=wt.merge(zv).extend({useConsensus:A.boolean().optional(),attemptNumber:A.number().optional()}),xf=Cb,Ole=wt.merge(Gv),mR=iv,Lle=wt.merge(jv),hR=av,Nle=wt.merge(Vv),gR=sv,Dle=wt.merge(Hv),fR=ov,kle=wt.merge(Fv),SR=nv,Fle=wt.merge(Uv),yR=tv,Ule=wt.merge(Bv);var Ble=wt.merge(Kv),zle=wt.merge(Yv),Hle=A.object({testPaths:A.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:A.string().optional(),all:A.boolean().optional(),urlOverride:A.string().optional(),customHeaders:A.record(A.string(),A.string()).optional(),testInputMatrix:A.record(A.string(),A.string()).array().optional()}),ER=A.object({queuedTests:A.unknown().array(),runIds:A.string().uuid().array(),runGroupId:A.string().optional()});var Gle=A.string().array(),jle=A.union([A.object({paths:A.string().array().describe("run specific test paths (e.g. todo-test)"),all:A.boolean().describe("run all tests").optional()}),A.object({path:A.string().describe("deprecated; present for backcompat")})]),bR=A.object({tests:A.record(A.string().describe("Test name"),A.string().describe("Test YAML")),modules:A.record(A.string().describe("Module name"),A.string().describe("Module YAML"))}),_B=A.object({test:A.string().describe("test YAML"),modules:A.record(A.string().describe("moduleId"),A.string().describe("module YAML"))}),Vle=_B.array(),$le=A.object({testId:A.string(),schemaVersion:A.string()}).merge(_i);function _f(t){let{gitMainBranch:e,gitBranchName:r,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=t,a={};return e&&(a[vB]=encodeURIComponent(e)),r&&(a[AB]=encodeURIComponent(r)),n&&(a[RB]=n.toISOString()),o&&(a[CB]=encodeURIComponent(o)),i&&(a[wB]=i.toISOString()),t.mergedGitBranchName&&(a[xB]=encodeURIComponent(t.mergedGitBranchName)),a}var Wle=A.object({entries:A.array(eT),testId:A.string()}),qle=A.object({entries:A.array(vA),testId:A.string()}),Kle=A.object({testId:A.string()});function TR(t){return A.record(A.unknown()).transform(e=>{let r={};for(let[n,o]of Object.entries(e)){let i=t.safeParse(o);i.success&&(r[n]=i.data)}return r})}var vR=TR(tT),AR=TR(AA),RR=A.object({trigger:A.nativeEnum(Br),status:A.nativeEnum(Ie),startedAt:A.coerce.date().optional(),gitCommitSha:A.string().optional(),gitCommitShaShort:A.string().optional(),gitCommitTimestamp:A.coerce.date().optional(),gitBranchName:A.string().optional(),gitOriginUrl:A.string().optional(),gitCommitMessage:A.string().optional(),gitCommitAuthorName:A.string().optional(),githubRepository:A.string().optional(),gitlabProjectPath:A.string().optional(),pipelineId:A.string().optional(),cliVersion:A.string().optional()}),Yle=A.object({id:A.string()}),CR=A.object({status:A.nativeEnum(Ie),updatedAt:A.coerce.date().optional(),finishedAt:A.coerce.date().optional()}),wR=A.object({stepsSnapshot:A.array(A.record(A.unknown())).optional(),runGroupId:A.string().optional(),testId:A.string(),testName:A.string(),resolvedBaseUrl:A.string().optional(),environmentName:A.string().optional(),labels:A.array(A.string()).optional(),cliVersion:A.string().optional(),trigger:A.nativeEnum(Br),schemaVersion:A.string().optional(),section:A.nativeEnum(nd).optional(),resolvedInputs:A.record(A.string(),A.string()).optional(),quarantined:A.boolean().optional().default(!1),quarantinedReason:A.string().optional()}),Xle=A.object({id:A.string()}),MB=Ag.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),xR=MB.array(),_R=Ag.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),Jle=A.object({id:A.string()}),MR=A.object({status:A.nativeEnum(Ie),finishedAt:A.coerce.date().optional(),schemaVersion:A.string().optional().default("1.0.19"),results:A.record(A.string(),A.unknown()).array().optional(),beforeResults:A.record(A.string(),A.unknown()).array().optional(),afterResults:A.record(A.string(),A.unknown()).array().optional()}),Qle=A.object({screenshot:A.string(),contentType:A.enum(["image/jpeg","image/png"]).optional()}),Zle=A.object({id:A.string(),screenshot:A.string(),contentType:A.enum(["image/jpeg","image/png"])}),IR=A.object({key:A.string()}),PR=A.object({orgId:A.string(),userId:A.string()}),OR=A.array(bv),ece=A.record(A.string(),A.union([A.string(),A.boolean()])),tce=A.object({paths:A.string().array(),env:A.string().optional(),urlOverride:A.string().optional(),customHeaders:A.record(A.string(),A.string()).optional()}),LR=A.object({suiteRunIds:A.string().array(),runGroupIds:A.string().array()}),rce=A.object({suiteRunIds:A.string().array()}),nce=Lv.array(),oce=A.object({runGroupIds:A.string().array()}),IB=A.object({uploadUrl:A.string()}),ice=wt.merge($v),ace=wt.merge(qv),sce=wt.merge(Wv),PB=A.object({testId:A.string().optional().default(""),testName:A.string().optional().default(""),suiteId:A.string().optional().default(""),suiteName:A.string().optional().default(""),creditsUsed:A.number().optional()}),OB=A.object({transactionId:A.string(),timestamp:A.string(),event:A.nativeEnum(ql),properties:PB}),lce=OB.array(),NR=sR.omit({steps:!0}).extend({steps:A.array(A.record(A.string(),A.unknown())).describe("unparsed ResolvedStep[]")}),cce=A.object({limit:A.number().max(10).optional(),afterTime:A.number().optional()}),DR=_v.array(),uce=A.object({applied:A.boolean().optional(),appliedAt:A.coerce.date().optional()}),kR=IB.extend({id:A.string()}),dce=A.object({runGroupId:A.string().uuid().optional()}),FR=A.object({runGroupId:A.string().uuid()}),UR=A.object({quarantined:A.object({testId:A.string().uuid(),quarantinedAt:A.coerce.date(),quarantinedBy:A.string().optional(),quarantinedReason:A.string()}).array()}),pce=A.object({testId:A.string().uuid(),testName:A.string().optional(),reason:A.string(),gitLocalUsername:A.string().optional(),gitLocalEmail:A.string().optional(),gitLocalName:A.string().optional()}),mce=A.object({testName:A.string().optional(),reason:A.string().optional(),gitLocalUsername:A.string().optional(),gitLocalEmail:A.string().optional(),gitLocalName:A.string().optional()}),hce=wt.merge(uA),gce=wt.merge(dA),fce=wt.merge(pA),Sce=A.object({apkToInstall:A.object({channel:A.string(),tag:A.string().optional()}).optional(),hostname:A.string().optional(),region:A.nativeEnum(Kl).optional(),osVersion:A.nativeEnum(Yl).optional(),sessionId:A.string().optional()}),BR=A.object({name:A.string(),webRtcUrl:A.string(),adbUrl:A.string(),token:A.string(),apkDownloadUrl:A.string().optional(),playwrightServerUrl:A.string().optional(),region:A.string().optional()}),yce=A.object({hostname:A.string().optional(),region:A.nativeEnum(Kl).optional(),osVersion:A.nativeEnum(lf).optional(),sessionId:A.string().optional()}),zR=A.object({id:A.string(),apiUrl:A.string(),webRtcUrl:A.string(),wdaUrl:A.string(),token:A.string(),region:A.string().optional()}),Ece=A.object({channel:A.string(),tag:A.string(),md5:A.string()}),HR=A.object({id:A.string(),uploadUrl:A.string().optional(),downloadUrl:A.string(),md5:A.string().optional()}),GR=A.object({assets:A.array(A.object({channel:A.string(),tag:A.string(),md5:A.string(),createdAt:A.number().describe("Unix timestamp in milliseconds")}))}),jR=A.object({downloadUrl:A.string()});import{z as ae}from"zod";var VR=7,LB=3,vce=ae.object({localTestId:ae.string(),quarantinedAt:ae.date(),quarantinedBy:ae.string().optional(),quarantinedReason:ae.string(),quarantinedByGitEmail:ae.string().optional(),quarantinedByGitName:ae.string().optional(),quarantinedByGitUsername:ae.string().optional()}).or(ae.object({cloudTestId:ae.string(),quarantinedAt:ae.date(),quarantinedBy:ae.string().optional(),quarantinedReason:ae.string(),quarantinedByGitEmail:ae.string().optional(),quarantinedByGitName:ae.string().optional(),quarantinedByGitUsername:ae.string().optional()})),$R=(r=>(r.QUARANTINE="QUARANTINE",r.UNQUARANTINE="UNQUARANTINE",r))($R||{});var Mf=ae.object({name:ae.string(),description:ae.string().nullish(),effect:ae.nativeEnum($R),labels:ae.array(ae.string()).nullish(),githubRepository:ae.string().nullish(),gitlabProjectPath:ae.string().nullish(),gitBranchName:ae.string().nullish(),slackNotificationChannel:ae.string().nullish()}),NB=ae.object({type:ae.literal("LAST_N_RUNS"),lastN:ae.number().min(LB)}),DB=ae.object({type:ae.literal("LAST_N_HOURS"),lastN:ae.number().min(1).max(VR*24)}),kB=ae.object({type:ae.literal("LAST_N_DAYS"),lastN:ae.number().min(1).max(VR)}),If=ae.discriminatedUnion("type",[NB,DB,kB]),FB=ae.object({flakeRateThreshold:ae.number().min(1).max(100),evaluationWindow:If}),UB=Mf.extend({type:ae.literal("FLAKE_RATE"),config:FB}),BB=ae.object({passRateThreshold:ae.number().min(1).max(100),evaluationWindow:If}),zB=Mf.extend({type:ae.literal("PASS_RATE"),config:BB}),HB=ae.object({failureCountThreshold:ae.number().min(0),evaluationWindow:If}),GB=Mf.extend({type:ae.literal("FAILURE_COUNT"),config:HB}),Ace=ae.discriminatedUnion("type",[UB,zB,GB]);import{z as vt}from"zod";var wce=vt.object({repositoriesIndexed:vt.boolean(),indexingInProgress:vt.boolean(),indexesOutdated:vt.boolean()}),WR=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(WR||{}),qR=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(qR||{}),xce=vt.object({name:vt.string(),status:vt.nativeEnum(WR),conclusion:vt.nativeEnum(qR).nullable()}),rc=vt.object({sha:vt.string(),message:vt.string(),author:vt.object({name:vt.string().optional(),email:vt.string().optional(),date:vt.coerce.date().optional()}),committer:vt.object({name:vt.string().optional(),email:vt.string().optional(),date:vt.coerce.date().optional()})}),Pf=vt.object({mergedBranch:vt.string().optional()});import{z as dt}from"zod";var KR=dt.object({orgId:dt.string(),cacheKeys:dt.string().array()}),Ice=dt.object({keyParams:KR,clientMetadata:dt.string(),lockAcquisitionTimeoutMs:dt.number().optional()}),YR=dt.object({acquired:dt.boolean(),acquiredByMetadata:dt.string(),keyPrefix:dt.string()}),Pce=dt.object({keyPrefix:dt.string(),result:dt.string(),ttlMs:dt.number()}),Oce=dt.union([dt.object({keyPrefix:dt.string()}),KR]),jB=dt.object({remainingTtlMs:dt.number(),value:dt.string().nullish()}),Lce=dt.object({results:dt.record(dt.string(),jB),activeLocks:dt.string().array()}),XR=0,JR=5*60*1e3;var Fce=90*24*60*60*1e3,Uce=7*24*60*60*1e3;import{z as QR}from"zod";var Hce=QR.object({quarantineNotifications:QR.string().nullish()});function os(t){if(t.startsWith("https://api"))return t.replace("https://api","https://app");if(t.startsWith("http://localhost:8000"))return t.replace("http://localhost:8000","http://localhost:3000");throw new Error(`Unknown Momentic app server URL pattern: ${t}`)}import{z as Ut}from"zod";var VB=Ut.object({version:Ut.string(),json:Ut.record(Ut.unknown()),hash:Ut.string()}),ZR=Ut.record(Ut.unknown()),$ce=Ut.object({newSvgs:Ut.array(VB),metadata:ZR.optional()}),$B=Ut.object({version:Ut.string(),json:Ut.record(Ut.unknown()).nullish(),hash:Ut.string(),description:Ut.string().nullish(),metadata:ZR.nullish()}),eC=Ut.record(Ut.string().describe("icon hash"),$B);import{z as gt}from"zod";var Of=gt.object({assertion:gt.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),WB=gt.object({instruction:gt.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Of.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),tC=WB.extend({subSteps:gt.lazy(()=>tC.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),rC=gt.object({name:gt.string().describe("Short name describing the test plan"),description:gt.string().nullish().transform(t=>t??void 0).describe("Longer form description of the high level goal of the test plan")}),nC=rC.extend({id:gt.string(),createdAt:gt.coerce.date(),updatedAt:gt.coerce.date(),updatedBy:gt.string(),createdBy:gt.string(),test:gt.object({id:gt.string(),name:gt.string()}).nullish().transform(t=>t??void 0)}),Yce=nC.extend({testGenRuns:gt.tuple([]).or(gt.tuple([gt.object({id:gt.string(),startedAt:gt.coerce.date(),status:gt.nativeEnum(Ie)})]))}),oC=gt.object({preConditions:Of.array().nullish().transform(t=>t??[]),postConditions:Of.array().nullish().transform(t=>t??[]),steps:tC.array().nullish().transform(t=>t??[])}),Xce=nC.extend({plan:oC.nullish().transform(t=>t??{preConditions:[],postConditions:[],steps:[]})}),qB=rC.extend({plan:oC.nullish().transform(t=>t??{preConditions:[],postConditions:[],steps:[]})}),Jce=qB.array().nullish().transform(t=>t??[]);import{validator as KB}from"@exodus/schemasafe";function iC(t){let e;try{e=JSON.parse(t)}catch(r){return`The schema is not valid JSON. ${r}`}try{KB(e)}catch(r){return`The schema is not a valid JSON schema. ${r}`}}var aC=t=>{t.extraHeaders&&(t.extraHeaders=Object.fromEntries(Object.entries(t.extraHeaders).filter(([e,r])=>e.trim()&&r.trim())))};import{z as hue}from"zod";var Od=class{async resolveStepCacheEntries(){}async saveStepCacheEntries(){}};var Nf="browser-crash-dump.zip",Lf=class{loggerBindings;getParentStepIdChain(){return[]}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}recordStepDuration(){}async finish(){}async startSubSteps(){return new nc}},nc=class{getParentStepIdChain(){return[]}async getScreenshot(){}async getHtmlSnapshot(){}async startStep(){return new Lf}};import{z as Df}from"zod";var Rue=Df.object({parentStepIdChain:Df.array(Df.string()),result:dn});import{z as Z}from"zod";var ur="assets",YB=Z.object({step:St,status:Z.nativeEnum(Ge),startedAt:Z.coerce.date(),finishedAt:Z.coerce.date().optional(),healMetadata:Z.object({healType:Z.nativeEnum(Rl).or(Z.literal("AI")),healedAt:Z.coerce.date()}).optional(),beforeSnapshotId:Z.string().uuid().optional(),afterSnapshotId:Z.string().uuid().optional(),message:Z.string().optional()}),XB=YB.extend({finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),Lue=XB.extend({step:Z.unknown()}),kf=Z.object({avdId:Z.string().optional(),channel:Z.string().optional(),tag:Z.string().optional()}),sC="1.0.0",Ff=MR.extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),runAttemptSchemaVersion:Z.string().optional(),schemaVersion:Z.string().optional().default("1.0.19"),results:Z.record(Z.string(),Z.unknown()).array().optional(),beforeResults:Z.record(Z.string(),Z.unknown()).array().optional(),afterResults:Z.record(Z.string(),Z.unknown()).array().optional(),assetDetails:kf.optional(),activeVideos:Z.array(Z.object({videoName:Z.string(),timestamp:Z.coerce.date()})).optional()}),lC=Ff.extend({assetDetails:kf.optional(),finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),Nue=Ff.merge(wl),Due=lC.merge(wl),cC=Z.object({results:Z.array(dn),beforeResults:Z.array(dn).optional(),afterResults:Z.array(dn).optional()}),kue=Ff.merge(cC),Fue=lC.merge(cC),uC=_R.merge(wR).extend({executionType:Z.nativeEnum(Ha).optional().default("WEB"),testId:Z.string().uuid(),testDescription:Z.string().optional(),runGroupId:Z.string().uuid(),status:Z.nativeEnum(Ie),startedAt:Z.coerce.date(),attempts:Z.number(),failureRecoveryDetails:Z.object({attempts:Z.number()}).optional()}),JB=uC.merge(kf),Uue=uC.extend({finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),Bue=JB.extend({finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)}),QB=RR.merge(CR).extend({id:Z.string().uuid().optional(),startedAt:Z.coerce.date(),cliVersion:Z.string(),labels:Z.string().array().optional().default([])}),Ld=QB.extend({updatedAt:Z.coerce.date().optional().transform(t=>t??new Date),finishedAt:Z.coerce.date().optional().transform(t=>t??new Date)});function dC(t){try{return ZB(t)&&ez(t).isDirectory()}catch(e){return b.error({err:e},`Error reading path ${t} during directory existence check`),!1}}import{confirm as tz,input as rz}from"@inquirer/prompts";import{existsSync as nz,mkdirSync as oz,statSync as iz}from"fs";var zi=!!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;import{dirname as az}from"path";var sz=!1,mC=(()=>{try{return iz("/.dockerenv"),!0}catch{return!1}})();async function Bt(t){return zi||sz||mC?!0:(await b.flush(),await new Promise(r=>setTimeout(r,100)),await tz({message:t}))}async function Uf(t){let e=az(t);return dC(e)?nz(t)?Bt(`File '${pC(t)}' already exists. Overwrite existing content?`):!0:await Bt(`Directory '${pC(e)}' doesn't exist. Create it now?`)?(oz(e,{recursive:!0}),!0):!1}function pC(t){return t.replace(/(\s+)/g,"\\$1")}async function hC(t,e){return zi||mC?e:(await rz({message:t,default:e})).trim()||e}import Ln,{supportsColor as yz}from"chalk";import{Console as gC}from"console";import{format as oc}from"util";var Bf=class extends Error{constructor(e,r,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,r),Error.stackTraceLimit=o}},Nd=class t extends gC{_buffer=[];_groupDepth=0;Console=gC;constructor(){super({write:e=>(t.write(this._buffer,"log",e),!0)})}static write(e,r,n,o=2){let i=new Bf(void 0,t.write).stack;if(!i)return e;let a=i.split(`
|
|
26
26
|
`).slice(o).filter(Boolean).join(`
|
|
27
27
|
`);return e.push({message:n,origin:a,type:r}),e}_log(e,r){t.write(this._buffer,e," ".repeat(this._groupDepth)+r,3)}debug(e,...r){this._log("debug",oc(e,...r))}error(e,...r){this._log("error",oc(e,...r))}info(e,...r){this._log("info",oc(e,...r))}log(e,...r){this._log("log",oc(e,...r))}warn(e,...r){this._log("warn",oc(e,...r))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function fC(t){let e=globalThis.console,r=new Nd;globalThis.console=r;try{t()}finally{let o=r.getBuffer()?.map(i=>i.message).join(`
|
|
28
28
|
`);process.stderr.write(`${o}
|
|
29
29
|
`),globalThis.console=e}}var pt=" ".repeat(6);function SC(t,e="",r=!1){let n=process.stdout?.columns||process.stderr?.columns||80,o=Math.max(n-e.length,20),i=t.split(`
|
|
30
30
|
`),a=[];for(let s of i)if(r){let c=s;for(;c.length>o;){let u=c.slice(0,o+1).lastIndexOf(" "),d=u>-1?u:o;a.push(e+c.slice(0,d)),c=c.slice(d).trimStart()}a.push(e+c)}else{let c=s.split(" "),l="";for(let u of c){if(!l.length){l=u;continue}let d=`${l} ${u}`;d.length<=o?l=d:(a.push(e+l),l=u)}a.push(e+l)}return a.join(`
|
|
31
|
-
`)}import lz from"fetch-retry";import cz from"os";import yC,{multistream as uz}from"pino";import dz from"pino-pretty";import pz from"pino-std-serializers";var is=new Map,mz=!0,EC="Log throttle exceeded",hz=100,gz=5e3,fz=lz(global.fetch,{retries:2,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),zf=class t{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=!1;lastWindowStart=Date.now();site="https://ingest.us.signoz.cloud:443/logs/json";flushIntervalMs;maxBatchSize;buffer=[];flushTimer;constructor({bindings:e,hostname:r,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=r??cz.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10;let a={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=mz?yC(a):yC(a,uz([{stream:dz({colorize:!0})}]))}child(e){return new t({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}async flush(){await this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushBuffer()},this.flushIntervalMs))}async flushBuffer(){if(this.buffer.length===0)return;let e=this.buffer;this.buffer=[];try{let r=await fz(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:Ui(e),signal:AbortSignal.timeout(5e3)});if(!r.ok)throw new Error(`Got error status (${r.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===EC)return!0;let r=Date.now();return r-this.lastWindowStart>gz&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,EC),this.droppedLogsInWindow=!1,this.lastWindowStart=r),this.logsInCurrentWindow<hz?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,r,n,...o){try{this.logHelper(e,r,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,r,n,...o){if(tc[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof r=="string"&&!n&&(r={message:r}),typeof r=="object"&&r&&"err"in r&&r.err instanceof Error&&(r.err=pz.err(r.err));let i={...this.bindingAttributes,...r&&typeof r=="object"?r:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env};this.disableConsoleLogs||this.consoleLogger[e](i,n,...o);let s={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:rR({message:n||"",...i})};this.buffer.push(s),this.buffer.length>=this.maxBatchSize?(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flushBuffer()):this.scheduleFlush()}setApp(e){let r=this.bindingAttributes.app;this.bindingAttributes.app=e,is.set("app",this),is.delete(r)}debug(e,r,...n){this.log("debug",e,r,...n)}info(e,r,...n){this.log("info",e,r,...n)}warn(e,r,...n){this.log("warn",e,r,...n)}error(e,r,...n){this.log("error",e,r,...n)}bindings(){return this.bindingAttributes}addBinding(e,r){this.bindingAttributes[e]=r}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=nR[e]):(this.minLevelValue=tc[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},as=({app:t,hostname:e,disableConsoleLogs:r})=>(is.has(t)||is.set(t,new zf({bindings:{app:t},hostname:e,disableConsoleLogs:r})),is.get(t));async function TC(){await Promise.all([...is.values()].map(t=>t.flush()))}import{hostname as Sz}from"os";var Y=as({app:"cli",hostname:Sz(),disableConsoleLogs:!0}).child({cliVersion:"2.33.
|
|
31
|
+
`)}import lz from"fetch-retry";import cz from"os";import yC,{multistream as uz}from"pino";import dz from"pino-pretty";import pz from"pino-std-serializers";var is=new Map,mz=!0,EC="Log throttle exceeded",hz=100,gz=5e3,fz=lz(global.fetch,{retries:2,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),zf=class t{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=!1;lastWindowStart=Date.now();site="https://ingest.us.signoz.cloud:443/logs/json";flushIntervalMs;maxBatchSize;buffer=[];flushTimer;constructor({bindings:e,hostname:r,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=r??cz.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10;let a={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=mz?yC(a):yC(a,uz([{stream:dz({colorize:!0})}]))}child(e){return new t({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}async flush(){await this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushBuffer()},this.flushIntervalMs))}async flushBuffer(){if(this.buffer.length===0)return;let e=this.buffer;this.buffer=[];try{let r=await fz(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:Ui(e),signal:AbortSignal.timeout(5e3)});if(!r.ok)throw new Error(`Got error status (${r.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===EC)return!0;let r=Date.now();return r-this.lastWindowStart>gz&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,EC),this.droppedLogsInWindow=!1,this.lastWindowStart=r),this.logsInCurrentWindow<hz?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,r,n,...o){try{this.logHelper(e,r,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,r,n,...o){if(tc[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof r=="string"&&!n&&(r={message:r}),typeof r=="object"&&r&&"err"in r&&r.err instanceof Error&&(r.err=pz.err(r.err));let i={...this.bindingAttributes,...r&&typeof r=="object"?r:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env};this.disableConsoleLogs||this.consoleLogger[e](i,n,...o);let s={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:rR({message:n||"",...i})};this.buffer.push(s),this.buffer.length>=this.maxBatchSize?(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flushBuffer()):this.scheduleFlush()}setApp(e){let r=this.bindingAttributes.app;this.bindingAttributes.app=e,is.set("app",this),is.delete(r)}debug(e,r,...n){this.log("debug",e,r,...n)}info(e,r,...n){this.log("info",e,r,...n)}warn(e,r,...n){this.log("warn",e,r,...n)}error(e,r,...n){this.log("error",e,r,...n)}bindings(){return this.bindingAttributes}addBinding(e,r){this.bindingAttributes[e]=r}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=nR[e]):(this.minLevelValue=tc[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},as=({app:t,hostname:e,disableConsoleLogs:r})=>(is.has(t)||is.set(t,new zf({bindings:{app:t},hostname:e,disableConsoleLogs:r})),is.get(t));async function TC(){await Promise.all([...is.values()].map(t=>t.flush()))}import{hostname as Sz}from"os";var Y=as({app:"cli",hostname:Sz(),disableConsoleLogs:!0}).child({cliVersion:"2.33.3"});var Ez=5;async function kd({getResults:t,checkDone:e,name:r,timeoutMs:n=18e5}){let o=Date.now(),i=0;for(;Date.now()-o<n;){let a;i>Ez&&(b.error(`Failed to fetch ${r} status too many times.`),process.exit(1));try{a=await t(),i=0}catch(l){i++,Y.warn({err:l},"Failed to fetch run status, retrying..."),b.warn({err:l},"Failed to fetch run status, retrying..."),await new Promise(u=>setTimeout(u,1500*i));continue}if(e(a))return a;let c=Math.max(1e4,Math.floor(n/100));await new Promise(l=>setTimeout(l,c))}b.error(`Timeout elapsed waiting for ${r} to complete (${Math.floor(n/1e3)}s).`),process.exit(1)}function ss({results:t,startTime:e,entity:r,getDisplayLine:n,onFailed:o}){let i=t.filter(u=>u.status==="PASSED"&&u.quarantined),a=t.filter(u=>u.status==="PASSED"&&!u.quarantined),s=t.filter(u=>u.status==="FAILED"&&u.quarantined),c=t.filter(u=>u.status==="FAILED"&&!u.quarantined),l=t.filter(u=>u.status==="CANCELLED");return fC(()=>{if(c.forEach(u=>{b.log(""),o(u)}),c.length){b.log("");let u=c.length===1?"":"s";b.error(`${c.length} ${r}${u} failed:`),c.forEach(d=>{b.dimmed(n(d))})}if(l.length){b.log("");let u=l.length===1?"":"s";b.warn(`${l.length} ${r}${u} cancelled:`),l.forEach(d=>{b.dimmed(n(d))})}if(a.length){b.log("");let u=a.length===1?"":"s";b.success(`${a.length} ${r}${u} passed:`),a.forEach(d=>{b.dimmed(n(d))})}if(s.length){b.log("");let u=s.length===1?"":"s";b.warn(`${s.length} quarantined ${r}${u} failed:`),s.forEach(d=>{b.dimmed(n(d))})}if(i.length){b.log("");let u=i.length===1?"":"s";b.warn(`${i.length} quarantined ${r}${u} passed:`),i.forEach(d=>{b.dimmed(n(d))})}b.log(""),b.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var Fd=(t,e)=>{if(!t.failureDetails||!t.failureReason)return;let r=Uu[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||Da[t.failureReason],o=t.failureDetails.classification?.rootCause;if(b.error(e),o){b.log(`${pt}- Error type: ${Ln.dim(r)}`);let i="- Root cause analysis:",a=SC(`${i} ${o}`,`${pt} `,!1),s=a.indexOf(":");b.log(`${pt}${i} ${Ln.dim(a.slice(s+1))}`)}else b.log(`${pt}Reason: ${Ln.red(r)}`),b.log(`${pt}Description: ${Ln.red(n)}`)},ic=({status:t,testLogRef:e,getRunningTestsCount:r,getTotalTestsCount:n,additionalText:o})=>{t=t.toUpperCase();let i=t,a;t.includes("FAIL")?(i=Ln.bgRed.white("FAIL"),a=3):t.includes("PASS")?(i=Ln.bgGreen.white("PASS"),a=3):t.includes("START")?(i=Ln.bgBlue.white("START"),a=2):t.includes("CANCEL")?(i=Ln.bgRgb(191,68,11).white("CANCEL"),a=1):t.includes("RETRY")?(i=Ln.bgRgb(191,68,11).white("RETRY"),a=2):t.includes("RUN")||t.includes("PROG")?(i=Ln.bgMagenta.white("RUNNING"),a=0):(b.warn(`Unknown status tried to be logged in run test locally: ${t}`),a=0),yz||(i=`${i}`),b.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${r()}/${n()})`)};import bz from"fs";import{tmpdir as Tz}from"os";import vz from"path";import{registry as ac}from"playwright-core/lib/server";import vC from"proper-lockfile";var AC=vz.join(Tz(),"momenticBrowserInstallation");var Hf=["chrome","chromium","chrome-for-testing","ffmpeg"],Az={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},RC={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function CC(t){if(t==="Org Default")return!1;let e=RC[Az[t]??""]??"",r=ac.findExecutable(e);return!r||r.installType==="none"?!1:Gf(r)}function Gf(t){let e=t.executablePath();return bz.existsSync(e)}function Rz(t,e){let r=RC[t];if(!r)throw new Error(`Requested install of unknown browser type ${t}`);let n=ac.findExecutable(r);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${t}`);if(!(!e&&Gf(n)))return n}async function Cz({browser:t,force:e}){let r=Rz(t,e);if(!r){b.info(`Browser '${t}' is already installed, skipping...`);return}b.info(`Installing browser '${t}'...`);try{await ac.installDeps([r],!1),await ac.install([r],!1)}catch(n){if(n.message.includes("Lock file is already being held")){b.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=ac.findExecutable(t),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Gf(o);)b.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function wC({rawBrowsers:t,force:e=!1,all:r=!1}){let n=r?Hf:Array.from(new Set(t));try{await vC.lock(AC,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){b.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of n)try{await Cz({browser:i,force:e})}catch(a){o=a,b.error(`Failed to install the ${i} browser: ${a}`)}}finally{await vC.unlock(AC,{realpath:!1})}if(o)throw o}import wz from"blocked-at";import xz from"why-is-node-running";function xC(t){_z(t),Mz()}function _z(t){wz((e,r)=>{console.warn(`Detected the NodeJS event loop was blocked for ${e.toFixed(0)}ms. This can cause the CLI to hang.`);let n=r.join(`
|
|
32
32
|
`);console.warn(n),t.warn({stack:n,time:e},"NodeJS event loop blocked")},{threshold:1e3,trimFalsePositives:!0})}function Mz(){process.on("SIGINT",()=>{if("_getActiveHandles"in process){let t=process._getActiveHandles();console.log("Active handles:",t.map(e=>e.constructor?.name))}xz(),setImmediate(()=>{setTimeout(()=>{process.exit(1)},2e3).unref()})})}function _C(t){let e=t?.shardIndex??1,r=t?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(r<1)throw new Error("Shard count must be greater than 0.");if(e>r)throw new Error("Shard index cannot be greater than shard count")}function Iz(t,e,r,n){if(r>t.length&&(b.warn(`Shard count ${r} is greater than the number of tests ${t.length}! Some workers won't have any tests to run.`),r=Math.max(r,t.length),e>r))return[];let o=Math.floor((e-1)*(t.length/r)),i=Math.floor(e*(t.length/r));return(n?[...t].sort((s,c)=>n(s).localeCompare(n(c))):[...t].sort()).filter((s,c)=>c>=o&&c<i)}function MC(t){let{items:e,shardIndex:r,shardCount:n,sortKey:o}=t;return n>1?Iz(e,r,n,o):e}function jf({regenerateCache:t,saveCache:e,disableCache:r}){if(r){if(t)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(e)throw new Error("--disable-cache and --save-cache cannot be used together.")}}function Vf(t,e,r){return t instanceof Ci?(t.zodIssues.forEach(n=>{r.push({file:e,stepIndex:typeof n.path[0]=="number"?n.path[0]:void 0,field:n.path.slice(1).join(".")||n.path.join("."),issue:n.message})}),!0):!1}function sc({parsingErrors:t,parsingErrorDetails:e,failedTestFilePaths:r,failedModuleFilePaths:n}){if(b.error(`
|
|
33
33
|
Found ${t} file(s) with validation errors that must be fixed manually:
|
|
34
34
|
`),e.length>0){let o=new Map;e.forEach(i=>{let a=o.get(i.file)||[];a.push(i),o.set(i.file,a)}),o.forEach((i,a)=>{b.error(` ${a}`),i.forEach(({stepIndex:s,field:c,issue:l})=>{let u=s!==void 0?`Step ${s}`:"File",d=c?`, field "${c}"`:"";b.error(` ${u}${d}:`),b.error(` \u2192 ${l}`)})})}else r.size>0&&b.error(`Failed test files:
|
|
35
35
|
${[...r].map(o=>`${pt}- ${o}`).join(`
|
|
36
36
|
`)}`),n&&n.size>0&&b.error(`Failed module files:
|
|
37
37
|
${[...n].map(o=>`${pt}- ${o}`).join(`
|
|
38
|
-
`)}`);b.warn("Please fix these errors in your test files and try again.")}import{randomUUID as y4}from"crypto";import vN from"body-parser";import i5 from"cors";import a5 from"dedent";import{Router as OH}from"express";import pr from"fs";import{globSync as LH}from"glob";import Dt from"path";import cp from"fs";import{z as Bz}from"zod";var H="v1",$f="cli",Hi="2.33.
|
|
38
|
+
`)}`);b.warn("Please fix these errors in your test files and try again.")}import{randomUUID as y4}from"crypto";import vN from"body-parser";import i5 from"cors";import a5 from"dedent";import{Router as OH}from"express";import pr from"fs";import{globSync as LH}from"glob";import Dt from"path";import cp from"fs";import{z as Bz}from"zod";var H="v1",$f="cli",Hi="2.33.3";var jo=3.1783027;function Pz(t){let e=0;for(let r=0;r<t.length;r++){let n=t.charCodeAt(r);!(n>=48&&n<=57)&&!(n>=65&&n<=90)&&!(n>=97&&n<=122)&&e++}return e}function Pe(t){return Math.ceil(Wf(t)/jo)}function Wf(t){let e=0;if(typeof t=="string"){let r=t;r=r.replaceAll(`
|
|
39
39
|
`,""),r=r.replaceAll(" ","");let n=Pz(r);return r.length-n+jo*n}if(typeof t>"u"||t===null)return 0;if(typeof t=="number")return String(t).length;if(Array.isArray(t))return t.forEach(r=>{e+=Wf(r)}),e;if(typeof t=="object"){let r=t;return r.type==="image"||r.type==="media"&&"data"in r&&"mediaType"in r&&typeof r.mediaType=="string"&&r.mediaType.includes("jpeg")?1600:(Object.keys(r).forEach(n=>{e+=String(n).length,n==="image_url"?(r[n]??{}).detail==="high"?e+=1105*jo:e+=85*jo:n==="source"&&typeof r[n]=="object"&&r[n]?.type==="base64"?e+=1600*jo:e+=Wf(r[n])}),e)}if(typeof t=="boolean")return t?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof t}': ${t}`)}var Vo=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var IC=t=>{let e=t.reason===void 0?new DOMException("This operation was aborted.","AbortError"):t.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function V(t,e){let{milliseconds:r,fallback:n,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof r!="number"||Math.sign(r)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);return new Promise((s,c)=>{let l;if(e.signal){let{signal:p}=e;if(p.aborted)return c(IC(p));l=()=>c(IC(p)),p.addEventListener("abort",l,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",l),n)try{s(n())}catch(p){c(p)}else{typeof t.cancel=="function"&&Promise.resolve().then(()=>t.cancel()).catch(()=>{});let p=o instanceof Error?o:new Vo(o??`Promise timed out after ${r}ms`);c(p)}};r<1/0&&(a=i.setTimeout(u,r));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(t).then(p=>{d(),s(p)}).catch(p=>{d(),c(p)})})}var Ud=class{limit;windowMs;userActions;constructor(e,r){this.limit=e,this.windowMs=r,this.userActions=new Map}_cleanup(e,r="DEFAULT_USER"){let n=Date.now(),o=`${r}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,r="DEFAULT_USER"){let n=Date.now(),o=`${r}:${e}`;this._cleanup(r,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};async function le(t,e){if(!(t<=0))return new Promise((r,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),r()},t);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}var Oz=9e4,Lz=3,Nz=1500,Dz=15e3,gn=class extends Error{status;rawError;constructor(e,r,n,o={}){super(n,o),this.status=e,this.rawError=r}};async function kz(t){return t.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var qf=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Hi&&(e[Pd]=Hi),$f&&(e[cR]=$f),e}async sendRequest(e,r){let{retries:n=Lz,requestTimeoutMs:o=Oz,initialRetryDelayMs:i=Nz,maxRetryDelayMs:a=Dz,onFailedRequest:s}=r,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:r.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,r,o)}catch(p){u=p;try{s?.(u)}catch{}if(p instanceof gn&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Vo),c===0)throw u;let m=l-c,h=Math.min(i*Math.pow(2,m-1),a);await new Promise(g=>setTimeout(g,h))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,r,n){let o={path:e,baseUrl:this.baseUrl,method:r.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();r.signal&&r.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...r.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:r.method,body:r.body?JSON.stringify(r.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await kz(u);throw new gn(u.status,m,`Request to ${r.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(r.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&r.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=r.responseHeadersObject;return p&&u.headers.forEach((m,h)=>{p[h.toLowerCase()]=m}),d}finally{clearTimeout(a),r.signal&&r.signal.removeEventListener("abort",s)}}},zt=class extends qf{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[lR]:this.mode??""}}};import{createAnthropic as Fz}from"@ai-sdk/anthropic";function Uz(t){let{apiKey:e,sessionId:r,extraHeaders:n,loggerTags:o}=t,i={Authorization:`Bearer ${e}`,[Pd]:Hi??"",...r&&{[dR]:r},...n||{}};return o&&(i[uR]=JSON.stringify(o)),i}var lc=t=>e=>{let r=Uz(t);return Fz({baseURL:`${t.baseUrl}/v1/llm/anthropic/${e}`,headers:r,apiKey:t.apiKey})(e)};var no=class extends zt{agentConfig;constructor(e,r){let n={...ld,...e};super(r),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,r){let n={...e,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:r.abortSignal});return kv.parse(o)}async rankChunksWithRag(e,r){let n=await this.sendRequest(`/${H}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:Hi,...e},signal:r.abortSignal});return Dv.parse(n)}async getScreenshotFromS3(e){let r=await this.sendRequest(`/${H}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return Bz.string().parse(r)}async getElementLocation(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${H}/web-agent/locate-element`,{method:"POST",body:n,signal:r.abortSignal});return SR.parse(o)}async getAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${H}/web-agent/assertion`,{method:"POST",body:n,signal:r.abortSignal});return xf.parse(o)}async getLintStepResult(e,r){let n={...e,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/lint/step`,{method:"POST",body:n,signal:r.abortSignal});return fR.parse(o)}async getLintMcpCopilotMessageResult(e,r){let n={message:e.message,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:r.abortSignal});return mR.parse(o)}async getMcpCopilotConversationEvaluation(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:r.abortSignal});return hR.parse(o)}async getMcpCopilotChatSummary(e,r){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:r.abortSignal});return gR.parse(o)}async getVisualAssertionResult(e,r){let n={...e,disableCache:!!r.disableCache,useConsensus:!!r.useConsensus,attemptNumber:r.attemptNumber,loggerTags:r.loggerTags,useMemory:r.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${H}/web-agent/visual-assertion`,{method:"POST",body:n,signal:r.abortSignal});return xf.parse(o)}async getAiActionCommand(e,r){let n=await this.sendRequest(`/${H}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return pR.parse(n)}async getMultiturnAiActionCommand(e,r){return await this.sendRequest(`/${H}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal})}async getMultiturnAiActionEvaluation(e,r){let n=await this.sendRequest(`/${H}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return hg.parse(n)}async getReverseMappedDescription(e,r){let n=await this.sendRequest(`/${H}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:r.disableCache,loggerTags:r.loggerTags},signal:r.abortSignal});return yR.parse(n)}async getTextExtraction(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${H}/web-agent/text-extraction`,{method:"POST",body:n,signal:r.abortSignal});return dg.parse(o)}async getPageSummary(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/page-summary`,{method:"POST",body:n,signal:r.abortSignal});return pv.parse(o)}async getSmartWaitingDecision(e,r){let n={...e,disableCache:r.disableCache,loggerTags:r.loggerTags},o=await this.sendRequest(`/${H}/web-agent/smart-waiting`,{method:"POST",body:n,signal:r.abortSignal});return mv.parse(o)}async getTestResultClassification(e,r){let n=await this.sendRequest(`/${H}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return Vh.parse(n)}async getExtractedKeywords(e,r){let n=await this.sendRequest(`/${H}/web-agent/extract-keywords`,{method:"POST",body:e,signal:r.abortSignal});return Xv.parse(n)}async getAutohealingProposal(e,r){let n=await this.sendRequest(`/${H}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return lv.parse(n)}async getFailureRecoveryProposal(e,r){let n=await this.sendRequest(`/${H}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return uv.parse(n)}async getFailureRecoveryPlan(e,r){let n=await this.sendRequest(`/${H}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:r.loggerTags},signal:r.abortSignal});return cv.parse(n)}async getIframeRegex(e,r){let n=await this.sendRequest(`/${H}/web-agent/iframe-regex`,{method:"POST",body:e,signal:r.abortSignal});return vb.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return lc({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as Kf}from"zod";var nt=class extends zt{constructor(e){super({...e,mode:void 0})}getAppUrl(){return os(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${H}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:r=>{b.warn(`API key check failed: ${r.message}`)}});return PR.parse(e)}async bulkGetRunStatus(e){let r=await this.sendRequest(`/${H}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return xR.parse(r)}async getTestYAMLExport(e){let r=await this.sendRequest(`/${H}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return bR.parse(r)}async updateStepCaches(e,r){await this.sendRequest(`/${H}/cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,r){let n=await this.sendRequest(`/${H}/cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return vR.parse(n)}async updateMobileStepCaches(e,r){await this.sendRequest(`/${H}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:r,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,r){let n=await this.sendRequest(`/${H}/mobile-cache`,{method:"POST",body:e,extraHeaders:r,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return AR.parse(n)}async queueTests(e){let r=await this.sendRequest(`/${H}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return ER.parse(r)}async uploadScreenshot(e){let r=await this.sendRequest(`/${H}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return IR.parse(r)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${H}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${H}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let r={};return{data:await this.sendRequest(`/${H}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:r}),contentType:r["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${H}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return OR.parse(e)}async acquireCacheLock(e,r){let n=await this.sendRequest(`/${H}/result-cache/lock`,{method:"POST",body:e,signal:r,retries:3,requestTimeoutMs:3e4});return YR.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${H}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${H}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${H}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${H}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(r){if(r instanceof Error&&r.message.includes("404"))return null;throw r}}async queueSuiteRuns(e){let r=await this.sendRequest(`/${H}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return LR.parse(r)}async bulkGetRunGroupStatus(e){let r={runGroupIds:e},n=await this.sendRequest(`/${H}/run-groups/status`,{method:"POST",body:r,retries:3,requestTimeoutMs:5e3});return Iv.array().parse(n)}async uploadProposedSteps(e,r){try{await this.sendRequest(`/${H}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){r.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,r){try{await this.sendRequest(`/${H}/billing/events`,{method:"POST",body:r,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let r=await this.sendRequest(`/${H}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return NR.parse(r)}async patchTestFragment(e,r){await this.sendRequest(`/${H}/test-fragments/${e}`,{method:"PATCH",body:r,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,r){let n=await this.sendRequest(`/${H}/results/tests/${e}`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return DR.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${H}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return kR.parse(e)}async startProcessingResultsUpload(e,r){let n=await this.sendRequest(`/${H}/results/uploads/${e}/process`,{method:"POST",body:r,retries:3,requestTimeoutMs:1e4});return FR.parse(n)}async fetchIconKnowledgeBase(e){try{let r=await this.sendRequest(`/${H}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return eC.parse(r)}catch(r){return e.error({err:r},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,r){try{await this.sendRequest(`/${H}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){r.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,r,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${H}/git/github/${e}/${r}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return rc.parse(a)}async getCommitFromGithub(e,r,n){let o=await this.sendRequest(`/${H}/git/github/${e}/${r}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return rc.parse(o)}async getMergedBranchFromGithub(e,r,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${H}/git/github/${e}/${r}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Pf.parse(a)}async getMergeBaseCommitFromGitlab(e,r,n){let o=new URLSearchParams;o.set("base",r),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${H}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return rc.parse(a)}async getCommitFromGitlab(e,r){let n=encodeURIComponent(e),o=await this.sendRequest(`/${H}/git/gitlab/${n}/commits/${r}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return rc.parse(o)}async getMergedBranchFromGitlab(e,r,n){let o=encodeURIComponent(r),i=encodeURIComponent(e),a=await this.sendRequest(`/${H}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Pf.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${H}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Kf.record(Kf.string(),Kf.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${H}/quarantine`,{method:"GET"});return UR.parse(e)}async quarantineTest(e,r,n){await this.sendRequest(`/${H}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,r,n){await this.sendRequest(`/${H}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:r,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let r=await this.sendRequest(`/${H}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return BR.parse(r)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${H}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:r,md5:n}){let o={channel:e,tag:r,md5:n},i=await this.sendRequest(`/${H}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return HR.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${H}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${H}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return GR.parse(e)}async getLimbarAssetDownloadUrl(e,r){let n=await this.sendRequest(`/${H}/limbar/assets/${e}/${r}/download-url`,{method:"GET",retries:2,requestTimeoutMs:3e4});return jR.parse(n)}async deleteAndroidAsset(e,r){await this.sendRequest(`/${H}/limbar/assets/${e}/${r}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let r=await this.sendRequest(`/${H}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return zR.parse(r)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${H}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${H}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let r=await this.sendRequest(`/${H}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return OA.parse(r)}};async function Yf(t){let e=process.versions.node,r=parseInt(e.split(".")[0]);(isNaN(r)||r<18)&&(b.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),b.debug(`Identified node version ${e}`);let n=await t.client.getAuthInfo();return b.debug("Got auth info from API"),n}var Bd=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,r){await this.apiClient.reportBillableEvents(e,r)}};var $o=class extends zt{generator;constructor(e,r){super(e),this.generator=r}async runTemplateMatching(e,r={}){let n=await this.sendRequest(`/${H}/web-agent/template-matching`,{method:"POST",body:e,signal:r?.signal});return Ab.parse(n)}async constructIframeRegex(e,r={}){return this.generator.getIframeRegex(e,{abortSignal:r.signal})}};var ls=class{constructor(e,r){this.client=e;this.orgId=r}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return os(e)}async acquireCacheLock(e,r){return this.client.acquireCacheLock(e,r)}async createOnDemandScreenshot(e,r,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:r.toString("base64"),contentType:n});return{apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${e}`,universalHandle:{id:e,contentType:n}}}async fetchOnDemandScreenshot(e){return this.client.fetchOnDemandScreenshot(e.id)}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,r){return this.client.saveNewIcons(e,r)}};import{Faker as zz,en as Hz}from"@faker-js/faker";var cs="v1",Nn=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 zz({locale:Hz}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let r=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${cs}/tools/ai/generate`,{method:"POST",body:r}).catch(n=>{throw n instanceof gn?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${cs}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof gn?new Error(r.rawError):new Error(`Failed to send sms: ${r.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${cs}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof gn?new Error(r.rawError):r})}async sendEmail(e){return this.httpClient.sendRequest(`/${cs}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(r=>{throw r instanceof gn?new Error(r.rawError):new Error(`Failed to send email: ${r.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${cs}/tools/email/fetchAll`,{method:"POST",body:e}).catch(r=>{throw r instanceof gn?new Error(r.rawError):new Error(`Failed to fetch all emails: ${r.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${cs}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(r=>{throw r instanceof gn?new Error(r.rawError):new Error(`Failed to fetch latest emails: ${r.message}`)})}};function PC(t,e,r){return fetch(t,{method:"PUT",body:r,headers:{"Content-Type":e}})}var zd=class{constructor(e){this.client=e}async uploadResultsArchive(e,r){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await PC(n,"application/zip",r);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 ot(t,e,r=!1){return t.length<e?t:t.slice(0,e-3)+(r?"...TRUNCATED...":"[...]")}var oo={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},io={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},Xf={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},Jf={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function OC(t){switch(t.type){case"ELEMENT_CONTENT":return`content ${t.negated?io[t.operation]:oo[t.operation]} '${t.value}'`;case"ELEMENT_ATTRIBUTE":{let r=t.negated?io[t.operation]:oo[t.operation];return t.operation==="EXISTS"?`attribute '${t.attr}' ${r}`:`attribute '${t.attr}' ${r} '${t.value}'`}case"ELEMENT_NAME":{let r=t.negated?io[t.operation]:oo[t.operation];return t.operation==="EXISTS"?`tag name ${r}`:`tag name ${r} '${t.value}'`}case"ELEMENT_STYLE":{let r=t.negated?io[t.operation]:oo[t.operation];return t.operation==="EXISTS"?`style property '${t.property}' ${r}`:`style property '${t.property}' ${r} '${t.value}'`}case"ELEMENT_EXISTENCE":return t.negated?Jf[t.condition]:Xf[t.condition];default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}var eSe={CONTENT:"The page"};function Gz(t){switch(t.type){case"VALUE":return`the option with value ${t.value}`;case"LABEL":return`the option with label ${t.label}`;case"INDEX":return`the option at index ${t.index}`;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function Gd(t){switch(t.type){case"SUBSTRING":return`match substring '${t.url}'`;case"REGEX":return`match regex '${t.regex}'`;case"GLOB":return`match glob '${t.glob}'`;case"DOMAIN":return`match domain '${t.domain}'`;default:return(r=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function Hd(t){let e="";return t.method&&(e=` with method ${t.method}`),`${Gd(t.urlMatcher)}${e}`}function jz(t){return`${t.negated?io.CONTAINS:oo.CONTAINS} '${t.value}'`}function Vz(t){switch(t.type){case"CONTENT":return jz(t);default:return t.type,""}}function ao(t,e=!0){switch(t.type){case"SUCCESS":return t.condition?.assertion?`Check success condition: ${t.condition.assertion}`:"All commands completed";case"AI_EXTRACT":return`Extract data from page: ${t.goal}`;case"NAVIGATE":return`Go to URL: ${e?ot(t.url,30):t.url}`;case"DIALOG":return`Automatically ${t.action.toLowerCase()} the next dialog`;case"CAPTCHA":return"Solve captchas on the page";case"GO_BACK":return"Go back to the previous page";case"GO_FORWARD":return"Go forward to the next page";case"SCROLL_DOWN":return`Scroll down ${t.deltaY?`${t.deltaY}px`:"1 page height"}${t.target?` in the container of: ${Wt(t.target)}`:""}`;case"SCROLL_UP":return`Scroll up ${t.deltaY?`${t.deltaY}px`:"1 page height"}${t.target?` in the container of: ${Wt(t.target)}`:""}`;case"SCROLL_LEFT":return`Scroll left ${t.deltaX?`${t.deltaX}px`:"1 page width"}${t.target?` in the container of: ${Wt(t.target)}`:""}`;case"SCROLL_RIGHT":return`Scroll right ${t.deltaX?`${t.deltaX}px`:"1 page width"}${t.target?` in the container of: ${Wt(t.target)}`:""}`;case"WAIT":return`Wait for ${t.delay} seconds`;case"REFRESH":return"Refresh the page";case"CLICK":{if(t.target?.type==="coordinates")return`Click at coordinates: ${Wt(t.target)}`;let n="";return t.target?.elementDescriptor.length?n=` on element: '${t.target.elementDescriptor}'`:t.cache?.target.nodeOnlySerializedHtml&&(n=` on element: '${t.cache?.target.nodeOnlySerializedHtml}'`),`Click${n}`}case"FOCUS":return`Focus ${Wt(t.target)}`;case"BLUR":return`Focus ${Wt(t.target)}`;case"DRAG":return`Drag ${Wt(t.fromTarget)} onto ${Wt(t.toTarget)}`;case"MOUSE_DRAG":return t.target?.type==="description"&&t.target.elementDescriptor?`Click and drag ${Wt(t.target)} by ${t.deltaX}px horizontally, ${t.deltaY}px vertically`:`Click and drag mouse by ${t.deltaX}px horizontally, ${t.deltaY}px vertically`;case"TYPE":{let n="";return t.target?.type==="coordinates"?n=` in element at coordinates: ${Wt(t.target)}`:t.target?.elementDescriptor.length?n=` in element: '${t.target.elementDescriptor}'`:t.cache?.target.nodeOnlySerializedHtml&&(n=` in element: '${t.cache?.target.nodeOnlySerializedHtml}'`),`Type '${t.value}'${n||""}`}case"HOVER":{let n="";return t.target.type==="coordinates"?n=` over coordinates: ${Wt(t.target)}`:t.target.elementDescriptor.length>0?n=` over element: '${t.target.elementDescriptor}'`:t.cache?.target.nodeOnlySerializedHtml&&(n=` over element: '${t.cache?.target.nodeOnlySerializedHtml}'`),`Hover${n}`}case"PRESS":return`Press ${t.value}`;case"KEY_DOWN":return`Hold down ${t.value} on the keyboard`;case"KEY_UP":return`Release ${t.value} on the keyboard`;case"SELECT_OPTION":{let n="",o=Gz(t.choice);return t.target.type==="coordinates"?n=` from element at coordinates: ${Wt(t.target)}`:t.target.elementDescriptor.length>0?n=` from: '${t.target.elementDescriptor}'`:t.cache?.target.nodeOnlySerializedHtml&&(n=` from: '${t.cache?.target.nodeOnlySerializedHtml}'`),`Select option '${o}'${n}`}case"TAB":switch(t.action.type){case"SUBSTRING":return`Switch to tab with substring: ${t.action.substring}`;case"REGEX":return`Switch to tab matching regex: ${t.action.pattern}`;case"INDEX":return`Switch to tab at index: ${t.action.index}`;default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t.action)}return"Switch to unknown tab";case"NEW_TAB":return`Open new tab to: ${t.url}`;case"REQUEST":return`Send ${t.method} request to ${t.url}`;case"GRAPHQL_REQUEST":return`Send GraphQL request to ${t.url}`;case"COOKIE":return`Set cookie: ${t.value}`;case"LOCAL_STORAGE":return`Set local storage: ${t.key}: ${t.value}`;case"JAVASCRIPT":return`Run JavaScript: ${e?ot(t.code,30):t.code}`;case"AI_ASSERTION":return`Assertion: '${t.assertion}'`;case"VISUAL_DIFF":return`Visual diff against baseline ${t.target?`for element: ${Wt(t.target)}`:"for entire page"}`;case"FILE_UPLOAD":return t.fileSource.type==="URL"?`Upload file: ${t.fileSource.url}`:`Upload file: ${t.fileSource.name}`;case"AUTH_LOAD":return"Load auth state";case"AUTH_SAVE":return"Save auth state";case"ELEMENT_CHECK":return`Check the element ${Wt(t.target)} ${OC(t.assertion)}`;case"PAGE_CHECK":return`Check the page ${Vz(t.assertion)}`;case"WAIT_FOR_URL":return`Wait for page URL to ${Gd(t.matcher)}`;case"COPY":return"Copy to clipboard";case"PASTE":return"Paste clipboard contents";case"REGISTER_REQUEST_LISTENER":return t.requestMatcher?`Register a listener for network requests that ${Hd(t.requestMatcher)}`:"Register a listener for network requests";case"AWAIT_LISTENER":return t.key?`Wait for the listener ${t.key} to resolve`:"Wait for a listener to resolve";case"RECORD_REQUESTS":return t.requestMatcher?`Start recording requests that match ${Hd(t.requestMatcher)}`:"Start recording network requests";case"GET_RECORDED_REQUESTS":return t.key?`Get the requests that were recorded for ${t.key}`:"Get the requests that were recorded";case"SET_HEADER":return t.name?t.requestMatcher?`Set a ${t.name} header for requests that match ${Hd(t.requestMatcher)}`:`Set a ${t.name} header for all requests`:"Set a header";case"MOCK_ROUTE":return t.requestMatcher?`Mock requests that ${Hd(t.requestMatcher)}`:"Mock a network route";case"REMOVE_ROUTE_MOCK":return t.key?`Remove the mock with key ${t.key}`:"Remove all route mocks";case"OFFLINE_MODE":return t.enable?"Enable offline mode":"Disable offline mode";default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(t)}}function $z(t){return typeof t=="object"&&t!==null}function Dn(t){if(Array.isArray(t))return t.map(Dn);if($z(t)){let e={};return Object.entries(t).forEach(([r,n])=>{n!==void 0&&(e[r]=Dn(n))}),e}return t}function cc(t,e,r,n){let{negated:o,ignoreCase:i}=n,a=t.trim(),s=e.trim();i&&(a=a.toLowerCase(),s=s.toLowerCase());let c;switch(r){case"CONTAINS":{c=a.includes(s);break}case"EQUALS":{c=a===s;break}case"STARTS_WITH":{c=a.startsWith(s);break}case"EXISTS":{c=a.length>0;break}default:throw new Error(`Unrecognized content assertion type: ${r}`)}return o?!c:c}function LC(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&(t.condition==="EXISTS"||t.condition==="VISIBLE")}function us(t){return t.type==="ELEMENT_EXISTENCE"?t.negated?Xf[t.condition]:Jf[t.condition]:t.negated?oo[t.operation]:io[t.operation]}import{diff as qz}from"deep-object-diff";import{cloneDeep as Wd}from"lodash-es";function Gi(t){let e={parentChain:[]};return jd(t,e),e}function jd(t,e){let{onPresetAction:r,onSimpleStepContainer:n,onConditional:o,earlyStop:i}=t;for(let a of t.steps)switch(a.type){case"PRESET_ACTION":if(r(a,e)&&i)return!0;break;case"CONDITIONAL":if(o?.(a,e)&&i)return!0;e.parentChain.push(a);for(let c of a.blocks)if(r(c.assertion,e)&&i||jd({...t,steps:c.steps},e)&&i)return!0;if(jd({...t,steps:a.elseSteps??[]},e)&&i)return!0;e.parentChain.pop();break;case"RESOLVED_MODULE":case"SECTION":case"AI_ACTION":if(n?.(a,e)&&i)return!0;if(a.steps){if(e.parentChain.push(a),jd({...t,steps:a.steps},e)&&i)return!0;e.parentChain.pop()}break;case"AI_ACTION_DYNAMIC":{if(n?.(a,e)&&i)return!0;break}default:return(c=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(a)}}function NC(t,e,r,n){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==n[s])return!1;i.shift()}return!!Wz([t],r,i).result}function Wz(t,e,r=[]){let n,o=[],i=(a,s)=>{let c=JSON.stringify(s.parentChain.map(u=>u.id)),l=r.length===0?!0:JSON.stringify(r)===c;return a.id===e&&l?(n=a,o=s.parentChain,!0):!1};return Gi({steps:t,earlyStop:!0,onPresetAction:i,onConditional:i,onSimpleStepContainer:i}),{result:n,parentChain:o}}function DC(t,e){e(t);for(let r in t){let n=t[r];n&&(Array.isArray(n)?$d(n,e):typeof n=="object"&&DC(n,e))}}function $d(t,e){for(let r of t)r&&(Array.isArray(r)?$d(r,e):typeof r=="object"&&DC(r,e))}function Qf(t,e){if(t.length>e.length)return Qf(e,t);for(let r=0;r<t.length;r++)if(t[r]!==e[r])return!1;return!0}function Vd(t){for(let e of t.results)switch(e.type){case"PRESET_ACTION":t.onPresetAction(e);break;case"AI_ACTION":case"AI_ACTION_DYNAMIC":case"MODULE":t.onSimpleStepContainer?.(e),Vd({...t,results:e.results});break;case"CONDITIONAL":t.onConditional?.(e),e.assertionResult&&t.onPresetAction(e.assertionResult),Vd({...t,results:e.results});break;default:throw new Error(`Unsupported result type: ${e.type}`)}}function so(t,e){return!t&&!e?!1:!t||!e?!0:Object.keys(qz(t,e)).length>0}function ds({steps:t,topLevel:e=!0,...r}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=r,a=[],s=[],c=[],l=0,u=(p,m)=>{try{let h=Zn.parse(m.value);if(h.type!==p.type){o.warn({parsedCacheEntry:h,command:p},"Not using step cache due to type mismatch"),s.push(m.key);return}p.cache=h.cache,a.push(m.key),c.push(m.uniqueKey)}catch(h){s.push(m.key),o.error({err:h,cacheEntry:m},"Not using step cache due to parsing error")}},d=(p,m)=>{let h=Kz(p.id,m),g=h.find(f=>!!n[f]);if(g)u(p,n[g]);else{if(p.type==="AI_ASSERTION")return;s.push(h[0])}};for(let p of t)switch(p.type){case"RESOLVED_MODULE":{l+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=ds({...r,steps:p.steps,keyPrefix:i?`${i}:${p.id}`:p.id,topLevel:!1});a.push(...m),s.push(...h),c.push(...g);break}case"SECTION":case"AI_ACTION":{if(l+=p.steps?.length??0,!p.steps?.length)break;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=ds({...r,steps:p.steps,topLevel:!1});a.push(...m),s.push(...h),c.push(...g);break}case"AI_ACTION_DYNAMIC":continue;case"PRESET_ACTION":{if(!Ou.includes(p.command.type)||(p.command.type==="TYPE"||p.command.type==="MOUSE_DRAG"||p.command.type==="VISUAL_DIFF"||p.command.type==="SCROLL_DOWN"||p.command.type==="SCROLL_UP"||p.command.type==="SCROLL_LEFT"||p.command.type==="SCROLL_RIGHT")&&!p.command.target||"cache"in p.command&&p.command.cache)continue;l++,d(p.command,i);break}case"CONDITIONAL":{for(let m of p.blocks){l++,d(m.assertion.command,i),l+=m.steps.length;let{cacheKeysHit:h,cacheKeysMissed:g,uniqueKeysHit:f}=ds({...r,steps:m.steps,topLevel:!1});a.push(...h),s.push(...g),c.push(...f)}if(p.elseSteps){l+=p.elseSteps.length;let{cacheKeysHit:m,cacheKeysMissed:h,uniqueKeysHit:g}=ds({...r,steps:p.elseSteps,topLevel:!1});a.push(...m),s.push(...h),c.push(...g)}break}default:return(h=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(p)}return e&&l&&s.length>0&&o.warn({totalSteps:l,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:c,cacheEntriesKeys:Object.values(n).map(p=>p.uniqueKey)},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:c}}function kC(t,e){return e?`${e}:${t}`:t}function Kz(t,e){let r=[],n=e?.split(":")??[];for(let o=n.length;o>=0;o--){let i=[...n.slice(o),t];r.push(i.join(":"))}return r.reverse(),r}function Zf(t){let{moduleStepParents:e=[],moduleIdParents:r=[]}=t;if(e.length!==r.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
|
|
40
40
|
${JSON.stringify(r)}`);let n=[];return n.push({key:kC(t.id,e.join(":")),organizationId:t.orgId,value:t.value,testId:t.testId}),n}function FC(t){let e=new Set;return $d(t,r=>{if("type"in r&&r.type==="RESOLVED_MODULE"&&"moduleId"in r){let n=r.moduleId;typeof n=="string"&&!e.has(n)&&e.add(n)}}),e}function qd({cmd:t,newTarget:e,key:r,logger:n,updatedWithAI:o}){if(t.type==="DRAG")if(r!=="fromTarget"&&r!=="toTarget")n.error({cmd:t,newTarget:e,key:r},"Attempted to apply invalid cache to DRAG command");else{let i=t.cache?.updatedAt;t.cache={...t.cache,[r]:e,updatedAt:i&&!o?i:new Date}}else if(r==="target"&&Lu(t)){let i=t.cache?.updatedAt;t.cache={...t.cache,target:e,updatedAt:i&&!o?i:new Date}}else n.error({cmd:t,newTarget:e,key:r},"Invalid target cache application")}function dc(t,e,r){let n=t.cache&&"memory"in t.cache?t.cache.memory?.traces:void 0;so(n,e)&&(r.info({updatedTraces:e,oldCmd:t},"Wrote new memory to assertion command"),t.cache={...t.cache,memory:{type:"GCS_TRACES",traces:e},updatedAt:new Date})}function UC({steps:t}){let e={};return Gi({steps:t,onPresetAction:(r,n)=>{let o=r.command;if(!("cache"in o)||!o.cache)return;let i=n.parentChain.filter(c=>c.type==="RESOLVED_MODULE").map(c=>c.id).join(":"),a=kC(o.id,i),s=Zn.parse(o);e[a]=s},onSimpleStepContainer:(r,n)=>{},onConditional:(r,n)=>{}}),e}function uc(t){return{...t,serializedHtml:void 0,nodeOnlySerializedHtml:void 0,screenshotUrl:void 0,boundingBox:void 0,selector:void 0,hybridSelector:void 0,generatedSelectors:void 0,id:-1}}function Yz(t,e){return t&&!so(t.memory,e.memory)?t:{...t,memory:e.memory,updatedAt:e.updatedAt}}function eS(t,e){return t?so(t.target.memory,e.target.memory)?{target:{...t.target,memory:e.target.memory},updatedAt:e.updatedAt}:t:{target:uc(e.target),updatedAt:e.updatedAt}}function Xz(t,e){let r=Wd(t);return r.fromTarget?so(t.fromTarget?.memory,e.fromTarget?.memory)&&(r.fromTarget={...r.fromTarget,memory:e.fromTarget?.memory},r.updatedAt=e.updatedAt):(r.fromTarget=e.fromTarget,r.fromTarget&&(r.fromTarget=uc(r.fromTarget),r.updatedAt=e.updatedAt)),r.toTarget?so(t.toTarget?.memory,e.toTarget?.memory)&&(r.toTarget={...r.toTarget,memory:e.toTarget?.memory},r.updatedAt=e.updatedAt):(r.toTarget=e.toTarget,r.toTarget&&(r.toTarget=uc(r.toTarget),r.updatedAt=e.updatedAt)),r}function BC({newEntries:t,originalCachesMap:e}){let r=[];for(let n of t){let o=e[n.key],i=n.value.cache;if(i){if(o?n.value={...o}:n.value={type:n.value.type,cache:void 0},"memory"in i&&i.memory){let a=o&&o.cache&&"memory"in o.cache?o.cache.memory:void 0;so(a,i.memory)&&(n.value.cache=Yz(o?.cache,i),r.push(n))}else if("target"in i&&i.target.memory){let a=o&&o.cache&&"memory"in o.cache?o.cache.memory:void 0;if(so(a,i.target.memory)){let s=Rr.safeParse(n.value.cache);n.value.cache=eS(s.data,i),r.push(n)}}else if("fromTarget"in i||"toTarget"in i){let a=kh.optional().parse(n.value.cache);if(!a)continue;let s={from:a.fromTarget?.memory,to:a.toTarget?.memory},c={from:o&&o.cache&&"fromTarget"in o.cache?o.cache.fromTarget?.memory:void 0,to:o&&o.cache&&"toTarget"in o.cache?o.cache.toTarget?.memory:void 0};so(c,s)&&(n.value.cache=Xz(a,i),r.push(n))}}}return r}async function Kd({cacheStorage:t,logger:e,schemaVersion:r,stepLists:n,testId:o}){let i=Wd(n.steps),a=Wd(n.beforeSteps)??void 0,s=Wd(n.afterSteps)??void 0,c={steps:i,beforeSteps:a,afterSteps:s};try{await t.resolveStepCacheEntries({testId:o,stepLists:c,schemaVersion:r,logger:e})}catch(l){throw e.error({err:l},"Failed to resolve step cache entries"),new Error(`Failed to resolve step cache entries. Please ensure you are running using a supported version of Momentic. If you believe this is a Momentic issue, please contact Support with the following error: ${l}`)}return c}function zC(t){let e=[];for(let r of t){r.sort((a,s)=>a.timestamp-s.timestamp);let n=[],o,i=1;for(let a of r)o&&o.text===a.text&&o.type===a.type&&JSON.stringify(o.args??null)===JSON.stringify(a.args??null)?i++:(o&&(i>1?o.args&&o.args.length?o.args.push(`(repeated ${i} times)`):o.text+=` (repeated ${i} times)`:n.push(o)),o=a,i=1);o&&n.push(o),e.push(n)}return e}import{cloneDeep as LEe}from"lodash-es";import tS from"semver";function Yd(t,e){if(t!=="0.0.1"&&t!==e[e.length-1].toVersion)throw new Error("Please bump latestSchemaVersion in types package after adding a migration");e.forEach((r,n)=>{if(!tS.valid(r.toVersion)||!tS.valid(r.fromVersion))throw new Error(`Migration '${r.name}' has invalid version`);if(!tS.gt(r.toVersion,r.fromVersion))throw new Error(`Migration '${r.name}' has toVersion <= fromVersion`);if(n===0)return;if(e[n-1].toVersion!==r.fromVersion)throw new Error(`Migration '${r.name}' at index ${n} is not contiguous with previous migration`)})}import Jz from"diff-lines";import Qz,{gte as Zz}from"semver";function eH(t){return t.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function rS({metadata:t,steps:e,logger:r,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=t,c=o.findIndex(d=>Qz.gt(d.toVersion,a));if(c===-1)return{steps:i,newVersion:a};let l=a;for(let d=c;d<o.length;d++){if(n&&Zz(l,n)){r.debug("Stopping migration early because toVersion was reached");break}let p=o[d],m={id:s,migration:p.name,toVersion:p.toVersion};try{i=await HC(i,p),l=p.toVersion}catch(h){throw r.error({err:h,...m},"Migration failed"),new Error(`Step migration ${p.name} failed: ${h}`)}}let u=Jz(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&r.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function HC(t,e){let r=await e.execute(t);for(let n of r)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||eH(i)&&(n[o]=await HC(i,e))}return r}var GC={name:"Migrate API request body types",fromVersion:"0.0.1",toVersion:"0.0.2",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let r=e.command;if(!r||r.type!=="REQUEST")return e;let n=typeof r.body=="string"&&r.body.length>0?{type:"json",content:r.body}:void 0;return r.body=n,e})};var tH=[GC];Yd(sg,tH);var jC={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async t=>(t=t.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),t=t.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),t)};var VC={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let r=e.commands,n=r[r.length-1];return n&&n.type!=="SUCCESS"&&r.push({type:"SUCCESS"}),e})};var rH=["target","fromTarget","toTarget"];function $C(t){for(let e of rH){if(t[e]===void 0)continue;let r=t[e];r.elementDescriptor!==void 0?r.type="description":t[e]={type:"description",elementDescriptor:""}}}var WC={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":return $C(e.command),e;case"AI_ACTION":{let r=e.commands;for(let n of r??[])$C(n);return e}default:return e}})};import{v4 as nH}from"uuid";var qC={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=nH()),e;default:return e}})};import{v4 as KC}from"uuid";var YC={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let r=e.command;return r.id=r.id??KC(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(r=>({type:"PRESET_ACTION",command:{...r,id:r.id??KC()}})),delete e.commands),e;default:return e}})};var XC={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let r=e.command;return typeof r.type!="string"||r.type!=="AI_WAIT"||(r.type="AI_ASSERTION",r.timeout||(r.timeout=10)),e}default:return e}})};import{v4 as oH}from"uuid";var JC={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>("id"in e&&typeof e.id=="string"||(e.id=oH()),e))};import{v4 as QC}from"uuid";var ZC={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let r=e.condition;r.id||(r.id=QC())}return e.id=QC(),e})};var ew={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||typeof r.envKey!="string"||(e.envKey=r.envKey,delete r.envKey),e})};import{v4 as iH}from"uuid";var tw={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=iH()),e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||typeof r.envKey!="string"||(e.envKey=r.envKey,delete r.envKey),e})};var rw={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:r.option},e.option=void 0),e})};var nw={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return r&&ow(r),e})};function ow(t){t&&Object.keys(t).forEach(e=>{if(typeof t[e]=="object"&&t[e]){ow(t[e]);return}if(typeof t[e]!="string")return;let r=t[e];e==="code"?t[e]=r.replace(/inputs\./g,"env."):r.includes("{{")&&r.includes("}}")&&(t[e]=r.replace(/inputs\./g,"env."))})}var iw={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="TAB"||r.url===void 0||(r.action={type:"SUBSTRING",substring:r.url},r.url=void 0),e})};var aw={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="TYPE"?e:r.pressKeysSequentially===void 0?(r.delay=0,e):(r.pressKeysSequentially&&(r.pressKeysSequentially=void 0,r.delay=50),e)})};var sw={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="WAIT_FOR_URL"||r.url===void 0||(r.matcher={type:"GLOB",glob:r.url},r.url=void 0),e})};var lw={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;if(!r)return e;if(r.type==="SELECT_OPTION"){if(r.option===void 0)return e;r.choice={type:"VALUE",value:r.option},r.option=void 0}else if(r.type==="TAB"){if(r.url===void 0)return e;r.action={type:"SUBSTRING",substring:r.url},r.url=void 0}else if(r.type==="WAIT_FOR_URL"){if(r.url===void 0)return e;r.matcher={type:"GLOB",glob:r.url},r.url=void 0}else r.type==="AI_WAIT"&&(r.type="AI_ASSERTION",r.timeout||(r.timeout=10));return e})};var cw={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;return!r||r.type!=="MOCK_ROUTE"&&r.type!=="SET_HEADER"&&r.type!=="RECORD_REQUESTS"&&r.type!=="REGISTER_REQUEST_LISTENER"||(r.type==="REGISTER_REQUEST_LISTENER"||r.type==="RECORD_REQUESTS"?r.requestMatcher={urlMatcher:{type:"REGEX",regex:r.pattern}}:(r.type==="SET_HEADER"||r.type==="MOCK_ROUTE")&&r.urlPattern&&(r.requestMatcher={urlMatcher:{type:"REGEX",regex:r.urlPattern}})),e})};var uw={name:"Migrate API request body types",fromVersion:"1.0.21",toVersion:"1.0.22",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async t=>t.map(e=>{if(e.type!=="PRESET_ACTION")return e;let r=e.command;if(!r||r.type!=="REQUEST")return e;let n=typeof r.body=="string"&&r.body.length>0?{type:"json",content:r.body}:void 0;return r.body=n,e})};var dw={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async t=>t.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Xd=new Set(["CLICK","TYPE","SELECT_OPTION"]),pw={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e.command,n=r?.type,o=r?.elementDescriptor;return(o!==void 0||Xd.has(n))&&(r.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Xd.has(c))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,c=s?.elementDescriptor,l=s?.type;(c!==void 0||Xd.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||Xd.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var mw={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e;return r.status==="FAILURE"&&(r.status="FAILED"),typeof r.commands=="object"&&Array.isArray(r.commands)&&r.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),r}),stopOnFailure:!0};var hw={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async t=>t.map(e=>{let r=e.command,n=r?.type;return n?.startsWith("PRESET_")&&(r.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var gw=[dw,mw,hw,pw,jC,VC,WC,qC,YC,XC,JC,ZC,ew,tw,rw,nw,iw,aw,sw,lw,cw,uw];Yd(Me,gw);async function ps({metadata:t,steps:e,logger:r,toVersion:n}){return await rS({metadata:t,steps:e,logger:r,toVersion:n,migrations:gw})}import{z as $Ee}from"zod";import{diff as KEe}from"deep-object-diff";import{cloneDeep as XEe}from"lodash-es";import{v4 as cbe}from"uuid";import{cloneDeep as sH}from"lodash-es";import vw from"truncate-json";import{v4 as Sw}from"uuid";import{cloneDeep as Lbe,unset as Nbe}from"lodash-es";function fw(t){switch(t.type){case"AI_ACTION":return`AI action: ${ot(t.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${ot(t.text,100)}`;case"PRESET_ACTION":return ao(t.command);case"MODULE":return`Module ${t.moduleName??t.id}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section ${t.description?`with goal: ${ot(t.description,100)}`:""}`;default:return(r=>{throw new Error("You missed a case in the switch above")})(t)}}function lo(t){switch(t.type){case"AI_ACTION":return`AI action: ${ot(t.text,100)}`;case"AI_ACTION_DYNAMIC":return`AI action: ${ot(t.text,100)}`;case"PRESET_ACTION":return ao(t.command);case"MODULE":return`Module: ${t.id}`;case"RESOLVED_MODULE":return`Module: ${t.name}`;case"CONDITIONAL":return"Conditional step";case"SECTION":return`Section${t.description?`with goal: ${ot(t.description,100)}`:""}`;default:return(r=>{throw new Error("You missed a case in the switch above")})(t)}}function ms(t,e){return t.split(`
|
|
41
41
|
`).map(r=>" ".repeat(e)+r).join(`
|
|
@@ -50,7 +50,7 @@ ${n}`}function wH(t){let e=CH(t);return Gi({steps:e,earlyStop:!1,onPresetAction:
|
|
|
50
50
|
`)}catch(i){throw new Error(`Could not read test file ${r}: ${i}`)}let o;try{o=Es.parse(n)}catch(i){throw new Error(`Could not parse test file ${r} as YAML: ${i}`)}return Jt.parse(o)}function qi(t,e,r){let n=r.project.rootDir,o;try{o=Sn.readFileSync(t,"utf-8")}catch(a){throw e.error({err:a,projectRoot:n},a.message),new Error(a.message)}let i=Es.parse(o);if(!i.steps||!Array.isArray(i.steps))throw new Error(`Test ${t} is missing steps`);return i}async function mt(t,e,r){let n=qi(t,e,r),o;try{o=jr.parse(n)}catch(a){throw new Error(`Test ${t} is missing metadata or has invalid metadata: ${a}`)}let{resolvedTest:i}=await Lw({rawSteps:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},metadata:o,logger:e,callbacks:{onFetchModule:async({id:a,logger:s})=>{let c=r.modules[a]?.fullFilePath;if(c)return uo(c,s)}}});return i}import zH from"@dotenvx/dotenvx";import HH from"fs";import Kw from"path";function fp(t,e){return(t.config.environments??[]).map(r=>Ki(r.name,t,e))}function Yw(t){return t.includes("${")?t.replace(/\$\{([^}]+)\}/g,(e,r)=>{let n=r.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!n)return process.env[r]||"";let o=n[1];if(!o)return"";let i=n[2],a=n[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):t}function GH(t){let{envVariables:e,project:r}=t;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=Yw(i);s&&(n[o]=s);continue}let a;try{a=HH.readFileSync(Kw.resolve(r.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&b.debug(n,"Set environment variables with interpolation from project configuration"),n}function jH(t){let{project:e,envFile:r,logger:n}=t,o={};if(!r)return o;let i=zH.config({path:Kw.resolve(e.rootDir,r),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug("Set environment variables from .env file"),o}function Ki(t,e,r){let n=(e.config.environments??[]).find(c=>c.name===t);if(!n)throw new Error(`Environment ${t} not found in local project configuration file`);if(!n.baseUrl)throw new Error(`Browser environment ${t} does not have a baseUrl configured`);let o={[At]:Yw(n.baseUrl)},i=GH({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=jH({project:e,envFile:n.envFile,logger:r});return Object.assign(o,a),n.inheritFromShell&&(r.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:t,variables:o,browser:n.browser}}import{existsSync as $H,readFileSync as WH,readdirSync as qH,writeFileSync as KH}from"fs";import{glob as YH}from"glob";import Yi,{dirname as Xw}from"path";import{cwd as SS}from"process";import Jw from"yaml";import{z as Xe}from"zod";import VH from"zod";var Sp=["**/*.test.yaml","**/*.module.yaml"],fS=VH.string().refine(t=>/^[a-zA-Z0-9-]+$/.test(t)),yp=15;var bs="momentic.config.yaml",yS="momentic.workspace.yaml",XH=Xe.object({projects:Xe.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),JH=Xe.union([Xe.string(),Xe.object({fromFile:Xe.string(),json:Xe.boolean().optional()})]),QH=Xe.object({name:fS,baseUrl:Xe.string().optional().describe("Optional for mobile tests"),envFile:Xe.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Xe.record(Xe.string(),JH).optional(),inheritFromShell:Xe.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Pi.optional().describe("NB: most things should use project-level configuration only")}),ZH=Xe.object({postSave:Xe.string().optional()}),e1=Xe.object({name:fS,include:Xe.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Xe.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Xe.string().optional(),reporterDir:Xe.string().optional(),outputDir:Xe.string().optional(),recordVideo:Xe.boolean().optional(),retries:Xe.number().optional().describe("number of retries per test"),parallel:Xe.number().optional().describe("degree of parallelism"),environments:Xe.array(QH).optional(),gitMainBranch:Xe.string().optional().readonly(),gitProtectedBranches:Xe.string().array().optional().readonly(),ai:Rf.optional(),browser:Pi.optional(),emulator:mf.optional(),advanced:Cf.optional(),displayRoot:Xe.string().optional().describe("relative path from project root to use as the Repository root"),hooks:ZH.optional()});function Qw(t,e){let r;try{r=WH(t,"utf-8")}catch(o){b.warn(`Could not read possible Momentic ${e} file at ${t}: ${o}`);return}let n;try{if(n=Jw.parse(r),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){b.warn(`Possible Momentic ${e} file at ${t} does not parse as valid YAML: ${o}`);return}return n}function ES(t){let e=Qw(t,"project configuration");if(e!==void 0)try{return e1.parse(e)}catch(r){b.warn(`Possible Momentic project configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function t1(t){let e=Qw(t,"workspace configuration");if(e!==void 0)try{return XH.parse(e)}catch(r){b.warn(`Possible Momentic workspace configuration file at ${t} does not adhere to the required schema: ${r}`);return}}function r1(){let t=[],e=SS(),r=Yi.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=Yi.basename(e);if(wd.includes(i))return b.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),t;for(let a of qH(e))if(a.endsWith(bs)){let s=Yi.join(e,a),c=ES(s);c&&t.push({configFilePath:s,config:c,rootDir:Xw(s)})}if(t.length)return t;if(e=Yi.dirname(e),e===r)break}return t}async function _t(t={}){let{configFilePath:e,nameFilter:r}=t,n=await bS(e);if(r&&(n=n.filter(o=>o.config.name===r)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
|
|
51
51
|
${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return b.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function n1(t){let e=t1(t);if(!e||!e.projects||!e.projects.length)return;let r=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${bs}`)),n=AbortSignal.timeout(2e3),o;try{o=await YH(r,{absolute:!1,cwd:SS(),dotRelative:!1,maxDepth:yp,nodir:!0,signal:n})}catch(a){throw b.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${yS} is misconfigured.`),a}let i=[];for(let a of o){let s=Yi.join(SS(),a),c=ES(s);c&&i.push({configFilePath:s,config:c,rootDir:Xw(s)})}return i}async function bS(t){if(t){t=Yi.resolve(t);let r=ES(t);return r||(console.error(`No valid Momentic project file found at ${t}.`),process.exit(1)),[{config:r,configFilePath:t,rootDir:Yi.dirname(t)}]}if($H(yS)){let r=await n1(yS);if(r)return r}return r1()}function Yo(t,e){let r=Jw.stringify(t);KH(e,r)}import ex from"fs";import{glob as o1}from"glob";import bc from"path";import i1 from"yaml";import{z as Zw}from"zod";var tx=!1,a1=Zw.object({fileType:Zw.nativeEnum(ye)});async function ee(t,e=!1){let r={project:t,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=t.config.include??Sp,o=Array.from(t.config.exclude??[]).concat(xd),i=AbortSignal.timeout(5e3),a;try{a=await o1(n,{absolute:!1,cwd:t.rootDir,ignore:o,dotRelative:!1,maxDepth:yp,nodir:!0,signal:i})}catch(s){throw b.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let c=s1(t.rootDir,s,r,e?On:b);c&&(r.duplicateEntities[c.id]=c.paths)}return tx=!0,r}function s1(t,e,r,n){let o=bc.join(t,e),i=l1(o,n);if(!i)return;let a=c1(i,o,n);if(!a)return;let s=a1.safeParse(a);if(s.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let c=s.data.fileType,l=u1(o,n);if(!l)return;let u=d1(e,o,l);switch(c){case ye.TEST:try{return p1(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case ye.MODULE:try{return m1(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case ye.MOBILE_TEST:try{return g1(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case ye.MOBILE_MODULE:try{return h1(a,r,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile module metadata: ${d}`);return}default:{let d=c;return}}}function l1(t,e){try{return ex.readFileSync(t,"utf-8")}catch(r){e.warn(`Could not read possible Momentic file at ${t}, skipping: ${r}`);return}}function c1(t,e,r){try{let n=i1.parse(t);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return n}catch(n){r.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function u1(t,e){try{return ex.statSync(t)}catch(r){e.warn(`Skipping path '${t}' because it could not be stat, skipping: ${r}`);return}}function d1(t,e,r){return{relativePath:t,fullFilePath:e,platformSep:bc.sep,fullPathSegments:e.split(bc.sep),relativePathSegments:t.split(bc.sep),fileName:bc.basename(e),lastModified:r.mtime,createdAt:r.birthtime}}function p1(t,e,r,n,o){let i=jr.parse(t),a;if(e.tests[i.id]){let s=e.tests[i.id].fullFilePath;a={id:i.id,paths:[s,n]}}return e.tests[i.id]={type:ye.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}function m1(t,e,r,n,o){let i=Sr.parse(t),a;if(e.modules[i.moduleId]){let c=e.modules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}e.modules[i.moduleId]={type:ye.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...r};let s=r.fileName.replace(".module.yaml","");return!tx&&He(i.name)!==s&&o.warn(`The module with ID ${i.moduleId} has a name (${i.name}) that does not match its file name (${s}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),a}function h1(t,e,r,n,o){let i=Ad.parse(t),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=r.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:ye.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...r},a}function g1(t,e,r,n,o){let i=es.parse(t),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=r.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:ye.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...r},a}import Ts from"fs";import TS from"path";import{z as vS}from"zod";var rx="golden/visual-diff",nx="reports",ox="test-results";var f1=vS.object({width:vS.number(),height:vS.number()}),vs=class{defaultGoldenScreenshotDir;regenerateGoldenFiles;apiClient;constructor(e,r,n){let o=TS.join(e.rootDir,e.config.goldenFileDir??rx);this.defaultGoldenScreenshotDir=o,this.regenerateGoldenFiles=n,this.apiClient=r}async prepareGoldenScreenshotForComparison(e,r,n){if(Xb(r.screenshot?.data))return{buffer:(await this.apiClient.fetchOnDemandScreenshot(r.screenshot.data.id)).data,width:r.screenshot.width,height:r.screenshot.height};if(r.screenshot?.data?.startsWith("https://")){let a=await fetch(r.screenshot.data);return{buffer:Buffer.from(await a.arrayBuffer()),width:r.screenshot.width,height:r.screenshot.height}}let o=r.screenshot?.data;o||(o=TS.join(this.defaultGoldenScreenshotDir,`${r.id}.jpg`));let i=`${o}.metadata.json`;if(this.regenerateGoldenFiles)return Ts.mkdirSync(TS.dirname(o),{recursive:!0}),Ts.writeFileSync(o,n.buffer),Ts.writeFileSync(i,JSON.stringify({width:n.width,height:n.height})),{buffer:Buffer.from(n.buffer),width:n.width,height:n.height};if(Ts.existsSync(o)){let a=Ts.readFileSync(o),s=f1.parse(JSON.parse(Ts.readFileSync(i,"utf-8")));return{buffer:a,width:s.width,height:s.height}}else throw new M("UserConfigurationError",`Cannot execute visual diff without a saved baseline screenshot at ${o}`)}};import{execFile as S1}from"node:child_process";import{promisify as y1}from"node:util";import E1 from"simple-git";var Ze=E1(),ix=y1(S1);function po(t){if(t)try{let e=new Date(t);return isNaN(e.getTime())?void 0:e}catch{return}}async function b1(t){let e=await it(t,Ze.raw(["config","--list"])),r={};if(!e)return r;for(let n of e.split(`
|
|
52
52
|
`)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();r[i]=a}return r}async function T1(t,e,r){try{let o=r["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await ix("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await ix("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function v1(t,e,r){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return T1(t,e,r);if(o)return}catch{}}function Ep(t){if(t.startsWith("git@")){let e=t.split(":");if(e.length===2){let r=e[1].replace(".git","").split("/");if(r.length===2){let n=r[0],o=r[1];return`${n}/${o}`}}}else if(t.startsWith("http")||t.startsWith("https")){let r=new URL(t).pathname.split("/").filter(Boolean);if(r.length>=2){let n=r[0],o=r[1].replace(".git","");return`${n}/${o}`}}}async function it(t,e){try{return(await e).trim()}catch(r){if(r instanceof Error&&r.message.includes("not a git repository"))return;t.error({err:r},"Failed to run git command");return}}function A1(){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";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild";if(process.env.MOMENTIC_GIT_OVERRIDE)return"Custom"}async function R1(t){let[e,r,n]=await Promise.all([it(t,Ze.show(["--no-patch","--format=%ci"])),it(t,Ze.show(["-s","--pretty=%B"])),it(t,Ze.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?po(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function C1(t){let[e,r,n]=await Promise.all([it(t,Ze.listRemote(["--get-url","origin"])),it(t,Ze.show(["-s","--pretty=%B"])),it(t,Ze.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?po(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:r,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function w1(t){let[e,r,n,o]=await Promise.all([it(t,Ze.show(["--no-patch","--format=%ci"])),it(t,Ze.listRemote(["--get-url","origin"])),it(t,Ze.show(["-s","--pretty=%B"])),it(t,Ze.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??r,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Ep(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?po(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function x1(t){let[e,r,n]=await Promise.all([it(t,Ze.show(["--no-patch","--format=%ci"])),it(t,Ze.show(["-s","--pretty=%B"])),it(t,Ze.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ep(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?po(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function _1(t){let[e,r,n]=await Promise.all([it(t,Ze.show(["--no-patch","--format=%ci"])),it(t,Ze.show(["-s","--pretty=%B"])),it(t,Ze.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ep(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?po(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:r,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function M1(t,e){let[r,n,o,i,a,s,c,l,u]=await Promise.all([it(t,Ze.revparse(["HEAD"])),it(t,Ze.revparse(["--short","HEAD"])),it(t,Ze.revparse(["--abbrev-ref","HEAD"])),it(t,Ze.listRemote(["--get-url","origin"])),it(t,Ze.show(["--no-patch","--format=%ci"])),it(t,Ze.show(["-s","--pretty=%B"])),it(t,Ze.show(["-s","--pretty=%an"])),e?it(t,Ze.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),b1(t)]),d=l?await it(t,Ze.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),h=i?Ep(i):void 0,g=u["user.email"]||void 0,f=u["user.name"]||void 0,S=u["user.username"]||void 0,y=await v1(t,i,u)??S??void 0;return{ciProvider:"none",gitCommitSha:r,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?po(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:y,gitLocalEmail:g,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?po(d):void 0,githubRepository:p?h:void 0,gitlabProjectPath:m?h:void 0,pipelineId:void 0}}async function I1(){let t=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:t?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:t?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}function P1(){return{ciProvider:"Custom",gitCommitSha:process.env.GIT_COMMIT_SHA,gitCommitShaShort:process.env.GIT_COMMIT_SHA_SHORT??process.env.GIT_COMMIT_SHA?.slice(0,6),gitCommitTimestamp:po(process.env.GIT_COMMIT_TIMESTAMP),gitBranchName:process.env.GIT_BRANCH_NAME,gitOriginUrl:process.env.GIT_ORIGIN_URL,gitCommitAuthorName:process.env.GIT_COMMIT_AUTHOR_NAME,gitCommitMessage:process.env.GIT_COMMIT_MESSAGE,lastCommitOnMainSha:process.env.LAST_COMMIT_ON_MAIN_SHA,lastCommitOnMainTimestamp:po(process.env.LAST_COMMIT_ON_MAIN_TIMESTAMP),mergedGitBranchName:process.env.MERGED_GIT_BRANCH_NAME,githubRepository:process.env.GITHUB_REPOSITORY,gitlabProjectPath:process.env.GITLAB_PROJECT_PATH,gitLocalUsername:process.env.GIT_USERNAME,gitLocalEmail:process.env.GIT_EMAIL,gitLocalName:process.env.GIT_NAME}}async function O1(t){let e=[...t.config.gitProtectedBranches??[]];return t.config.gitMainBranch&&e.push(t.config.gitMainBranch),{gitMainBranch:t.config.gitMainBranch,gitProtectedBranches:e}}async function mo(t,e){let r=A1();if(!r)return M1(t,e);switch(r){case"GithubActions":return R1(t);case"GitlabCI":return C1(t);case"CircleCI":return w1(t);case"Buildkite":return x1(t);case"AzureDevOps":return _1(t);case"GCPCloudBuild":return I1();case"Custom":return P1()}}async function L1(t,e,r,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(r,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){t.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(r,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){t.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(r,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){t.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function N1(t,e,r,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(r,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){t.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(r,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){t.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(r,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){t.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function D1(t,e,r){try{if(r.githubRepository){let[n,o]=r.githubRepository.split("/");return await N1(t,e,n,o,r)}else if(r.gitlabProjectPath)return await L1(t,e,r.gitlabProjectPath,r)}catch(n){t.warn({err:n},"Failed to get remote git metadata")}return r}async function $r(t,e,r){let n=await O1(r),o=await mo(t,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await D1(t,e,i);return{...n,...o,...a}}async function ax(){try{return!!(await Ze.show(["--no-patch","--format=%ci"])).trim()}catch{return null}}import{diff as mwe}from"deep-object-diff";import{cloneDeep as gwe}from"lodash-es";import{v4 as xwe}from"uuid";import Mwe from"yaml";import Vwe from"yaml";import Wwe from"zod";import{randomUUID as k1}from"crypto";import Xo from"fs";import As from"path";var sx=new Set([".DS_Store","__MACOSX"]),lx={status:(t,e)=>{if(t.status===e.status)return t.status;if(t.status==="FAILED"||e.status==="FAILED")return"FAILED";if(t.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(t.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(t.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(t.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${t.status} and ${e.status}`)},startedAt:(t,e)=>t.startedAt<e.startedAt?t.startedAt:e.startedAt,updatedAt:(t,e)=>t.updatedAt>e.updatedAt?t.updatedAt:e.updatedAt,finishedAt:(t,e)=>!t.finishedAt||!e.finishedAt?new Date:t.finishedAt>e.finishedAt?t.finishedAt:e.finishedAt,gitCommitTimestamp:(t,e)=>{if(!(!t&&!e)){if(!t.gitCommitTimestamp||!e.gitCommitTimestamp||t.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${t.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return t.gitCommitTimestamp}},pipelineId:(t,e)=>t.pipelineId===e.pipelineId?t.pipelineId:!t.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&t.pipelineId?t.pipelineId:t.startedAt<e.startedAt?e.pipelineId:t.pipelineId,labels:(t,e)=>{let r=new Set([...t.labels??[],...e.labels??[]]);return Array.from(r)}};function F1(t,e,r){if(lx[r]){let i=lx[r];return i(t,e)}let n=t[r],o=e[r];if(n!==o)throw new Error(`Metadata values for key "${r}" do not match: "${n}" vs "${o}"`);return n}var AS=class extends Error{constructor(e,r){let n=`${e} contains invalid Momentic results: ${r}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function cx(t,e){try{let r=As.join(e,"metadata.json");return Ld.parse(JSON.parse(Xo.readFileSync(r,"utf-8")))}catch{throw new AS(t,e)}}function ux(t,e,r){let n=k1(),o=t.child({runGroupId:n});Xo.rmSync(e,{recursive:!0,force:!0});let i=Xo.readdirSync(r).filter(c=>!sx.has(c)).map(c=>As.join(r,c));if(i.length===0)throw new Error(`No run groups found in results path: ${r}`);Xo.mkdirSync(e,{recursive:!0});let a={...cx(r,i[0]),id:n};for(let c of i){let l=As.join(c,"runs");if(!Xo.existsSync(l))continue;let u=cx(r,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=F1(a,u,m)}let d=Xo.readdirSync(l);for(let p of d){if(sx.has(p))continue;let m=As.join(l,p),h=As.join(e,"runs",p);Xo.cpSync(m,h,{recursive:!0})}}let s=As.join(e,"metadata.json");Xo.writeFileSync(s,JSON.stringify(a,null,2))}import dx from"adm-zip";import RS from"fs";import bp from"path";function U1(t){let e=new dx,r=bp.join(t,"metadata.json"),n=Ld.parse(JSON.parse(RS.readFileSync(r,"utf-8")));e.addLocalFile(r);for(let o of RS.readdirSync(bp.join(t,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new dx(bp.join(t,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(bp.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function Tp(t){let{client:e,consoleLogger:r,resultsPath:n}=t;if(!RS.existsSync(n)){r.warn("Results path does not exist, skipping upload.");return}let o=new zd(e);try{let{runGroupId:i,buffer:a}=U1(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;r.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",r.error(`Failed to upload test results: ${a}.`);return}}import B1 from"adm-zip";import Ht from"fs";import _r from"path";var Tc=class t{constructor(e){this.filePath=e;Ht.rmSync(this.filePath,{recursive:!0,force:!0}),Ht.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new t(_r.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){Ht.mkdirSync(_r.join(this.filePath,e),{recursive:!0})}readFile(e){let r=_r.join(this.filePath,e);if(Ht.existsSync(r))return Ht.readFileSync(r)}storeFile(e){let{name:r,contents:n}=e,o=_r.join(this.filePath,r);try{Ht.writeFileSync(o,n)}catch{}}createFileStream(e){let r=_r.join(this.filePath,e);return Ht.createWriteStream(r)}createRunArchive(e){return new CS(_r.join(this.filePath,"runs"),e)}},CS=class{constructor(e,r){this.filePath=e;this.tempPath=_r.join(e,`temp-storage-${r}`),this.finalPath=_r.join(e,`${r}.zip`),Ht.rmSync(this.tempPath,{recursive:!0,force:!0}),Ht.rmSync(this.finalPath,{recursive:!0,force:!0}),Ht.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let r=_r.join(this.tempPath,e);if(Ht.existsSync(r))return Ht.readFileSync(r)}mkdir(e){Ht.mkdirSync(_r.join(this.tempPath,e),{recursive:!0})}cd(e){return new Tc(_r.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:r,contents:n}=e,o=_r.join(this.tempPath,r);Ht.writeFileSync(o,n)}createFileStream(e){let r=_r.join(this.tempPath,e);return Ht.createWriteStream(r)}close(){let e=new B1;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let r=e.toBuffer();Ht.writeFileSync(this.finalPath,r),Ht.rmSync(this.tempPath,{recursive:!0,force:!0})}};import z1 from"adm-zip";import{randomUUID as H1}from"crypto";import Ot from"fs";import Gt from"path";function gx(t){try{return Ot.existsSync(t)?JSON.parse(Ot.readFileSync(t,"utf-8")):void 0}catch{return}}function px(t){return Ot.existsSync(t)?Ot.readFileSync(t,"utf-8").split(`
|
|
53
|
-
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function G1(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Gt.join(t.inflatedPath,"attempts",r);let n=Gt.join(t.inflatedPath,"attempts");if(!Ot.existsSync(n))return;let o=Ot.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Gt.join(n,i,"metadata.json"),s=gx(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),Gt.join(n,i)}}function mx(t,e,r){let n=Gt.join(t,"attempts");if(!Ot.existsSync(n))return;let o=Ot.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Gt.join(n,i,"assets",`${e}.${r}`);if(Ot.existsSync(a))return a}}var vp=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Gt.join(e,"runs"),this.zipPath=Gt.join(this.runsDir,`${r}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let r=this.inflatedByRunId.get(e);if(r)return r;if(e!==this.runId||!Ot.existsSync(this.zipPath))return;let n=Gt.join(this.runsDir,`temp-unzipped-${e}-${H1()}`);Ot.mkdirSync(n,{recursive:!0}),new z1(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())Ot.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return G1(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Gt.join(e,"assets");return Ot.existsSync(r)?Ot.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Gt.join(r,o.name)).filter(o=>{let i=Gt.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Gt.join(n,"assets",`${e}.${r}`);if(Ot.existsSync(o))try{return Ot.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=gx(Gt.join(o,"console.json")),a=hf.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=Gt.join(o,"assets","har-pages.log"),a=Gt.join(o,"assets","har-entries.log"),s={};for(let u of px(i)){let d=Ql.safeParse(hx(u));d.success&&(s[d.data.id]=d.data)}let c={},l=px(a);for(let u=0;u<l.length;u++){let d=l[u],p=Zl.safeParse(hx(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return ff(s,c)}async getHtmlSnapshot(e,r){let n=this.readAttemptAssetText(r,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=mx(o.inflatedPath,r,"html");if(i)try{return Ot.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,r){let n=this.readAttemptAssetText(r,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=mx(o.inflatedPath,r,"xml");if(i)try{return Ot.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?Gt.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return Ot.readFileSync(i)}catch{return}}};function hx(t){try{return JSON.parse(t)}catch{return}}import{hostname as j1}from"os";var V1="2.33.2",vc=as({app:"desktop-server",hostname:j1(),disableConsoleLogs:!0}).child({cliVersion:V1});(async()=>{try{let t=await mo(vc);t.gitBranchName&&vc.addBinding("branch",t.gitBranchName)}catch{}})();var fx=$1();fx.get("/",async(t,e)=>{let r=pe(),n=pp();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await $r(vc,n,r);e.status(200).json(o)});var wS=fx;import s5 from"events";import AN,{Router as l5}from"express";import c5 from"http";import u5 from"path";import{Server as m2}from"socket.io";var W1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{e.info({sessionId:n},"Cancel event received");let o=r.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},Sx={event:"cancel",createHandler:W1};var q1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},yx={event:"fetchA11yTree",createHandler:q1};var K1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},Ex={event:"fetchDom",createHandler:K1};var Y1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),r.removeSession(n,e)}},bx={event:"disconnect",createHandler:Y1};function Wr(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=X1(r);J1(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await Q1(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function X1(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":{r=e;break}case"CONDITIONAL":r=t[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){r=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(r)break}let n=t[t.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:r,lastMetadata:o}}function J1(t,e,r){e&&(t.beforeUrl=e.beforeUrl),r&&(t.afterUrl=r.afterUrl,t.data=r.data,r.status!=="SUCCESS"&&(t.message=r.message))}async function Q1(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as cG}from"crypto";import{faker as Z1}from"@faker-js/faker";import eG from"assert";import tG from"axios";import*as rG from"child_process";import nG from"moment";import*as oG from"otpauth";import iG from"pg";async function Tx(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=Ed(n,e);r.push(...o)}),r}function aG(t,e){if(!t&&!e)return;let r;if(t){let{url:o,options:i}=t;r=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:r,response:n}}async function sG(t,e){switch(t){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let r=[];return e.headers.forEach((o,i)=>{r.push([i,o])}),{status:e.status,headers:r,body:await e.text()}}else throw new Error("Result is not a Response object")}}var lG=Object.getPrototypeOf(async function(){}).constructor;async function vx(t,e,r){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(E,T)=>{o[E]=T,l[E]=T},d={},p=(E,T)=>{o[E]=T,d[E]=T},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let h;n.includes("createAppAuth")&&(h=(await import("@octokit/auth-app")).createAppAuth);let g=async()=>await Promise.resolve(new lG("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(tG,nG,c.fakerInstance??Z1,eG,iG,m,h,oG,rG,Tx,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,T=>c.sms.send(T),T=>c.sms.fetchLatest(T),c.email,c.sms,c.ai,aG(a,s),...Object.values(i??{}))),f=!0,S,y;try{let E=await V(g(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await sG(e.options.responseSerialization??"RAW",E)}catch(E){r.error({err:E,env:o,evalCode:n},`[${t}] Error executing code: ${E}`),f=!1,E instanceof Vo?y=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:y=E instanceof Error?E.message:`${E}`}return{result:S,variableUpdates:l,persistentVariableUpdates:d,success:f,error:y}}async function Ax({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=zo,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=cG(),p=await vx(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...r.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return b.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as uG,randomUUID as dG}from"crypto";import pG from"fetch-retry";var mG=pG(global.fetch,{retries:3,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),Rx=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,Cx=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function wx({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=zo,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!Rx)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,h=0;if(!Cx)throw new Error("Missing lambda auth secret.");let g=uG("sha256",Cx).update(t).digest("hex");for(;h<=i;){h++,a?.throwIfAborted();let S={id:dG(),orgId:t,momenticLambdaAuthHash:g,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await V(mG(Rx,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(y){m=y}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let f;try{f=NA.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Jo(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await wx(t);else if(t.localTools)e=await Ax({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
53
|
+
`).map(r=>r.trim()).filter(r=>r.length>0):[]}function G1(t,e){let r=t.attemptIdToAttemptNumber.get(e);if(r)return Gt.join(t.inflatedPath,"attempts",r);let n=Gt.join(t.inflatedPath,"attempts");if(!Ot.existsSync(n))return;let o=Ot.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Gt.join(n,i,"metadata.json"),s=gx(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return t.attemptIdToAttemptNumber.set(e,i),Gt.join(n,i)}}function mx(t,e,r){let n=Gt.join(t,"attempts");if(!Ot.existsSync(n))return;let o=Ot.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=Gt.join(n,i,"assets",`${e}.${r}`);if(Ot.existsSync(a))return a}}var vp=class{constructor(e,r,n){this.outputDir=e;this.runId=r;this.runAttemptId=n;this.runsDir=Gt.join(e,"runs"),this.zipPath=Gt.join(this.runsDir,`${r}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let r=this.inflatedByRunId.get(e);if(r)return r;if(e!==this.runId||!Ot.existsSync(this.zipPath))return;let n=Gt.join(this.runsDir,`temp-unzipped-${e}-${H1()}`);Ot.mkdirSync(n,{recursive:!0}),new z1(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())Ot.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return G1(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let r=Gt.join(e,"assets");return Ot.existsSync(r)?Ot.readdirSync(r,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>Gt.join(r,o.name)).filter(o=>{let i=Gt.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,r){let n=this.getAttemptDir();if(!n)return;let o=Gt.join(n,"assets",`${e}.${r}`);if(Ot.existsSync(o))try{return Ot.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=gx(Gt.join(o,"console.json")),a=hf.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,r,n){if(r!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=Gt.join(o,"assets","har-pages.log"),a=Gt.join(o,"assets","har-entries.log"),s={};for(let u of px(i)){let d=Ql.safeParse(hx(u));d.success&&(s[d.data.id]=d.data)}let c={},l=px(a);for(let u=0;u<l.length;u++){let d=l[u],p=Zl.safeParse(hx(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return ff(s,c)}async getHtmlSnapshot(e,r){let n=this.readAttemptAssetText(r,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=mx(o.inflatedPath,r,"html");if(i)try{return Ot.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,r){let n=this.readAttemptAssetText(r,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=mx(o.inflatedPath,r,"xml");if(i)try{return Ot.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,r){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?Gt.join(o,"assets",`${r}.jpeg`):void 0;if(i)try{return Ot.readFileSync(i)}catch{return}}};function hx(t){try{return JSON.parse(t)}catch{return}}import{hostname as j1}from"os";var V1="2.33.3",vc=as({app:"desktop-server",hostname:j1(),disableConsoleLogs:!0}).child({cliVersion:V1});(async()=>{try{let t=await mo(vc);t.gitBranchName&&vc.addBinding("branch",t.gitBranchName)}catch{}})();var fx=$1();fx.get("/",async(t,e)=>{let r=pe(),n=pp();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await $r(vc,n,r);e.status(200).json(o)});var wS=fx;import s5 from"events";import AN,{Router as l5}from"express";import c5 from"http";import u5 from"path";import{Server as m2}from"socket.io";var W1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{e.info({sessionId:n},"Cancel event received");let o=r.getSession(n);if(!o)throw new Error("No active session found");try{o.controller.setClosed()}catch{}}},Sx={event:"cancel",createHandler:W1};var q1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let l=(await s.getBrowserState({skipWait:!0})).serialize();e.debug({a11yTree:l},"Fetched a11y tree from the browser"),i({a11yTree:l})}catch(c){e.error({err:c},"Error fetching a11y tree from the browser"),i({err:c.message})}}},yx={event:"fetchA11yTree",createHandler:q1};var K1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async(o,i)=>{let a=r.getSession(n);if(!a)throw new Error("No active session found");a.controller.setOpen();let s=a.controller.browser;try{let c=await s.html();i({html:c})}catch(c){e.error({err:c},"Error fetching DOM from the browser"),c.name==="TimeoutError"?i({err:"Timed out fetching DOM tree. This page may be too large for Momentic to process."}):i({err:c.message})}}},Ex={event:"fetchDom",createHandler:K1};var Y1=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return o=>{e.info({sessionId:n,reason:o},`Disconnect event received (${o})`),r.removeSession(n,e)}},bx={event:"disconnect",createHandler:Y1};function Wr(t){let{result:e,nestedResults:r}=t;if(!t.nestedResults.length)return;let{firstMetadata:n,lastMetadata:o}=X1(r);J1(e,n,o);let i=[...t.asyncTasks];t.asyncTasks.push((async()=>{try{await Q1(i,e,n,o)}catch(a){t.logger.error({result:t.result,err:a},"Error hoisting scalar result metadata")}})())}function X1(t){let e=t[0],r;for(;;){switch(e.type){case"PRESET_ACTION":{r=e;break}case"CONDITIONAL":r=t[0];break;case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"MODULE":case"SECTION":if(!e.results.length){r=e;break}e=e.results[0];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}if(r)break}let n=t[t.length-1],o;for(;;){switch(n.type){case"PRESET_ACTION":{o=n;break}case"AI_ACTION_DYNAMIC":case"CONDITIONAL":case"AI_ACTION":case"MODULE":case"SECTION":if(!n.results.length){o=n;break}n=n.results[n.results.length-1];break;default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}if(o)break}return{firstMetadata:r,lastMetadata:o}}function J1(t,e,r){e&&(t.beforeUrl=e.beforeUrl),r&&(t.afterUrl=r.afterUrl,t.data=r.data,r.status!=="SUCCESS"&&(t.message=r.message))}async function Q1(t,e,r,n){await Promise.allSettled(t),r&&(e.beforeSnapshot=r.beforeSnapshot),n&&(e.afterSnapshot=n.afterSnapshot)}import{randomUUID as cG}from"crypto";import{faker as Z1}from"@faker-js/faker";import eG from"assert";import tG from"axios";import*as rG from"child_process";import nG from"moment";import*as oG from"otpauth";import iG from"pg";async function Tx(t){let e;try{e=new URL(t.url).hostname}catch{}let r=[];return t.headers.getSetCookie()?.forEach(n=>{let o=Ed(n,e);r.push(...o)}),r}function aG(t,e){if(!t&&!e)return;let r;if(t){let{url:o,options:i}=t;r=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:r,response:n}}async function sG(t,e){switch(t){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let r=[];return e.headers.forEach((o,i)=>{r.push([i,o])}),{status:e.status,headers:r,body:await e.text()}}else throw new Error("Result is not a Response object")}}var lG=Object.getPrototypeOf(async function(){}).constructor;async function vx(t,e,r){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(E,T)=>{o[E]=T,l[E]=T},d={},p=(E,T)=>{o[E]=T,d[E]=T},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let h;n.includes("createAppAuth")&&(h=(await import("@octokit/auth-app")).createAppAuth);let g=async()=>await Promise.resolve(new lG("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(tG,nG,c.fakerInstance??Z1,eG,iG,m,h,oG,rG,Tx,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,T=>c.sms.send(T),T=>c.sms.fetchLatest(T),c.email,c.sms,c.ai,aG(a,s),...Object.values(i??{}))),f=!0,S,y;try{let E=await V(g(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});S=await sG(e.options.responseSerialization??"RAW",E)}catch(E){r.error({err:E,env:o,evalCode:n},`[${t}] Error executing code: ${E}`),f=!1,E instanceof Vo?y=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:y=E instanceof Error?E.message:`${E}`}return{result:S,variableUpdates:l,persistentVariableUpdates:d,success:f,error:y}}async function Ax({code:t,fragment:e,context:r,localTools:n,logger:o,signal:i,timeoutMs:a=zo,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=cG(),p=await vx(d,{code:t,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...r.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return b.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as uG,randomUUID as dG}from"crypto";import pG from"fetch-retry";var mG=pG(global.fetch,{retries:3,retryOn:function(t,e,r){return!!(e!==null||r&&r.status>=500)},retryDelay:function(t){return Math.pow(2,t)*500}}),Rx=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,Cx=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function wx({orgId:t,code:e,fragment:r,context:n,timeoutMs:o=zo,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!Rx)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,h=0;if(!Cx)throw new Error("Missing lambda auth secret.");let g=uG("sha256",Cx).update(t).digest("hex");for(;h<=i;){h++,a?.throwIfAborted();let S={id:dG(),orgId:t,momenticLambdaAuthHash:g,code:e,fragment:r,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await V(mG(Rx,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(S)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(y){m=y}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let f;try{f=NA.parse(await p.json())}catch(S){throw new Error(`Code evaluation server returned invalid response: ${S}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Jo(t){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await wx(t);else if(t.localTools)e=await Ax({...t,localTools:t.localTools});else throw new Error("No code evaluation environment available");if(e.error){let r=`Failed to evaluate code:
|
|
54
54
|
${e.error}
|
|
55
55
|
Code received:
|
|
56
56
|
${t.code}`;throw t.logger.error({err:e.error,code:t.code,env:t.context.toObjectCopy()},r),new Error(r)}if(e.variableUpdates)for(let[r,n]of Object.entries(e.variableUpdates))t.context.setVariable(r,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await t.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[r,n]of Object.entries(e.persistentVariableUpdates))t.context.setVariable(r,n)}return e.result}import{set as hG}from"lodash-es";async function mr(t){let{orgId:e,s:r,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=zo,allowUndefined:c=!1}=t,l=/{{(.*?)}}/g,u=r.matchAll(l),d=r;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),h;try{h=await Jo({orgId:e,code:m,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:t.localTools,signal:i})}catch(f){throw o.error({err:f,value:r},"Error evaluating template string"),f}if(h===void 0&&!c)throw new M("UserConfigurationError",`Template fragment '${m}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let g=typeof h=="string"?h:`${h}`;g=g.replaceAll(/\$/g,"$$$$"),d=d.replace(p[0],g)}return d}async function Ap(t){return xx(t)}async function xx({obj:t,bannedKeys:e,allowList:r,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in t){if(e.includes(s))continue;let c=!1;if(r)if(r.includes(s))c=!0;else continue;let l=t[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await mr({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),t[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await xx({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:r,...a})}return i}function _x(t,e){for(let{path:r,original:n}of e)hG(t,r,n)}import gG from"fetch-retry";var EMe=process.env.MAILINATOR_API_KEY,bMe=gG(global.fetch,{retryOn:function(t,e,r){return t>3?!1:!!(e!==null||r&&r.status>=400)},retryDelay:function(t){return 500}});import{hostname as AK}from"os";var xS={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
|
|
@@ -4376,11 +4376,11 @@ To resolve the conflict:`,uE(l,e))),i=c):W.warn("A view or instrument with the n
|
|
|
4376
4376
|
`),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],h=!1);let g=c[l],f=Pe(g);d+=f,g.length>a&&(g=g.slice(0,a));let E=Array.from(g.matchAll(uO)).map(q=>q&&q.length>=3?{tagName:q[1],id:q[2]}:void 0).filter(q=>!!q),v=Array.from(g.matchAll(qq)).map(q=>q&&(q[2]||q[4])).filter(q=>!!q);v.reverse();let x=g.replace(/ id="[0-9]+"/g,"");u.push(x);for(let q of E)p.push(q.id),m.push(q);for(let q of v){let $=m[m.length-1];$&&$.tagName===q&&m.pop()}let C=m.some(q=>Yq.includes(q.tagName)),_=c[l+1]??"",L=Pe(_),G=Array.from(_.matchAll(uO)).map(q=>q&&q.length>2?q[1]:void 0).filter(q=>!!q),N=G.some(q=>mO.includes(q)),k=G.some(q=>Kq.includes(q));d+L>=i&&(h=!0),d>=n&&(N&&!C||v.some(q=>Xq.includes(q)))&&(h=!0),d>=o&&k&&!C&&(h=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
|
|
4377
4377
|
`),tokenLength:d}),s.forEach((g,f)=>{let S=g.ids[0],y=g.ids[g.ids.length-1];t.debug({tokenLength:g.tokenLength,minId:S,maxId:y},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var Zq=75e4,Lm=3e5;async function la(t){let{options:e,fixtures:r,screenshot:n}=t,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=r,l=t.tree,u=t.serializedTree,d=Pe(u);if(d>Zq)try{let p=Om({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await tK({...t,tokenLimit:Lm-1e4,chunks:p.chunks}),u=l.serialize();let m=Pe(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Lm*jo),u=l.serialize();let m=Pe(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Lm)try{if(o){let p=Om({serializedTree:u,options:pO,logger:i}),m=Qq();l=await V(eK({...t,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let h=Pe(u);i.info({oldTokens:d,newTokens:h,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=h}else{let p=Om({serializedTree:u,options:dO,logger:i});l=await V(rK({...t,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=Pe(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Lm*jo),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function eK({type:t,callId:e,chunks:r,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:r,description:n,type:t,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:$e(c)}),u=[];return r.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function tK(t){let{description:e,fixtures:r,tree:n}=t,{generator:o,logger:i,signal:a}=r;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:$e(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=t.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,h)=>m+h.tokenLength,0)>t.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function rK(t){let{description:e,fixtures:r,chunkResult:n,tokenLimit:o,tree:i}=t,{generator:a,logger:s,signal:c}=r,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:$e(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function fE(t,e){if(!t.description)throw new M("UserConfigurationError","Cannot locate element with empty description");return en({action:async()=>nK(t,e),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:e.browser,logger:t.logger})}async function nK(t,e){let{disableCache:r,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u,skipSavingVisualAttributes:d}=t,{ctx:p,orgId:m,browser:h,localCodeEvalTools:g,generator:f,abortSignal:S}=e,y=t.description,E=t.useMemory&&!r;n&&(y=await mr({orgId:m,s:y,context:n,localTools:g,signal:S,logger:l})),a&&(y=iK(y,a));let{serializedTree:T,tree:v}=await $n(h,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:S,skipWait:i,logger:l}),x,C=Date.now(),_;for(;!x&&Date.now()-C<3e3;){S.throwIfAborted();try{x=await h.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(tt){_=tt}}if(!x)throw new M("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${_?.message}`);let L=T,B=!1,N=`data:image/jpeg;base64,${x.toString("base64")}`;L=await la({type:"locator",description:y,screenshot:N,serializedTree:T,options:{aiPageFiltering:c},tree:v,fixtures:{generator:f,signal:S,logger:l,orgId:m}}),L!==T&&(B=!0);let k=await f.getElementLocation({browserState:L,goal:y,screenshot:N,source:a,memory:E?s:void 0},{disableCache:r,abortSignal:S,loggerTags:$e(l),useMemory:E});if(l.debug({usedRag:B,result:k},"Got locator result"),!(k.id>0))throw new ka(`Could not find any relevant element: ${k.thoughts}`,k.updatedMemory?{type:"GCS_TRACES",traces:k.updatedMemory}:void 0);let{resolution:$,target:he,frameConfig:K}=await h.createTargetFromA11yId({id:k.id,requirements:k.requirements,additionalElements:k.additionalElements,description:y,targetSource:"AI",logger:l,skipSavingVisualAttributes:d});if($.a11yNode?.properties?.hidden&&$.a11yNode?.properties?.hidden!=="false")throw new M("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${$.displayString}`);return E&&(k.updatedMemory?he.memory={type:"GCS_TRACES",traces:k.updatedMemory}:s&&(he.memory=s)),{thoughts:k.thoughts,target:he,resolution:$,frameConfig:K,screenshot:N}}var oK=["Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:","Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:","Element matching the description below. This element is being located as part of a negative check step (i.e. we are trying to verify the element does not exist). Therefore, interpret the description narrowly, do not assume there are typos, and err on the side of returning -1 unless there is a perfect match. Description:"],hO="<select> element:",gO="text input or contenteditable element:",fO="Element matching the description below. It is possible the element is hidden or doesn't exist. Interpret the description narrowly and do not assume there are typos. Return -1 unless there is an straightforward match. Description:",SO="Element matching the description below. This element is being located as part of a check step (i.e. we are trying to verify certain properties about the element). Interpret the description narrowly and do not return elements that are merely loosely related. Description:",gE=[hO,gO,fO,SO,...oK];function yO(t,e){if(t===e)return!0;for(let r of gE){if(!t.startsWith(r))continue;let n=t.slice(r.length).trim();if(gE.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!gE.some(r=>e.startsWith(r)&&e.slice(r.length).trim()===t.trim())}function iK(t,e){if(!t||!e)return t;switch(e){case"SELECT_OPTION":return`${hO} ${t}`;case"TYPE":return`${gO} ${t}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${fO}
|
|
4378
4378
|
${t}`;case"ELEMENT_CHECK":return`${SO}
|
|
4379
|
-
${t}`;default:return t}}var aK=15,sK=7e3;async function Nm({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=aK}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=Cg.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let{browser:s}=n,c=t.timeout?t.timeout*1e3:s.smartWaitingTimeout,l=kw(c,i-1),u=0,d=Date.now(),p=d+c-sK,m=d,h,g,f;try{await en({action:()=>s.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:s,logger:r})}catch(S){r.warn({err:S},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let S=Date.now();if(u>0){if(S>=p)break;let T=p-S,v=m-S,x=Math.min(v,T);x>0&&await le(x,n.abortSignal)}let y=Date.now();if(u>0&&y>=p)break;let E=!1;try{if(h=await en({action:async()=>{let v=await EO(s,r,n.abortSignal);return g&&g.serializedTree===v.serializedTree&&g.screenshotBuff.equals(v.screenshotBuff)?(E=!0,h):(g=v,bO({command:t,state:v,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s}),h?.success){h?.updatedMemory&&dc(t,h.updatedMemory,r);break}else throw h?.thoughts?new M("AssertionFailureError",h.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(T){n.abortSignal.throwIfAborted(),f=T instanceof Error?T:new Error(`${T}`),E?r.info(`AI check attempt ${u} failed (re-used previous result)`):r.info({err:T},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=y+l}}if(!h?.success)try{h=await en({action:async()=>bO({command:t,state:await EO(s,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s})}catch(S){n.abortSignal.throwIfAborted(),f=S instanceof Error?S:new Error(`${S}`)}finally{u++}if(h?.updatedMemory&&dc(t,h.updatedMemory,r),!h?.success){let S=`AI check still failing after ${u} attempts.`;throw f&&(S+=` Latest result: ${f.message}`),new M("AssertionFailureError",S)}return{...h,succeedImmediately:!1,urlAfterCommand:s.url()}}async function EO(t,e,r){let[n,o]=await Promise.all([$n(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function bO({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:h,tree:g}=e,f=e.screenshotBuff,S=f.toString("base64"),y=u.url(),E=t.contextChoice??"MULTIMODAL",T=h;E!=="VISION_ONLY"&&(T=await la({type:"assertion",serializedTree:h,tree:g,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),T!==h&&(m.ragUsed=!0),m.pageState=T);let v={goal:t.assertion,url:y,memory:o?t.cache?.memory:void 0,browserState:T,screenshot:S,contextChoice:E,source:c},C=await(E==="VISION_ONLY"?(_,L)=>d.getVisualAssertionResult(_,L):(_,L)=>d.getAssertionResult(_,L))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:$e(l)});return(C.result||i)&&C.relevantElements&&(m.relevantElementsSerialized=C.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_),await lK(C.relevantElements,u,l)),{success:C.result,thoughts:C.thoughts,afterScreenshotOverride:f,updatedMemory:o?C.updatedMemory:void 0}}async function lK(t,e,r){let n=Date.now();for(let o of t){if(Date.now()-n>2e3){r.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await V(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){r.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var cK=1e5,Dm=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function TO(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await uK(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Dm?r.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):r.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await le(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function uK(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await le(o.smartWaitingTimeout,n);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await V(dK(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function dK(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await en({action:async()=>pK(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function pK(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=t.description;r&&(d=await mr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await $n(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Pe(p)>cK)throw new Dm;s.throwIfAborted();let h;try{h=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(y){throw new M("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${y instanceof Error?y.message:y}`)}let f=`data:image/jpeg;base64,${h.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:$e(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as AO}from"lodash-es";async function RO(t){let{command:e,timeoutMs:r,fixtures:n}=t,{abortSignal:o}=n,i=()=>_b(e.cache)?e.cache:void 0,a=i(),s=AO(a),c=(g=!1)=>{if(a=i(),!!a)if(g){let f=eS(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,p=500,m=!1;for(;u<2||Date.now()-l<r;){u++,u>1&&await le(p,o),o?.throwIfAborted(),a=i();let{result:g,elementWasFound:f}=await vO({cacheToUse:a,params:t});if(d=g,m=f,g.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&vu(a.target)){let g=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await vO({cacheToUse:g,params:t});d=f,d.success||c(!0)}let h=i();return d.success&&h?.target&&!m&&(h.target=uc(h.target),h.updatedAt=new Date),d}async function vO({cacheToUse:t,params:e}){let{command:r,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(r.target&&!wo(r.target))throw new Error("Element assertion with x/y is not supported yet");let c=LC(r.assertion),l,u=!1,d=AO(t);try{let{elementInteractedDisplayString:p,result:m,thoughts:h}=await a({ctx:o.ctx,tracer:i,command:r,target:r.target,cache:d?.target,action:async g=>mK(g.locator,e),options:{...r,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ii(r),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:h},u=!0,m.success||(s.warn({aiThoughts:h,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:h}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof M)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function mK(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await hK(t,e.assertion)}async function hK(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:ot(a,500,!0)},!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=us(e);r=!1,n=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ot(await t.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await t.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new M("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),r=!1;break}if(!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=us(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},wn*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:wn*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:wn*1e3});break}case"FOCUSED":{r=await t.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(r=e.negated?!r:r,!r){let a=us(e);n=new M("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=us(e);r=!1,n=new M("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=us(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The style property ${e.property} ${s}`):n=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:r,data:o,err:n}}function CO(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as gK}from"jimp";async function Jc(t,e){let r=await t.screenshot(e),n=await gK.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as wO}from"jimp";import SE from"jpeg-js";import fK from"pixelmatch";async function xO({ctx:t,tracer:e,command:r,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(r.target&&!wo(r.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;r.target?.elementDescriptor?l=(await i({ctx:t,tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async G=>Jc(o,{locator:G.locator,...c}),options:{...r,disableCache:n,disableGlobalLocatorRedirect:!0,memory:r.cache?.target?.memory,targetName:"target"}})).result:l=await Jc(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,r,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let B=`${l.width}x${l.height}`,G=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${B}) does not match saved screenshot dimensions (${G}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await wO.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await wO.fromBuffer(u.buffer),h={width:u.width,height:u.height},g,f=p.width*p.height,S=h.width*h.height,y=Math.abs(p.height-h.height),E=Math.abs(p.width-h.width);if(f>S){let B=d.cover({w:h.width,h:h.height});l.buffer=await B.getBuffer("image/jpeg"),g="current",l.width=h.width,l.height=h.height}else if(S>f){let B=m.cover({w:p.width,h:p.height});u.buffer=await B.getBuffer("image/jpeg"),g="saved"}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=r.threshold??.1,C=fK(SE.decode(u.buffer).data,SE.decode(l.buffer).data,T.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,_=C>v*100,L=`Visual diff of ${C.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${v*100}%.`;if(g&&(L+=` The ${g} screenshot was cropped since it was taller by ${y} pixels and wider by ${E} pixels.`),_)throw new M("ActionFailureError",L);return{fail:_,thoughts:L,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:SE.encode(T,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var SK=3e4;function yK(t){if(!t.body)return{};switch(t.body.type){case"json":return{content:t.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([r,n])=>{e.append(r,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function _O({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??SK/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([h,g])=>h&&g)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([h,g])=>h&&g).forEach(([h,g])=>{a.append(h,g)});let s=a.toString(),c;if(fs(t.url)&&(c=t.url),r&&Ss(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await V((async()=>{let h=s?`${l}?${s}`:l;try{let g=yK(t),f=new Headers(i);return g.contentType&&!f.has("Content-Type")&&f.set("Content-Type",g.contentType),await n(h,{headers:f,method:t.method,body:g.content})}catch(g){throw e.error({err:g},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${g}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let h;try{h=await d.text()}catch(g){h=`Failed to read response body: ${g}`}throw new M("ActionFailureError",`Fetch request failed with status ${d.status}: ${h}`)}let p={};d.headers.forEach((h,g)=>{p[g]=h});let m={status:d.status,headers:p,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{m.request.json=JSON.parse(t.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var EK=5e3;async function km({timeout:t=wn,...e}){let r=Date.now(),n=t*1e3,o=n+1e4,i,a=0,s=500;for(;a-r<n;){if(Date.now()-r>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await MO(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await le(s,e.signal),s=Math.min(Math.floor(s*1.5),EK);else return i}return i=await MO(e),i}async function MO({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let c=await e.evaluateFunctionInAllFrames(IO,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(IO,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?oo.CONTAINS:io.CONTAINS;a=new M("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new M("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"})(t)}}function IO({value:t,negated:e,returnHtml:r}){let n=document.documentElement.outerHTML,o=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&r?n:void 0}}var bK=3e4;async function PO({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??bK/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(fs(t.url)&&(s=t.url),r&&Ss(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=await V((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var li=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:r,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=r,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([$n(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await la({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:r,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([$n(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,p=await la({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:c,browserState:p,startingScreenshot:r,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(a)},langfuseSessionId:s})}catch(h){throw new M("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return $n(this.browser,e)}async locateElement(e){return await fE({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return en({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:r?{type:"url",url:r}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:p,cache:a[d],action:async h=>h,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(h=>h.result)),p=h=>h==="fromTarget"?"From Target":h==="toTarget"?"To Target":"Target",m=u.map((h,g)=>h.thoughts?`${p(o[g])}: ${h.thoughts}`:void 0).filter(h=>!!h).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(h=>h.elementInteractedDisplayString),thoughts:m}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new M("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let r=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await en({action:()=>this.wrapElementTargetingCommandHelper({...e,originalCache:e.originalCache??e.cache}),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:r})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&$h(i)){r.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Kh(i)||Wh(i))){r.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(Yh(i)){r.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof _n&&i.retryableWithAI){r.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof M?n:new M("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:r,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(r.type!=="description")throw new M("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:r.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await le(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:r,tracer:n,target:o,originalCache:i,action:a,options:s,command:c}=e,{disableCache:l,useSelector:u,targetName:d,targetHealingInProgress:p,source:m}=s,h=this.logger.child({commandId:c.id}),g=this.shouldUseMemory(),f=s.retriesWithAI??1,S=!1,y=OO(e.cache);if((!y||l)&&!Lh(o))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(h.info("Cache explicitly disabled for this step"),S=!0,y=void 0),y&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&y.targetSource==="HEURISTIC_HEALED"&&(S=!0,y=void 0),y?.inputDescription&&!yO(o.elementDescriptor,y.inputDescription)&&(h.warn({old:y.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),S=!0,y=void 0);let E=v=>!!v&&vu(v),T=!0;if(!E(y)){T=!1,h.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:S,memory:s.memory,useMemory:g},"Prompting AI for an updated element location"),(S||!i)&&await TO({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:h,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(r)),f--;let v;try{v=await fE({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:m,useMemory:g,memory:g?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:h},this.getControllerFixtures(r))}catch(_){if(_ instanceof ka&&_.updatedLocatorMemory){let L={id:-1,...i,memory:_.updatedLocatorMemory};qd({cmd:c,key:d,newTarget:L,logger:h,updatedWithAI:!0})}throw new M("ActionFailureError",_.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let x=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,h),C=await a(x);return qd({cmd:c,key:d,newTarget:v.target,logger:h,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=$e(h)),{result:C,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(r,y,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:h,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let x=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,h),C=await a(x);if(kt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.33.2"]),qd({cmd:c,key:d,newTarget:y,logger:h,updatedWithAI:!1}),T){let _=v.decisions.filter(L=>L.matched);if(_.length!==1)h.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let L=_[0].type;n.recordTargetAutoHeal({healType:L})}}return{result:C,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let x="unknown";v instanceof Dr&&v.cacheMissReason&&(x=v.cacheMissReason),kt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.33.2",`missReason:${x}`]);let C=!1;if((v instanceof _n||$h(v)||Kh(v)||Yh(v)||kT(v)||Wh(v)||FT(v))&&(C=!0),v instanceof M&&!C)throw h.error({err:v},"Failed to execute action with cached target (fatal)"),v;if(f>0&&o){h.info({err:v},"Failed to execute action with cached target, retrying with AI");let _;return y.memory&&Au(y.memory)&&(_=y.memory),this.wrapElementTargetingCommand({ctx:r,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:_,retriesWithAI:f,targetHealingInProgress:!0}})}throw new M("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,r){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,r):{locator:e}}async screenshotWithDimensions(e){return Jc(this.browser,e)}async executePresetCommand(e,r,n,o,i){this.options?.slowMoMs&&await le(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o,i);return this.browser.userBrowserSettings.visualActions&&Qb(n)?await this.browser.waitForDOMStability({timeout:ke}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:me}),this.options?.autoFollowNewTabs&&await cO({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{_x(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>FS(e)}}async resolveCommandTemplateStrings(e,r){return Ap({obj:e,context:r,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,r,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?Nm({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Nm({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let g=iC(n.schema);if(g)throw new M("UserConfigurationError",g)}let m=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let g=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:$e(a)});if(g.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",g.thoughts);return{thoughts:g.thoughts||void 0,data:g.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(g){let f=g.message;throw f.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:g}}):g}}case"NAVIGATE":if(!fs(n.url)&&!Ss(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new M("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,h;if(n.target&&Cn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:E=>this.browser.hover(E),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=S,h=y}let g=this.browser.getViewport()?.height??Kt.height,f=this.browser.getViewport()?.width??Kt.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??g));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??g);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await le(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Cn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),{elementInteractedDisplayString:h,result:g,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:y=>this.browser.click(y,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:f,data:g.downloadedFile?{downloadedFile:g.downloadedFile}:void 0};return ap(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Cn(n.fromTarget)&&Cn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(Cn(n.fromTarget)||Cn(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,thoughts:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:h}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),h=parseInt(n.deltaY),g=n.steps??5;if(isNaN(m)||isNaN(h))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Cn(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:h,steps:g,fromTarget:n.target.pixels});break}let f,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:y,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:async T=>this.browser.mouseDrag(m,h,g,T.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=y,S=E}else await this.browser.mouseDrag(m,h,g,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}case"SELECT_OPTION":{if(!wo(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,h=n.choice,{elementInteractedDisplayString:g,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,h,n.force),options:{...n,targetName:"target",disableCache:i,source:Ii(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:m},"Executed JavaScript in browser")):m=await Jo({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){a.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:h,logger:a})}}})}catch(h){throw this.throwIfClosed(),new M("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new M("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&Cn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),h,g,f=OO(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:E,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:f,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!S,source:Ii(n)}});h=E,g=T}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:g};return ap(m,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}case"HOVER":{if(Cn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:g=>this.browser.hover(g),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"FOCUS":{if(!wo(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:g=>this.browser.focus(g),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"BLUR":{if(n.target&&!wo(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:m,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:g=>this.browser.blur(g),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return ap(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let m=new vK,h=TK(fetch,m),g;try{g=new URL(n.url).hostname}catch{}let f=await _O({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:h});return{data:hl.parse({...f,cookies:bA(m,g)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await PO({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return xO({ctx:e,tracer:r,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(n.fileSource.type==="URL"?(h=n.fileSource.url,m=await Bx({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(h=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await Jo({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=bd.optional().parse(m)}catch(g){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(n.timeout??wn)*1e3,h=this.generator.getAgentConfig()?.assertion;if(CO(n.assertion)&&!n.useSelector&&n.target.type==="description"&&h&&h!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let S=await Nm({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{f.cache?.memory&&dc(n,f.cache?.memory.traces,a)}}let g=await RO({command:n,tracer:r,timeoutMs:m,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!g.success,data:g.data,elementInteracted:g.elementInteractedDisplayString,thoughts:g.err?.message??g.thoughts??`Element assertion ${g.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await en({action:async()=>km({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new Zo(n.requestMatcher),h=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=h.then(async g=>await GS(g)).catch(g=>{a.error({err:g},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let h=n.timeout??10;return{data:await V(m,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new Zo(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:h=>m.matches({url:h.request.url,method:h.request.method}),onRequestStart:(h,g)=>{this.recordedRequests[n.key][h]=_p(g)},onRequestComplete:(h,g)=>{this.recordedRequests[n.key]?.[h]&&(this.recordedRequests[n.key][h]=_p(g))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new Zo(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Zo(n.requestMatcher),async(h,g)=>{let f=await Jo({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:h,response:g},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=LA.parse(f);return new Response(S.body,{status:S.status,headers:S.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:r,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:r,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:r,isClickToRecord:n}){this.recordAbortController=r;let o=new Np({signal:r.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})}};var yE=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,c=s.browser,{orgId:l,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(gs({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await mr({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});g={orgId:l,cacheKeys:[S,...Object.entries(r).map(([E,T])=>`${E}:${T}`)]},n.info({original:f,keyParams:g},"Module cache key params");let y=Date.now();for(;Date.now()-y<iR;){d?.throwIfAborted();let E=await i.getCacheResult(g);if(E){n.info({cacheResult:ot(E,1e3,!0)},"Got result from module execution cache"),p=Fm(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(E),m=!0;break}else n.info({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let T=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${AK()};runId:${u}`},d);if(T.acquired){h=T.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await le(2500+Math.random()*1e4,d)}}try{if(!p)p=await RK(t);else if(e.autoAuth){let f=bd.safeParse(p.data);if(!f.success)throw new M("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,y=e.advanced?.cacheInvalidation;if(y&&y.type==="PAGE_CHECK"){let E={type:"CONTENT",value:y.substring},T=await km({timeout:wn,assertion:E,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});T.success?n.debug({invalResult:T},"Cached result still valid after page check, continuing..."):(n.info({invalResult:T},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),yE(t)}}finally{try{h!==void 0&&!m&&p?.status==="SUCCESS"&&await CK({step:e,result:p,browser:s.browser,cacheKeyPrefix:h,logger:n,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return p},RK=async t=>{let{step:e,tracer:r}=t.moduleParams,n=Fm(e,t.moduleParams.resolvedInputs,"SUCCESS"),o=await r.startSubSteps(),{status:i,results:a}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,Wr({asyncTasks:t.work.asyncTasks,nestedResults:a,result:n,logger:t.fixtures.logger}),n};function Fm(t,e,r){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:t.id,moduleId:t.moduleId,moduleName:t.name,startedAt:new Date,cacheConfig:t.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:r}}async function LO({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await Jo({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new M("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function CK({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===XR)&&(a=t.defaultCacheTtl??JR);let s;t.autoAuth?s=JSON.stringify(await r.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:gs({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function ca(t,e,r){return wK(t,e,r)}async function wK(t,e,r){let n=new Date;try{return r.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(r.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof M?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=Fm(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...op(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Gs(t,e){let r=!1;try{return t&&!t.state.failureRecoveryDisabled&&(t.state.failureRecoveryDisabled=!0,r=!0),await e()}finally{t&&r&&(t.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as BK}from"lodash-es";import{randomUUID as NO}from"crypto";import{diff as xK}from"deep-object-diff";import{cloneDeep as DO}from"lodash-es";var Um=async t=>{let{step:e,tracer:r}=t.presetParams,{logger:n,controller:o,context:i}=t.fixtures,{collectDebugData:a}=t.options,{testMetadata:s}=t.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?DO(e.command.cache):{},d=o.browser.url(),p=new Date,m,h=NO(),g=NO();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:h,html:T})}}catch(T){l.debug({err:T},"Failed to take before screenshot, continuing...")}let f,S,y,E=ad();try{let T=await o.executePresetCommand(E,r,e.command,i,s?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(m=T.beforeScreenshotOverride),y=T.afterScreenshotOverride;let v=new Date,x=o.browser.url();S={beforeUrl:d,afterUrl:x,startedAt:p,finishedAt:v,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},f={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:x,finishedAt:v,startedAt:p,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[S]},"assertion"in e.command&&(f.message=T.thoughts||"Assertion passed.")}catch(T){l.error({message:T.message,stack:T.stack},`Failed executing preset step ${ao(e.command)}`);let v=o.browser.url(),x=new Date,C=T instanceof Error?T.message:`${T}`;S={beforeUrl:d,afterUrl:v,startedAt:p,finishedAt:x,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:C},f={...e,startedAt:p,finishedAt:x,beforeUrl:d,afterUrl:v,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:C,failureReason:T instanceof M?T.reason:void 0,results:[S]}}finally{let T="cache"in e.command&&e.command.cache?DO(e.command.cache):{},v=xK(u,T);v&&Object.keys(v).length>0&&l.info({diffs:vd(v)},"Updated cache")}if(a)try{if(y||(y=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:g,html:T})}}catch(T){l.debug({err:T},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=h,f.beforeSnapshot=h,S.afterSnapshot=g,f.afterSnapshot=g,m&&r.attachBeforeScreenshot({logger:l,snapshotId:h,screenshot:m}),y&&r.attachAfterScreenshot({logger:l,snapshotId:g,screenshot:y}),f};async function _K(t,e,r){let{tracer:n}=t.conditionalParams,{logger:o,controller:i}=t.fixtures,a=e.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await Um({...t,presetParams:{tracer:n,step:e.assertion}});switch(a.type){case"AI_ASSERTION":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(o.info(s.message,`AI assertion condition ${r} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return{type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(l=>{throw new Error(`Unsupported conditional command type: ${l}`)})(a.type)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let c=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:c,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}async function kO(t){let{step:e}=t.conditionalParams,{logger:r}=t.fixtures,n=new Date,o=op(e),i=e.elseSteps,a=!0,s=[],c,l=ad();for(let h=0;h<e.blocks.length;h++){r.info(`Evaluating condition ${h} in conditional step`);let g=e.blocks[h],f=await _K(t,g,h);if(s.push(f.conditionResult),c=f.conditionResult,f.type==="execution_error"){let S={...o,assertionResult:f.conditionResult,status:"FAILED",startedAt:n,finishedAt:new Date,message:f.conditionResult.message,results:[],details:l.details};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:s,result:S,logger:r}),S}if(f.type==="passed"){r.info(`Condition ${h} resolved to true, executing the corresponding ${f.steps.length} steps`),a=!1,i=f.steps;break}}if(i)a&&r.info("No conditions resolved to true, executing the else block steps");else{r.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let h={...o,assertionResult:c,status:"SUCCESS",startedAt:n,data:s[s.length-1]?.data,message:s[s.length-1]?.message,results:[],finishedAt:new Date,details:l.details};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:[...s],result:h,logger:r}),h}r.info(`Executing ${i.length} steps in the selected conditional block`);let u=await t.conditionalParams.tracer.startSubSteps(),d=await t.executeStepList({...t,listParams:{steps:i,containerName:"conditional block",tracer:u}}),m={...o,assertionResult:c,...d,startedAt:n,finishedAt:new Date};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:[...s,...d.results],result:m,logger:r}),m}import{randomUUID as FO}from"crypto";var UO=async t=>{let{tracer:e}=t.aiStepParams,{controller:r,logger:n}=t.fixtures;await r.browser.waitForDOMStability();let o=await r.browser.screenshot({}),i=await MK(t);i.finishedAt=new Date,Wr({asyncTasks:t.work.asyncTasks,result:i,nestedResults:i.results,logger:t.fixtures.logger});let a=await r.browser.screenshot({}),s=FO();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:n,snapshotId:s,screenshot:o});let c=FO();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:n,snapshotId:c,screenshot:a}),i},MK=async t=>{let{step:e,tracer:r}=t.aiStepParams,{controller:n,context:o,logger:i}=t.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new M("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:l}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as EE}from"crypto";var BO=15,IK=7,zO=async t=>{let{tracer:e}=t.aiStepParams,{logger:r,controller:n}=t.fixtures;await n.browser.waitForDOMStability();let o=await n.browser.screenshot({quality:75}),i=await PK(t);i.finishedAt=new Date,Wr({asyncTasks:t.work.asyncTasks,result:i,nestedResults:i.results,logger:t.fixtures.logger});let a=await n.browser.screenshot({quality:75}),s=EE();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:r,snapshotId:s,screenshot:o});let c=EE();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:r,snapshotId:c,screenshot:a}),i},PK=async t=>{let{step:e,tracer:r}=t.aiStepParams,{testMetadata:n,orgId:o}=t.inputs,{controller:i,context:a,logger:s,codeEvalTools:c}=t.fixtures,{step:l}=t.callbacks,u=`${e.id}-${Date.now()}`,d=s.child({stepId:e.id,langfuseSessionId:u}),p={...e,startedAt:new Date,beforeTestContext:a.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await mr({orgId:o,s:e.text,context:a,logger:d,localTools:c});await i.browser.waitForDOMStability({logger:d});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,y=0,E,T;for(;;){if(S>BO)return p.message=`Exceeded the maximum number of commands allowed per AI step (${BO})`,p.status="FAILED",p;if(i.executeAbortController.signal.aborted)return p.message="Test execution was cancelled",p.status="CANCELLED",p;l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let v=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:d,langfuseSessionId:u,lastError:T}),{evaluation:x,reasoning:C,summary:_}=v;d.info(v,"Got AI evaluation");let L=p.results[S-1]?.id;switch(x.type){case"DONE":return p.message=`Our AI evaluator confirmed all tasks are complete: ${C}`,p.status="SUCCESS",L&&l.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:`${_}
|
|
4379
|
+
${t}`;default:return t}}var aK=15,sK=7e3;async function Nm({command:t,aiPageFiltering:e,logger:r,fixtures:n,useMemory:o,maxRetries:i=aK}){if(!t.assertion.trim())throw new M("ActionFailureError","Assertion command is missing the assertion content");let a=Cg.optional().catch(void 0).parse(t.source);t.source&&!a&&r.warn(`Invalid source ${t.source} for AI assertion, ignoring...`);let{browser:s}=n,c=t.timeout?t.timeout*1e3:s.smartWaitingTimeout,l=kw(c,i-1),u=0,d=Date.now(),p=d+c-sK,m=d,h,g,f;try{await en({action:()=>s.clearHighlights(),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,browser:s,logger:r})}catch(S){r.warn({err:S},"Failed to clear highlights before AI check, continuing...")}for(;u<i;){n.abortSignal.throwIfAborted();let S=Date.now();if(u>0){if(S>=p)break;let T=p-S,v=m-S,x=Math.min(v,T);x>0&&await le(x,n.abortSignal)}let y=Date.now();if(u>0&&y>=p)break;let E=!1;try{if(h=await en({action:async()=>{let v=await EO(s,r,n.abortSignal);return g&&g.serializedTree===v.serializedTree&&g.screenshotBuff.equals(v.screenshotBuff)?(E=!0,h):(g=v,bO({command:t,state:v,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:r,source:a}))},frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s}),h?.success){h?.updatedMemory&&dc(t,h.updatedMemory,r);break}else throw h?.thoughts?new M("AssertionFailureError",h.thoughts):new M("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(T){n.abortSignal.throwIfAborted(),f=T instanceof Error?T:new Error(`${T}`),E?r.info(`AI check attempt ${u} failed (re-used previous result)`):r.info({err:T},`AI check assert attempt ${u} failed, retrying...`)}finally{u++,m=y+l}}if(!h?.success)try{h=await en({action:async()=>bO({command:t,state:await EO(s,r,n.abortSignal),fixtures:n,useMemory:o,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:r}),frameConfig:t.iframeUrl?{type:"url",url:t.iframeUrl}:void 0,logger:r,browser:s})}catch(S){n.abortSignal.throwIfAborted(),f=S instanceof Error?S:new Error(`${S}`)}finally{u++}if(h?.updatedMemory&&dc(t,h.updatedMemory,r),!h?.success){let S=`AI check still failing after ${u} attempts.`;throw f&&(S+=` Latest result: ${f.message}`),new M("AssertionFailureError",S)}return{...h,succeedImmediately:!1,urlAfterCommand:s.url()}}async function EO(t,e,r){let[n,o]=await Promise.all([$n(t,{abortSignal:r,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),t.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function bO({command:t,state:e,fixtures:r,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:p}=r,m={type:"ASSERTION"},{serializedTree:h,tree:g}=e,f=e.screenshotBuff,S=f.toString("base64"),y=u.url(),E=t.contextChoice??"MULTIMODAL",T=h;E!=="VISION_ONLY"&&(T=await la({type:"assertion",serializedTree:h,tree:g,description:t.assertion,screenshot:S,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:r.orgId}}),T!==h&&(m.ragUsed=!0),m.pageState=T);let v={goal:t.assertion,url:y,memory:o?t.cache?.memory:void 0,browserState:T,screenshot:S,contextChoice:E,source:c},C=await(E==="VISION_ONLY"?(_,L)=>d.getVisualAssertionResult(_,L):(_,L)=>d.getAssertionResult(_,L))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!t.disableCache,abortSignal:p,logger:l,loggerTags:$e(l)});return(C.result||i)&&C.relevantElements&&(m.relevantElementsSerialized=C.relevantElements.map(_=>u.getSerializedFormFromA11yId(_)).filter(_=>!!_),await lK(C.relevantElements,u,l)),{success:C.result,thoughts:C.thoughts,afterScreenshotOverride:f,updatedMemory:o?C.updatedMemory:void 0}}async function lK(t,e,r){let n=Date.now();for(let o of t){if(Date.now()-n>2e3){r.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await V(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){r.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var cK=1e5,Dm=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function TO(t,e){let{logger:r}=t,{abortSignal:n,browser:o}=e,i=Date.now();try{await uK(i,t,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Dm?r.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):r.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await le(s,n)}finally{r.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function uK(t,e,r){let{abortSignal:n,browser:o}=r;if(o.smartWaitingTimeout<3e3){await le(o.smartWaitingTimeout,n);return}if(!e.description)throw new M("UserConfigurationError","Cannot locate element with empty description");await V(dK(t,e,r),{milliseconds:o.smartWaitingTimeout})}async function dK(t,e,r){let{logger:n,iframeUrl:o}=e,{browser:i}=r;for(;Date.now()-t<i.smartWaitingTimeout;)if(await en({action:async()=>pK(e,r),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function pK(t,e){let{testContext:r,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=t,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=t.description;r&&(d=await mr({orgId:l,s:d,context:r,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await $n(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Pe(p)>cK)throw new Dm;s.throwIfAborted();let h;try{h=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(y){throw new M("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${y instanceof Error?y.message:y}`)}let f=`data:image/jpeg;base64,${h.toString("base64")}`;s.throwIfAborted();let S=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:$e(n)});return n.debug({result:S},"Got smart waiting result"),S.isPageReady}import{cloneDeep as AO}from"lodash-es";async function RO(t){let{command:e,timeoutMs:r,fixtures:n}=t,{abortSignal:o}=n,i=()=>_b(e.cache)?e.cache:void 0,a=i(),s=AO(a),c=(g=!1)=>{if(a=i(),!!a)if(g){let f=eS(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,p=500,m=!1;for(;u<2||Date.now()-l<r;){u++,u>1&&await le(p,o),o?.throwIfAborted(),a=i();let{result:g,elementWasFound:f}=await vO({cacheToUse:a,params:t});if(d=g,m=f,g.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new M("InternalPlatformError",`Failed to evaluate manual element assertion in ${r}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&vu(a.target)){let g=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await vO({cacheToUse:g,params:t});d=f,d.success||c(!0)}let h=i();return d.success&&h?.target&&!m&&(h.target=uc(h.target),h.updatedAt=new Date),d}async function vO({cacheToUse:t,params:e}){let{command:r,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(r.target&&!wo(r.target))throw new Error("Element assertion with x/y is not supported yet");let c=LC(r.assertion),l,u=!1,d=AO(t);try{let{elementInteractedDisplayString:p,result:m,thoughts:h}=await a({ctx:o.ctx,tracer:i,command:r,target:r.target,cache:d?.target,action:async g=>mK(g.locator,e),options:{...r,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ii(r),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:h},u=!0,m.success||(s.warn({aiThoughts:h,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:h}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof M)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function mK(t,{command:e,fixtures:r}){return await r.browser.highlight(t),await hK(t,e.assertion)}async function hK(t,e){let r=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await t.textContent()??"";if(o={elementTextContent:ot(a,500,!0)},!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=us(e);r=!1,n=new M("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ot(await t.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await t.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new M("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),r=!1;break}if(!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=us(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new M("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{r=await t.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},wn*1e3);break}case"EDITABLE":{r=await t.isEditable({timeout:wn*1e3});break}case"EXISTS":{r=!0;break}case"ENABLED":{r=await t.isEnabled({timeout:wn*1e3});break}case"FOCUSED":{r=await t.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(r=e.negated?!r:r,!r){let a=us(e);n=new M("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await t.evaluate(s=>s.tagName);if(!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=us(e);r=!1,n=new M("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await t.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!cc(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=us(e);r=!1,e.operation==="EXISTS"?n=new M("AssertionFailureError",`The style property ${e.property} ${s}`):n=new M("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:r,data:o,err:n}}function CO(t){return t.type==="ELEMENT_EXISTENCE"&&t.negated&&t.condition==="EXISTS"}import{Jimp as gK}from"jimp";async function Jc(t,e){let r=await t.screenshot(e),n=await gK.fromBuffer(r);return{buffer:r,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as wO}from"jimp";import SE from"jpeg-js";import fK from"pixelmatch";async function xO({ctx:t,tracer:e,command:r,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(r.target&&!wo(r.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;r.target?.elementDescriptor?l=(await i({ctx:t,tracer:e,command:r,target:r.target,cache:r.cache?.target,action:async G=>Jc(o,{locator:G.locator,...c}),options:{...r,disableCache:n,disableGlobalLocatorRedirect:!0,memory:r.cache?.target?.memory,targetName:"target"}})).result:l=await Jc(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,r,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let B=`${l.width}x${l.height}`,G=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${B}) does not match saved screenshot dimensions (${G}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await wO.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await wO.fromBuffer(u.buffer),h={width:u.width,height:u.height},g,f=p.width*p.height,S=h.width*h.height,y=Math.abs(p.height-h.height),E=Math.abs(p.width-h.width);if(f>S){let B=d.cover({w:h.width,h:h.height});l.buffer=await B.getBuffer("image/jpeg"),g="current",l.width=h.width,l.height=h.height}else if(S>f){let B=m.cover({w:p.width,h:p.height});u.buffer=await B.getBuffer("image/jpeg"),g="saved"}let T={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=r.threshold??.1,C=fK(SE.decode(u.buffer).data,SE.decode(l.buffer).data,T.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,_=C>v*100,L=`Visual diff of ${C.toFixed(2)}% detected, which is ${_?"over":"under"} the threshold of ${v*100}%.`;if(g&&(L+=` The ${g} screenshot was cropped since it was taller by ${y} pixels and wider by ${E} pixels.`),_)throw new M("ActionFailureError",L);return{fail:_,thoughts:L,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:SE.encode(T,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var SK=3e4;function yK(t){if(!t.body)return{};switch(t.body.type){case"json":return{content:t.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(t.body.content).forEach(([r,n])=>{e.append(r,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function _O({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??SK/1e3,i=Object.fromEntries(Object.entries(t.headers||{}).filter(([h,g])=>h&&g)),a=new URLSearchParams;Object.entries(t.params||{}).filter(([h,g])=>h&&g).forEach(([h,g])=>{a.append(h,g)});let s=a.toString(),c;if(fs(t.url)&&(c=t.url),r&&Ss(t.url,r)&&(c=new URL(t.url,r).toString()),!c)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:t.body,method:t.method},"Making HTTP request");let d=await V((async()=>{let h=s?`${l}?${s}`:l;try{let g=yK(t),f=new Headers(i);return g.contentType&&!f.has("Content-Type")&&f.set("Content-Type",g.contentType),await n(h,{headers:f,method:t.method,body:g.content})}catch(g){throw e.error({err:g},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${g}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new M("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let h;try{h=await d.text()}catch(g){h=`Failed to read response body: ${g}`}throw new M("ActionFailureError",`Fetch request failed with status ${d.status}: ${h}`)}let p={};d.headers.forEach((h,g)=>{p[g]=h});let m={status:d.status,headers:p,request:{url:d.url,method:t.method,headers:i}};if(t.body?.type==="json"&&t.body.content)try{m.request.json=JSON.parse(t.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var EK=5e3;async function km({timeout:t=wn,...e}){let r=Date.now(),n=t*1e3,o=n+1e4,i,a=0,s=500;for(;a-r<n;){if(Date.now()-r>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await MO(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await le(s,e.signal),s=Math.min(Math.floor(s*1.5),EK);else return i}return i=await MO(e),i}async function MO({assertion:t,browser:e,autoExpandIframes:r}){switch(t.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(r){let c=await e.evaluateFunctionInAllFrames(IO,{value:t.value,negated:!!t.negated,returnHtml:!1});i=t.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(IO,{value:t.value,negated:!!t.negated,returnHtml:!0},"checking page content"));if(!i){let c=t.negated?oo.CONTAINS:io.CONTAINS;a=new M("AssertionFailureError",`The page ${c} '${t.value}'.`),o=s}}catch(s){a=new M("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"})(t)}}function IO({value:t,negated:e,returnHtml:r}){let n=document.documentElement.outerHTML,o=n.includes(t)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&r?n:void 0}}var bK=3e4;async function PO({command:t,logger:e,baseUrl:r,fetchImplementation:n=fetch}){let o=t.timeout??bK/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(t.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(fs(t.url)&&(s=t.url),r&&Ss(t.url,r)&&(s=new URL(t.url,r).toString()),!s)throw new M("ActionFailureError",`Invalid URL: ${t.url}`);let l=await V((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:t.query,variables:t.variables?JSON.parse(t.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new M("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new M("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var li=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:r,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=r,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:r,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([$n(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await la({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),p={url:this.browser.url(),browserState:d,startingScreenshot:r,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:r,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([$n(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,p=await la({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),m={url:c,browserState:p,startingScreenshot:r,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...$e(a)},langfuseSessionId:s})}catch(h){throw new M("InternalWebAgentError",`Error generating command: ${h instanceof Error?h.message:h}`,{errOptions:{cause:h}})}}async getBrowserState(e){return $n(this.browser,e)}async locateElement(e){return await fE({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,r){return en({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:r?{type:"url",url:r}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:p,cache:a[d],action:async h=>h,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(h=>h.result)),p=h=>h==="fromTarget"?"From Target":h==="toTarget"?"To Target":"Target",m=u.map((h,g)=>h.thoughts?`${p(o[g])}: ${h.thoughts}`:void 0).filter(h=>!!h).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(h=>h.elementInteractedDisplayString),thoughts:m}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new M("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let r=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await en({action:()=>this.wrapElementTargetingCommandHelper({...e,originalCache:e.originalCache??e.cache}),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:r})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&$h(i)){r.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Kh(i)||Wh(i))){r.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(Yh(i)){r.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof _n&&i.retryableWithAI){r.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof M?n:new M("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:r,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(r.type!=="description")throw new M("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:r.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await le(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:r,tracer:n,target:o,originalCache:i,action:a,options:s,command:c}=e,{disableCache:l,useSelector:u,targetName:d,targetHealingInProgress:p,source:m}=s,h=this.logger.child({commandId:c.id}),g=this.shouldUseMemory(),f=s.retriesWithAI??1,S=!1,y=OO(e.cache);if((!y||l)&&!Lh(o))throw new M("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(h.info("Cache explicitly disabled for this step"),S=!0,y=void 0),y&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&y.targetSource==="HEURISTIC_HEALED"&&(S=!0,y=void 0),y?.inputDescription&&!yO(o.elementDescriptor,y.inputDescription)&&(h.warn({old:y.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),S=!0,y=void 0);let E=v=>!!v&&vu(v),T=!0;if(!E(y)){T=!1,h.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:S,memory:s.memory,useMemory:g},"Prompting AI for an updated element location"),(S||!i)&&await TO({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:h,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(r)),f--;let v;try{v=await fE({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:m,useMemory:g,memory:g?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:h},this.getControllerFixtures(r))}catch(_){if(_ instanceof ka&&_.updatedLocatorMemory){let L={id:-1,...i,memory:_.updatedLocatorMemory};qd({cmd:c,key:d,newTarget:L,logger:h,updatedWithAI:!0})}throw new M("ActionFailureError",_.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let x=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,h),C=await a(x);return qd({cmd:c,key:d,newTarget:v.target,logger:h,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=$e(h)),{result:C,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(r,y,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:h,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let x=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,h),C=await a(x);if(kt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.33.3"]),qd({cmd:c,key:d,newTarget:y,logger:h,updatedWithAI:!1}),T){let _=v.decisions.filter(L=>L.matched);if(_.length!==1)h.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let L=_[0].type;n.recordTargetAutoHeal({healType:L})}}return{result:C,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let x="unknown";v instanceof Dr&&v.cacheMissReason&&(x=v.cacheMissReason),kt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!y.requirements}`,`hasAdditionalElements:${!!y.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:2.33.3",`missReason:${x}`]);let C=!1;if((v instanceof _n||$h(v)||Kh(v)||Yh(v)||kT(v)||Wh(v)||FT(v))&&(C=!0),v instanceof M&&!C)throw h.error({err:v},"Failed to execute action with cached target (fatal)"),v;if(f>0&&o){h.info({err:v},"Failed to execute action with cached target, retrying with AI");let _;return y.memory&&Au(y.memory)&&(_=y.memory),this.wrapElementTargetingCommand({ctx:r,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:_,retriesWithAI:f,targetHealingInProgress:!0}})}throw new M("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,r){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,r):{locator:e}}async screenshotWithDimensions(e){return Jc(this.browser,e)}async executePresetCommand(e,r,n,o,i){this.options?.slowMoMs&&await le(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new M("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,r,n,o,i);return this.browser.userBrowserSettings.visualActions&&Qb(n)?await this.browser.waitForDOMStability({timeout:ke}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:me}),this.options?.autoFollowNewTabs&&await cO({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{_x(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>FS(e)}}async resolveCommandTemplateStrings(e,r){return Ap({obj:e,context:r,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,r,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?Nm({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new M("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new M("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Nm({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new M("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let g=iC(n.schema);if(g)throw new M("UserConfigurationError",g)}let m=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let g=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:$e(a)});if(g.result==="NOT_FOUND")throw new M("ActionFailureError","No relevant data found for extraction goal on this page");if(g.thoughts?.includes("MaxGenerationLengthExceededError"))throw new M("UserConfigurationError",g.thoughts);return{thoughts:g.thoughts||void 0,data:g.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(g){let f=g.message;throw f.includes("MaxGenerationLengthExceededError")?new M("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new M("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:g}}):g}}case"NAVIGATE":if(!fs(n.url)&&!Ss(n.url,this.browser.baseUrl))throw new M("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new M("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let m,h;if(n.target&&Cn(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:S,thoughts:y}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:E=>this.browser.hover(E),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});m=S,h=y}let g=this.browser.getViewport()?.height??Kt.height,f=this.browser.getViewport()?.width??Kt.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??g));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??g);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new M("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new M("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await le(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Cn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=this.browser.url(),{elementInteractedDisplayString:h,result:g,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:y=>this.browser.click(y,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),S={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:f,data:g.downloadedFile?{downloadedFile:g.downloadedFile}:void 0};return ap(m,S.urlAfterCommand)&&(S.succeedImmediately=!0,S.succeedImmediatelyReason="URL changed"),S}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Cn(n.fromTarget)&&Cn(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(Cn(n.fromTarget)||Cn(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,thoughts:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:r,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(g,f)=>this.browser.dragAndDrop(g.locator,f.locator,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:h}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),h=parseInt(n.deltaY),g=n.steps??5;if(isNaN(m)||isNaN(h))throw new M("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Cn(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:h,steps:g,fromTarget:n.target.pixels});break}let f,S;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:y,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:async T=>this.browser.mouseDrag(m,h,g,T.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=y,S=E}else await this.browser.mouseDrag(m,h,g,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:S}}case"SELECT_OPTION":{if(!wo(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,h=n.choice,{elementInteractedDisplayString:g,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:S=>this.browser.selectOption(S,h,n.force),options:{...n,targetName:"target",disableCache:i,source:Ii(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:g,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let m;try{n.environment==="BROWSER"?(m=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:m},"Executed JavaScript in browser")):m=await Jo({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){a.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:h,logger:a})}}})}catch(h){throw this.throwIfClosed(),new M("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(m)}catch(h){throw new M("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&Cn(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let m=this.browser.url(),h,g,f=OO(n.target),S=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:E,thoughts:T}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:f,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!S,source:Ii(n)}});h=E,g=T}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let y={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:g};return ap(m,y.urlAfterCommand)&&(y.succeedImmediately=!0,y.succeedImmediatelyReason="URL changed"),y}case"HOVER":{if(Cn(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:g=>this.browser.hover(g),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"FOCUS":{if(!wo(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,command:n,target:n.target,cache:n.cache?.target,action:g=>this.browser.focus(g),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"BLUR":{if(n.target&&!wo(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:m,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:r,target:n.target,command:n,cache:n.cache?.target,action:g=>this.browser.blur(g),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m,thoughts:h}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return ap(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let m=new vK,h=TK(fetch,m),g;try{g=new URL(n.url).hostname}catch{}let f=await _O({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:h});return{data:hl.parse({...f,cookies:bA(m,g)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await PO({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return xO({ctx:e,tracer:r,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,h;if(n.fileSource.type==="URL"?(h=n.fileSource.url,m=await Bx({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(h=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new M("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await Jo({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new M("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let h;try{h=bd.optional().parse(m)}catch(g){throw new M("ActionFailureError",`Credentials provided do not follow the required format: ${g}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let m=(n.timeout??wn)*1e3,h=this.generator.getAgentConfig()?.assertion;if(CO(n.assertion)&&!n.useSelector&&n.target.type==="description"&&h&&h!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let S=await Nm({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${S.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:S.afterScreenshotOverride}}finally{f.cache?.memory&&dc(n,f.cache?.memory.traces,a)}}let g=await RO({command:n,tracer:r,timeoutMs:m,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!g.success,data:g.data,elementInteracted:g.elementInteractedDisplayString,thoughts:g.err?.message??g.thoughts??`Element assertion ${g.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let m=await en({action:async()=>km({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new Zo(n.requestMatcher),h=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=h.then(async g=>await GS(g)).catch(g=>{a.error({err:g},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new M("ActionFailureError",`No listener registered with key: ${n.key}`);let h=n.timeout??10;return{data:await V(m,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new Zo(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:h=>m.matches({url:h.request.url,method:h.request.method}),onRequestStart:(h,g)=>{this.recordedRequests[n.key][h]=_p(g)},onRequestComplete:(h,g)=>{this.recordedRequests[n.key]?.[h]&&(this.recordedRequests[n.key][h]=_p(g))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new M("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new Zo(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Zo(n.requestMatcher),async(h,g)=>{let f=await Jo({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:h,response:g},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),S=LA.parse(f);return new Response(S.body,{status:S.status,headers:S.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(m=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:r,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:r,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:r,isClickToRecord:n}){this.recordAbortController=r;let o=new Np({signal:r.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:$e(this.logger)})}};var yE=async t=>{let{step:e,resolvedInputs:r}=t.moduleParams,{logger:n,context:o,storage:i,codeEvalTools:a,controller:s}=t.fixtures,c=s.browser,{orgId:l,runId:u}=t.inputs,d=s.executeAbortController.signal;Object.keys(r).length>0&&(o.setInputs(r),n.info(gs({json:{inputs:r,moduleId:e.moduleId},maxJsonStringSize:1e3}),"Set module inputs"));let p,m=!1,h,g;if(e.cacheConfig||e.defaultCacheAllInvocations){let f=e.cacheConfig?.cacheKey||e.defaultCacheKey||"",S=await mr({orgId:l,s:f,context:o,logger:n,localTools:a,signal:d});g={orgId:l,cacheKeys:[S,...Object.entries(r).map(([E,T])=>`${E}:${T}`)]},n.info({original:f,keyParams:g},"Module cache key params");let y=Date.now();for(;Date.now()-y<iR;){d?.throwIfAborted();let E=await i.getCacheResult(g);if(E){n.info({cacheResult:ot(E,1e3,!0)},"Got result from module execution cache"),p=Fm(e,r,"SUCCESS"),p.message="Used cached module result.",p.data=JSON.parse(E),m=!0;break}else n.info({cacheKey:f,keyParams:g},"No cache result found, continuing with lock acquisition");let T=await i.acquireCacheLock({keyParams:g,clientMetadata:`hostName:${AK()};runId:${u}`},d);if(T.acquired){h=T.keyPrefix,n.info({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Acquired cache lock and proceeding with module execution");break}else n.debug({cacheKeyPrefixIfLockAcquired:h,cacheKey:f,keyParams:g},"Failed to acquire cache lock, retrying...");await le(2500+Math.random()*1e4,d)}}try{if(!p)p=await RK(t);else if(e.autoAuth){let f=bd.safeParse(p.data);if(!f.success)throw new M("UserConfigurationError",`Cached authentication module result is not a valid storage state: ${f.error.message}`);n.debug("Automatically loading auth state after cached module result"),await c.loadAuthState(f.data);let S=!1,y=e.advanced?.cacheInvalidation;if(y&&y.type==="PAGE_CHECK"){let E={type:"CONTENT",value:y.substring},T=await km({timeout:wn,assertion:E,browser:c,logger:n,signal:d,autoExpandIframes:!!c.userBrowserSettings.autoExpandIframes});T.success?n.debug({invalResult:T},"Cached result still valid after page check, continuing..."):(n.info({invalResult:T},"Invalidating cached result due to page check failure"),S=!0)}if(g&&S)return await i.deleteCacheResult(g),yE(t)}}finally{try{h!==void 0&&!m&&p?.status==="SUCCESS"&&await CK({step:e,result:p,browser:s.browser,cacheKeyPrefix:h,logger:n,storage:i})}finally{h!==void 0&&await i.releaseCacheLock(h)}}return p},RK=async t=>{let{step:e,tracer:r}=t.moduleParams,n=Fm(e,t.moduleParams.resolvedInputs,"SUCCESS"),o=await r.startSubSteps(),{status:i,results:a}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:`module ('${e.name}')`,tracer:o}});return n.results=a,n.status=i,n.finishedAt=new Date,Wr({asyncTasks:t.work.asyncTasks,nestedResults:a,result:n,logger:t.fixtures.logger}),n};function Fm(t,e,r){let n={};return Object.entries(e).forEach(([i,a])=>{n[i]=JSON.stringify(a)}),{type:"MODULE",id:t.id,moduleId:t.moduleId,moduleName:t.name,startedAt:new Date,cacheConfig:t.cacheConfig,inputs:n,results:[],finishedAt:new Date,status:r}}async function LO({orgId:t,step:e,context:r,logger:n,codeEvalTools:o,signal:i}){let a={};try{for(let s of e.parameters??[]){let c=e.inputs?.[s]??e.defaultParameters?.[s];if(!c){n.warn(`No value or default found for parameter '${s}' that is required by module '${e.name}'`);continue}a[s]=await Jo({orgId:t,code:c,fragment:!0,context:r,logger:n,localTools:o,signal:i})}return a}catch(s){throw i?.throwIfAborted(),new M("UserConfigurationError",`Failed to evaluate module inputs: ${s}`)}}async function CK({step:t,result:e,browser:r,cacheKeyPrefix:n,logger:o,storage:i}){let a=t.cacheConfig?.cacheExpiryMs;(!a||a===XR)&&(a=t.defaultCacheTtl??JR);let s;t.autoAuth?s=JSON.stringify(await r.saveAuthState()):e.data!==void 0?s=JSON.stringify(e.data):s='""',o.debug({cacheKeyPrefix:n,ttlMs:a,truncatedCacheResultJson:gs({json:s,maxJsonStringSize:1e4})},"Setting module cache result"),await i.setCacheResult({result:s,keyPrefix:n,ttlMs:a})}async function ca(t,e,r){return wK(t,e,r)}async function wK(t,e,r){let n=new Date;try{return r.throwIfAborted(),await e()}catch(o){let i=new Date,a="FAILED",s;if(r.aborted||o instanceof DOMException&&o.name==="AbortError"?(s="Step aborted by user.",a="CANCELLED"):o instanceof M?s=`${o}`:s=`An unexpected error occurred: ${o.message}`,t.type==="RESOLVED_MODULE"){let c=Fm(t,{},"FAILED");return c.message=s,c.startedAt=n,c.finishedAt=i,c}return{...op(t),startedAt:n,finishedAt:i,status:a,data:null,message:s,results:[]}}}async function Gs(t,e){let r=!1;try{return t&&!t.state.failureRecoveryDisabled&&(t.state.failureRecoveryDisabled=!0,r=!0),await e()}finally{t&&r&&(t.state.failureRecoveryDisabled=void 0)}}import{cloneDeep as BK}from"lodash-es";import{randomUUID as NO}from"crypto";import{diff as xK}from"deep-object-diff";import{cloneDeep as DO}from"lodash-es";var Um=async t=>{let{step:e,tracer:r}=t.presetParams,{logger:n,controller:o,context:i}=t.fixtures,{collectDebugData:a}=t.options,{testMetadata:s}=t.inputs,c=e.command.type,l=n.child({commandType:c,stepId:e.id,commandId:e.command.id}),u="cache"in e.command&&e.command.cache?DO(e.command.cache):{},d=o.browser.url(),p=new Date,m,h=NO(),g=NO();if(a)try{if(m=await o.browser.screenshot({retries:1,clearHighlights:!0,quality:75}),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachBeforeHtmlSnapshot({logger:l,snapshotId:h,html:T})}}catch(T){l.debug({err:T},"Failed to take before screenshot, continuing...")}let f,S,y,E=ad();try{let T=await o.executePresetCommand(E,r,e.command,i,s?.advanced.disableAICaching??!1);T.beforeScreenshotOverride&&(m=T.beforeScreenshotOverride),y=T.afterScreenshotOverride;let v=new Date,x=o.browser.url();S={beforeUrl:d,afterUrl:x,startedAt:p,finishedAt:v,viewport:o.browser.getViewport(),status:T.fail?"FAILED":"SUCCESS",elementInteracted:T.elementInteracted},f={...e,message:T.thoughts??"Successfully executed preset action.",beforeUrl:d,afterUrl:x,finishedAt:v,startedAt:p,status:T.fail?"FAILED":"SUCCESS",data:T.data,results:[S]},"assertion"in e.command&&(f.message=T.thoughts||"Assertion passed.")}catch(T){l.error({message:T.message,stack:T.stack},`Failed executing preset step ${ao(e.command)}`);let v=o.browser.url(),x=new Date,C=T instanceof Error?T.message:`${T}`;S={beforeUrl:d,afterUrl:v,startedAt:p,finishedAt:x,viewport:o.browser.getViewport(),status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:C},f={...e,startedAt:p,finishedAt:x,beforeUrl:d,afterUrl:v,status:T instanceof DOMException&&T.name==="AbortError"?"CANCELLED":"FAILED",message:C,failureReason:T instanceof M?T.reason:void 0,results:[S]}}finally{let T="cache"in e.command&&e.command.cache?DO(e.command.cache):{},v=xK(u,T);v&&Object.keys(v).length>0&&l.info({diffs:vd(v)},"Updated cache")}if(a)try{if(y||(y=await o.browser.screenshot({retries:1,quality:75})),!o.browser.userBrowserSettings.disableHtmlSnapshots){let T=await o.browser.getRawCondensedHtml();r.attachAfterHtmlSnapshot({logger:l,snapshotId:g,html:T})}}catch(T){l.debug({err:T},"Failed to store debug data after step, likely because the page is still loading. This is non-fatal and does not affect the test.")}return S.beforeSnapshot=h,f.beforeSnapshot=h,S.afterSnapshot=g,f.afterSnapshot=g,m&&r.attachBeforeScreenshot({logger:l,snapshotId:h,screenshot:m}),y&&r.attachAfterScreenshot({logger:l,snapshotId:g,screenshot:y}),f};async function _K(t,e,r){let{tracer:n}=t.conditionalParams,{logger:o,controller:i}=t.fixtures,a=e.assertion.command;a.type==="AI_ASSERTION"&&(a.source="CONDITIONAL_CHECK");try{let s=await Um({...t,presetParams:{tracer:n,step:e.assertion}});switch(a.type){case"AI_ASSERTION":return s.status==="SUCCESS"?{type:"passed",conditionResult:s,steps:e.steps}:(o.info(s.message,`AI assertion condition ${r} resolved to false`),{type:"failed",conditionResult:s});case"JAVASCRIPT":{if(s.status==="FAILED")return{type:"execution_error",conditionResult:s};let c=!!s.data;return s.status=c?"SUCCESS":"FAILED",s.message=c?`JavaScript condition evaluated to true (${JSON.stringify(s.data)})`:`JavaScript condition evaluated to false (${JSON.stringify(s.data)})`,o.info({returnValue:s.data,conditionPassed:c},`JavaScript condition ${r} evaluated`),c?{type:"passed",conditionResult:s,steps:e.steps}:{type:"failed",conditionResult:s}}default:return(l=>{throw new Error(`Unsupported conditional command type: ${l}`)})(a.type)}}catch(s){o.error({err:s},`Condition ${r} failed with error`);let c=s instanceof Error?s.message:"Unknown error during condition evaluation";return{type:"execution_error",conditionResult:{...e.assertion,status:"FAILED",message:c,startedAt:new Date,finishedAt:new Date,results:[]}}}finally{a.type==="AI_ASSERTION"&&delete a.source,i.throwIfClosed()}}async function kO(t){let{step:e}=t.conditionalParams,{logger:r}=t.fixtures,n=new Date,o=op(e),i=e.elseSteps,a=!0,s=[],c,l=ad();for(let h=0;h<e.blocks.length;h++){r.info(`Evaluating condition ${h} in conditional step`);let g=e.blocks[h],f=await _K(t,g,h);if(s.push(f.conditionResult),c=f.conditionResult,f.type==="execution_error"){let S={...o,assertionResult:f.conditionResult,status:"FAILED",startedAt:n,finishedAt:new Date,message:f.conditionResult.message,results:[],details:l.details};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:s,result:S,logger:r}),S}if(f.type==="passed"){r.info(`Condition ${h} resolved to true, executing the corresponding ${f.steps.length} steps`),a=!1,i=f.steps;break}}if(i)a&&r.info("No conditions resolved to true, executing the else block steps");else{r.warn("No conditions resolved to true and no else block was provided, causing the entire conditional step to be skipped");let h={...o,assertionResult:c,status:"SUCCESS",startedAt:n,data:s[s.length-1]?.data,message:s[s.length-1]?.message,results:[],finishedAt:new Date,details:l.details};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:[...s],result:h,logger:r}),h}r.info(`Executing ${i.length} steps in the selected conditional block`);let u=await t.conditionalParams.tracer.startSubSteps(),d=await t.executeStepList({...t,listParams:{steps:i,containerName:"conditional block",tracer:u}}),m={...o,assertionResult:c,...d,startedAt:n,finishedAt:new Date};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:[...s,...d.results],result:m,logger:r}),m}import{randomUUID as FO}from"crypto";var UO=async t=>{let{tracer:e}=t.aiStepParams,{controller:r,logger:n}=t.fixtures;await r.browser.waitForDOMStability();let o=await r.browser.screenshot({}),i=await MK(t);i.finishedAt=new Date,Wr({asyncTasks:t.work.asyncTasks,result:i,nestedResults:i.results,logger:t.fixtures.logger});let a=await r.browser.screenshot({}),s=FO();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:n,snapshotId:s,screenshot:o});let c=FO();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:n,snapshotId:c,screenshot:a}),i},MK=async t=>{let{step:e,tracer:r}=t.aiStepParams,{controller:n,context:o,logger:i}=t.fixtures,a={...e,startedAt:new Date,beforeTestContext:o.toRedactedDisplayCopy(),finishedAt:new Date,results:[],status:"SUCCESS"};if(!("steps"in e&&e.steps&&e.steps.length>0&&e.steps[e.steps.length-1]?.command.type==="SUCCESS"))throw new M("UserConfigurationError","AI action has been fully deprecated. Please delete this step and transition to Dynamic AI Action.");try{let c=await r.startSubSteps(),{status:l}=await t.executeStepList({...t,listParams:{steps:e.steps,containerName:"AI action",results:a.results,tracer:c}});return a.finishedAt=new Date,a.status=l,a}catch(c){i.warn({err:c},"Failed executing saved deprecated AI action steps");let l=n.executeAbortController.signal.aborted;a.message=c instanceof Error?c.message:`${c}`,a.status=l?"CANCELLED":"FAILED"}return a};import{randomUUID as EE}from"crypto";var BO=15,IK=7,zO=async t=>{let{tracer:e}=t.aiStepParams,{logger:r,controller:n}=t.fixtures;await n.browser.waitForDOMStability();let o=await n.browser.screenshot({quality:75}),i=await PK(t);i.finishedAt=new Date,Wr({asyncTasks:t.work.asyncTasks,result:i,nestedResults:i.results,logger:t.fixtures.logger});let a=await n.browser.screenshot({quality:75}),s=EE();i.beforeSnapshot=s,e.attachBeforeScreenshot({logger:r,snapshotId:s,screenshot:o});let c=EE();return i.afterSnapshot=c,e.attachAfterScreenshot({logger:r,snapshotId:c,screenshot:a}),i},PK=async t=>{let{step:e,tracer:r}=t.aiStepParams,{testMetadata:n,orgId:o}=t.inputs,{controller:i,context:a,logger:s,codeEvalTools:c}=t.fixtures,{step:l}=t.callbacks,u=`${e.id}-${Date.now()}`,d=s.child({stepId:e.id,langfuseSessionId:u}),p={...e,startedAt:new Date,beforeTestContext:a.toRedactedDisplayCopy(),results:[],finishedAt:new Date,status:"SUCCESS"},m=await mr({orgId:o,s:e.text,context:a,logger:d,localTools:c});await i.browser.waitForDOMStability({logger:d});let g=`data:image/jpeg;base64,${(await i.browser.screenshot({clearHighlights:!0,retries:2})).toString("base64")}`,f=[],S=0,y=0,E,T;for(;;){if(S>BO)return p.message=`Exceeded the maximum number of commands allowed per AI step (${BO})`,p.status="FAILED",p;if(i.executeAbortController.signal.aborted)return p.message="Test execution was cancelled",p.status="CANCELLED",p;l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Evaluating current state..."});let v=await i.evaluateAiAction({goal:m,startingScreenshot:S===0?void 0:g,history:f,logger:d,langfuseSessionId:u,lastError:T}),{evaluation:x,reasoning:C,summary:_}=v;d.info(v,"Got AI evaluation");let L=p.results[S-1]?.id;switch(x.type){case"DONE":return p.message=`Our AI evaluator confirmed all tasks are complete: ${C}`,p.status="SUCCESS",L&&l.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:`${_}
|
|
4380
4380
|
${C}`}),p;case"RIGHT_TRACK":{E=void 0,S===0?l.onDynamicAIActionEvaluatingEvent?.({stepId:e.id,status:"RUNNING",message:C}):L&&l.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"SUCCESS",message:C});break}case"WRONG_TRACK":{if(E=`${C}
|
|
4381
4381
|
${x.feedback}`,y++,y>=IK)return p.message=`Our AI agent requires additional information to achieve this goal:
|
|
4382
4382
|
${C}
|
|
4383
|
-
${x.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;L&&l.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"FAILED",message:x.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${C}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:L??e.id,status:"FAILED",message:p.message}),p}let B=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:E},`Generating new sub-command ${S} within AI action`);let G,N;try{({command:G,reasoning:N}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:E,langfuseSessionId:u})),d.info({command:G,reasoning:N},"Got proposed command")}finally{clearTimeout(B)}if(G.type==="FAILURE")return clearTimeout(B),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${N}`,p;let k={id:EE(),type:"PRESET_ACTION",command:G},q={substepIndex:S+1,message:N||"Generated new command."};l.onDynamicCommandGenerated?.({...q,step:k,parentStepId:e.id}),d.info({commandId:G.id},`Executing sub-command ${S} within AI step: ${ao(G)}`);let $=await r.startSubSteps(),K=(await t.executeStepList({...t,options:{...t.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[k],tracer:$}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let tt=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(K),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${tt.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:ao(G),elementInteracted:K.results[0]?.elementInteracted,thoughts:N});let De={substepIndex:S,output:{...K,message:K.message??"Successfully executed preset action."},step:k,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(De),await r.finish({output:Zu.parse(K),step:K,message:K.message,attempt:1}),K.status==="FAILED")if(p.status="FAILED",p.message=K.message,y<3)y++,T=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${K.message}`;else return p;else if(K.status==="CANCELLED")return p.status="CANCELLED",p.message=K.message,p;S++}};import{randomUUID as OK}from"crypto";var LK=3;async function GO(t){let{logger:e}=t.fixtures,{results:r}=t.failureRecoveryParams,n=r[r.length-1],o=DK(t.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),t.work.state.failureRecoveryAttempts=(t.work.state.failureRecoveryAttempts??0)+1;try{return await NK(t)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function NK(t){let{fixtures:e,work:r,failureRecoveryParams:n}=t,{controller:o,logger:i}=e,{testMetadata:a}=t.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(r.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:h}=await hs(i,u,s,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),g=l.map(_=>lo(_)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:y,thoughts:E,instructions:T}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:h,currentPageState:m,nextStepsSerialized:g,testDescription:f||void 0,customInstructions:S||void 0});if(y!=="RECOVERABLE")return i.info({scenario:y,thoughts:E,instructions:T},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${E}`};if(!T)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let v={id:OK(),type:"AI_ACTION_DYNAMIC",text:T},x=await Gs(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[v,c],containerName:"AI-recovered step list",tracer:u}})),C=x.results[0];if(C&&C.type==="AI_ACTION_DYNAMIC")if(Vd({results:x.results,onPresetAction:_=>{_.aiSuggested=!0},onSimpleStepContainer:_=>{_.aiSuggested=!0}}),x.status==="SUCCESS"){let _=`The following steps were automatically executed by the failure recovery agent. Analysis: ${E}`;return C.message=_,kt.increment("test_event",1,["name:failure_recovery_success",`orgId:${t.inputs.orgId}`]),i.info({thoughts:E},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:x,message:_}}else{kt.increment("test_event",1,["name:failure_recovery_failure",`orgId:${t.inputs.orgId}`]);let _=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${E}`;return C.message=_,i.info({thoughts:E,aiActionResult:C},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:x,message:_}}return null}function DK(t,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let r=e.message;return r?r.includes("AbortError:")?"The user aborted the test":NT.some(n=>r.includes(n))?"The failed step is an irrecoverable configuration error":(t.state.failureRecoveryAttempts??0)>LK?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as Bm}from"crypto";import kK from"fast-json-patch";import{cloneDeep as FK}from"lodash-es";async function jO(t){let e=t.failedResults,r=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=t,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},h=p?.attempts??1;for(let g=0;g<h;g++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=FK(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await hs(d,c,e.results,{numStepsWithScreenshots:4}),y=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:l.description});f=kK.applyPatch(f,y.patches).newDocument;let E=lr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await UK({logger:d,controller:u,tracer:c,context:E,restartConfig:m,startingUrl:a});let T=await Gs(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures,context:E},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(r.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:T,context:E},healingAttempts:r};e=T}return{healingAttempts:r}}async function UK({logger:t,controller:e,tracer:r,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:Bm(),type:"PRESET_ACTION",command:{id:Bm(),type:"NAVIGATE",url:n.url}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:Bm(),type:"PRESET_ACTION",command:{id:Bm(),type:"NAVIGATE",url:i}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function VO(t,e){switch(t||(t="ON_FAILURE"),t){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Zb(e.command.type))}}async function $O(t){let{step:e,tracer:r}=t.sectionParams,{logger:n,controller:o,context:i}=t.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await r.startSubSteps(),u=async()=>t.executeStepList({...t,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await Gs(t.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!t.work.state.autoHealingDisabled&&VO(e.autohealingConfig.trigger,d.terminalResult)){let g=await r.startSubSteps(),f=await jO({...t,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:g});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,t.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:d.results,result:h,logger:n}),h}var zK=60*60*1e3;async function Tn(t){let{results:e=[],containerName:r,steps:n,tracer:o}=t.listParams,{logger:i}=t.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=t.inputs,l="SUCCESS",u,d=0;for(d;d<n.length;d++){let p=n[d];if(p.skipped)continue;if(t.work.fastForwardingToStep&&s){let y=JSON.stringify(a);if(p.id===s.fromStepId&&y===JSON.stringify(s.parentStepIdChain))t.work.fastForwardingToStep=!1;else if(!NC(p,a,s.fromStepId,s.parentStepIdChain))continue}let m=lo(p),h=0,g=1,f=Date.now();"retries"in p&&p.retries&&p.retries>0&&(g+=p.retries);let S;for(;h<g&&Date.now()-f<zK;){h++,i.info({step:p,currentAttempt:h},`Executing step ${d+1}/${n.length} in ${r}: ${m}`);let y=Date.now(),{stepResult:E,status:T,failureRecoveryResults:v,shouldStopExecuting:x}=await HK({attempt:h,params:t,step:p,i:d,steps:n,results:e,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:h===g});if(T==="FAILED"&&h<g){S=[...S??[],E],Date.now()-y<1e3&&await le(1e3-(Date.now()-y));continue}else e.push(E),S&&(E.previousAttempts=S);if(v&&e.push(...v),x)return l=T,u=E,{status:l,results:e,terminalResult:u};break}}return{status:l,results:e,terminalResult:u}}async function HK({attempt:t,params:e,step:r,i:n,steps:o,results:i,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:l}){let{tracer:u}=e.listParams,{logger:d,context:p,controller:m,codeEvalTools:h,usageTracker:g}=e.fixtures,{orgId:f}=e.inputs,S=new Date,y=await u.startStep({logger:d,step:r,attempt:t}),E=BK(r),T=p.toRedactedDisplayCopy(),v=m.browser.url(),x=m.executeAbortController.signal;g.trackStepExecution(r);let C,_;switch(r.type){case"PRESET_ACTION":{C="Preset action",_=await ca(r,async()=>await Um({...e,presetParams:{tracer:y,step:r}}),x);break}case"AI_ACTION":{C="AI action",_=await ca(r,()=>UO({...e,aiStepParams:{step:r,tracer:y},executeStepList:Tn}),x);break}case"AI_ACTION_DYNAMIC":{C="AI action",_=await ca(r,()=>zO({...e,aiStepParams:{step:r,tracer:y},executeStepList:Tn}),x);break}case"RESOLVED_MODULE":{C=`Module (${r.name})`,_=await ca(r,async()=>{let k=await LO({orgId:f,step:r,context:p,logger:d,codeEvalTools:h,signal:x});return yE({...e,executeStepList:Tn,moduleParams:{step:r,resolvedInputs:k,tracer:y}})},x);break}case"CONDITIONAL":{C="Conditional step",_=await ca(r,()=>kO({...e,conditionalParams:{step:r,tracer:y},executeStepList:Tn}),x);break}case"SECTION":{C="Section",_=await ca(r,()=>$O({...e,sectionParams:{step:r,tracer:y},executeStepList:Tn}),x);break}default:return(q=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}_.beforeUrl=_.beforeUrl??v,_.beforeTestContext=T,r.envKey&&p.setVariable(r.envKey,_.data);let L=m.browser.url();p.setCurrentUrl(L),_.afterUrl=_.afterUrl??L,_.afterTestContext=p.toRedactedDisplayCopy(),await GK({step:r,startedAt:S,stepTypeName:C,result:_,callbacks:e.callbacks,globalWorkRef:e.work,tracer:y,attempt:t});let B,G;if(l&&_.status==="FAILED"&&!e.work.state.failureRecoveryDisabled&&s?.fromStepId===void 0&&c?.toStepId===void 0){let k=await GO({...e,executeStepList:Tn,failureRecoveryParams:{failedStep:E,nextSteps:o.slice(n+1),results:i.concat(_),tracer:u}});k&&(k.type==="ATTEMPTED"?(B=k.result.results,G=k.status):k.type==="NOT_ELIGIBLE"&&(_.message=_.message?`${_.message} ${k.message}`:k.message),_.type==="PRESET_ACTION"&&(_.failureRecoveryStatus={type:k.type,message:k.message}))}return e.work.fastForwardingToStep&&s&&(s.fromStepId===r.id&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1),r.type==="RESOLVED_MODULE"&&Qf(a,s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1)),_.status!=="SUCCESS"&&G!=="SUCCESS"||m.closed?{shouldStopExecuting:!0,status:_.status,stepResult:_,failureRecoveryResults:B}:c&&r.id===c.toStepId&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)?(m.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:_,failureRecoveryResults:B}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:_,failureRecoveryResults:B}}async function GK({stepTypeName:t,step:e,result:r,tracer:n,attempt:o,startedAt:i}){let a=t.toLowerCase(),s=t.charAt(0).toUpperCase()+t.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(r.status){case"SUCCESS":c=r.message??`${s} executed successfully.`;break;case"FAILED":c=r.message??`${s} failed.`;break;case"CANCELLED":c=r.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${r.status}`)}await n.finish({step:r,message:c,output:Zu.parse(r),attempt:o})}var WO="MOMENTIC_RUN_ID",qO="FINAL_SCREENSHOT_URL";import{randomUUID as KO}from"crypto";async function YO({browser:t,signal:e}){let r=new Date;try{return await t.navigate({url:t.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:KO(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:r,finishedAt:new Date,results:[],command:{id:KO(),type:"NAVIGATE",url:t.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var zm=async t=>{let{orgId:e,runId:r,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs;t.fixtures.logger=t.fixtures.logger.child({orgId:e,runId:r,testId:n?.id});let{logger:s,controller:c}=t.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=t.callbacks.test,p=iM(s);if(t.options.reinitializeBrowser){let h=await YO({browser:c.browser,signal:c.executeAbortController.signal});if(h.status!=="PASSED")return await l?.(),clearInterval(p?.interval),h}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:aR.parse(t.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await VK(t),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function jK({beforeStatus:t,mainStatus:e,afterStatus:r}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var VK=async t=>{let{tracer:e}=t.testParams,{fromStep:r,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs,{logger:s,controller:c,context:l,storage:u}=t.fixtures,{collectDebugData:d,disableHealing:p}=t.options;l.setCurrentUrl(c.browser.url());let m="test",h=o,g=[],f=p||r!==void 0||n!==void 0||void 0,S={results:g,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},y=!1;r?.fromStepId&&r.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):r?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",y=!0);let E,T,v;if(y&&i&&i.length>0){let N=await XO(i,"beforeSteps",t);E=N.status,T=N.results,v=N.terminalResult?{...N.terminalResult,failureReason:"SetupFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(N.failureRecoveryAttempts??0)}let x,C;if(E===void 0||E==="PASSED"){s.info({fromStep:r,toStep:n},`Starting execution of ${m}`);let N=await e.startMainStepList(),k=await Tn({...t,work:S,listParams:{steps:h,containerName:m,results:g,tracer:N}});x=k.status,C=k.terminalResult}let _,L,B;if(y&&a&&a.length>0){let N=await XO(a,"afterSteps",t);_=N.status,L=N.results,B=N.terminalResult?{...N.terminalResult,failureReason:"TeardownFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(N.failureRecoveryAttempts??0)}let G=jK({beforeStatus:E,mainStatus:x,afterStatus:_});if(d&&$K({tracer:e,work:S,controller:c,storage:u,context:l,logger:s,status:G}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(t.callbacks.test.onSaveFinalRunResults?.({results:g,beforeResults:T,afterResults:L}))),G==="FAILED"){let N=E==="FAILED"?v:void 0,k=_==="FAILED"?B:void 0;return{status:"FAILED",results:g,beforeResults:T,afterResults:L,failedStepResult:N??C??k}}else if(G==="CANCELLED")return{status:"CANCELLED",results:g,beforeResults:T,afterResults:L};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:g,beforeResults:T,afterResults:L}};async function XO(t,e,r){let n=r.fixtures.logger,o=e==="beforeSteps"?await r.testParams.tracer.startBeforeStepList():await r.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...r.callbacks,test:{...r.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await Tn({...r,work:i,callbacks:a,listParams:{steps:t,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l,failureRecoveryAttempts:i.state.failureRecoveryAttempts}}function $K({tracer:t,work:e,controller:r,storage:n,logger:o,context:i,status:a}){let s=r.browser,c=s.retrieveAndClearDebugData(),l=zC(c.logsPerPage);t.attachConsoleLogs({logger:o,logs:l}),a!=="PASSED"&&a!=="SUCCESS"&&(t.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let u=await s.screenshot({quality:75}),d=await lO({codePath:"test-complete-final",storage:n,screenshotBuff:u,logger:o}),p=await V(s.html(),{milliseconds:2e3});i.setVariable(qO,d),o.debug({finalPageHtml:p.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:d},"Uploaded final screenshot URL")}catch{}})()))}async function Hm({settings:t,customHeaders:e,envVariables:r,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=Ga.parse(t);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new lr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:r,currentUrl:i});await Ap({obj:l,context:u,bannedKeys:[],allowList:wv,localTools:s,logger:a,orgId:c});try{return Ga.parse(l)}catch(d){throw new M("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function Gm({orgId:t,testName:e,envName:r,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await mr({orgId:t,s:c.defaultValue,context:lr.dummyContext(e,r,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as XK}from"lodash-es";import{cloneDeep as WK}from"lodash-es";var qK={showOverlay:!1},jm=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:r,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:r,cleanup:n,clientIp:o,browserBehavior:WK(qK),socket:a}),i}removeSession(e,r){(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){r.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){r.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function JO(t,e,r,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(g,f)=>{if(!g.closed&&!g.isInPageLoad)try{let S=c;c=void 0;let y=g.url(),E=f.toEditorDisplayCopy();JSON.stringify(E)===JSON.stringify(a)&&y===l&&o>i||(t.emit("browserState",{logsPerPage:S?.logsPerPage,viewport:g.getViewport(),url:y,iframeSrcUrls:s??[],context:E,isInPageLoad:g.isInPageLoad}),o=Date.now()),l=y,a=E}catch(S){if(!t.connected)return;let y=S instanceof Error?S.message:`${S}`;if(y.includes("Frame was detached")||y.includes("Not attached to an active page")||y.includes("browser has been closed")||y.includes("UserInfrastructureError"))return;r.error({err:S,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let g=n.getSession(e),f=g?.controller?.browser;if(!f||f.closed){r.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,g.context)},1e3),m=(g,f)=>!!(JSON.stringify(g)!==JSON.stringify(s)||f.logsPerPage.some(S=>S.length>0)),h=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(h);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),y=f.retrieveAndClearDebugData();m(S,y)&&(s=S,c=y,i=Date.now())}catch(S){r.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,h]}}var KK=3;async function QO({socket:t,logger:e,storageFactory:r,uploadedFileStorage:n,visualDiffStorageFactory:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=t.id,h=t.handshake.query.testId;if(!h)throw new Error("Socket connection request is missing testId");let g=await u({type:"e2e",testId:h}),f=await d?.();e=e.child({testId:h,orgId:g,sessionId:m,branch:f});let S=await a(g,e),y=await s(g,e),E=await l(g,e),T=await r(g),{testMetadata:v,baseUrl:x,envName:C,browserConfig:_,aiSettings:L,environmentVariables:B,localCodeEvalTools:G}=await ua({testId:h,orgId:g,logger:e,storage:T,authorization:c,settings:E}),N=p.getSession(m);if(N)return e.info("Associating connection with existing session (likely reconnect)"),await N.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let k=t.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:k,event:"connect",args:t.handshake.query},"Websocket event (connect)"),k&&p.getCurrentConnectionsByIp(k)>=KK)throw e.error({clientIp:k,sessions:p.getCurrentSessionsByIp(),...t.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(k);try{await YK({socket:t,baseUrl:x,envName:C,testMetadata:v,orgId:g,sessionId:m,logger:e,environmentVariables:B,clientIp:k,devicePixelRatio:i,storage:T,uploadedFileStorage:n,visualDiffScreenshotStorage:await o(g),localCodeEvalTools:G,generator:S,enricher:y,browserConfig:_,aiSettings:L,globalE2eStateManager:p})}catch(q){throw e.warn({err:q},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(k),q}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function YK({socket:t,baseUrl:e,envName:r,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:h,aiSettings:g,clientIp:f,enricher:S,globalE2eStateManager:y}){let E={viewport:o.advanced?.viewport??Kt,locale:o.advanced?.locale??Lo,timezoneId:o.advanced?.timezone??No,geolocation:o.advanced?.geolocation??Do,colorScheme:o.advanced?.colorScheme};n&&(E.deviceScaleFactor=n);let T=o.id,v=await Hm({settings:h,orgId:i,baseUrl:e,envName:r,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:T});let x=await Yr.init({baseUrl:e,userBrowserSettings:v,enricher:S,storage:c,logger:s,contextArgs:E,iconKnowledgeBase:null,callbacks:{onTabsChange:(G,N)=>{t.emit("tabs",{tabs:G,activeTab:N})},onScreencastFrame:(G,N)=>{let k=t;Vr&&(k=t.compress(!0)),k.emit("screenshot",{buffer:G},()=>{N()})},onSvgsCollected:G=>{t.emit("newIconDetected",{numIcons:G.newSvgs.length}),c.saveNewIcons(G,s)},onNetworkLogs:G=>{t.emit("networkLogs",{harEntries:G})}}});await x.navigate({url:e,initialNavigation:!0});let C=new li({browser:x,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:v.slowMoMs,autoFollowNewTabs:v.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),_=JO(t,a,s,y),L=async()=>{_.timers.forEach(G=>clearInterval(G))},B=new lr({baseUrl:e,testName:o.name,currentUrl:C.browser.url(),variablesFromEnvironment:m,envName:r});if(!t.connected)throw await x.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");t.emit("session",{url:e,userAgent:Yr.USER_AGENT,viewport:C.browser.getViewport(),sessionId:a}),y.registerSession({controller:C,context:B,sessionId:a,cleanup:L,clientIp:f,socket:t})}async function ua({testId:t,orgId:e,logger:r,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(t,r);if(!a)throw new Error(`Test metadata could not found for test ${t}`);let s;o?.type==="API_KEY"&&(s=new Nn({httpClient:new zt({...o,logger:r,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(g=>g.default),l;c&&(l=await n.fetchEnvironment(c.name,r));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced};d.browserType=Ku({browserType:d.browserType,orgDefaultBrowserType:i.browser?.defaultBrowserType});let p=a.baseUrl||l?.variables?.[At];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await Gm({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:r,localTools:s});let h={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:h}}var bE=class{parentTracer=null;socket;step;orgId;constructor({step:e,socket:r,parentTracer:n,orgId:o}){this.socket=r,this.parentTracer=n,this.step=e,this.orgId=o}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;kt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new So({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},So=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))kt.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:r,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=r,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new bE({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},Vm=class{constructor(e,r,n,o){this.socket=e;this.storage=r;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}onNetworkPage(){}onNetworkLogs(){}attachConsoleLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new So({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new So({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new So({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var TE={currentlyExecutingRequests:{}},JK=t=>async(e,r)=>{let{testId:n,orgId:o}=t.metadata,i=await t.settingsFactory(o,t.logger),a=await t.storageFactory(o),s,c=await ua({testId:n,orgId:o,logger:t.logger,storage:a,authorization:t.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=TE.currentlyExecutingRequests[l]??0;TE.currentlyExecutingRequests[l]=u+1,s=await QK({...t,...e,...c,done:r})}finally{t.logger.info({result:s,sessionId:t.metadata.sessionId},"Test execution complete"),TE.currentlyExecutingRequests[l]--}},QK=async({socket:t,steps:e,baseUrl:r,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:h,localCodeEvalTools:g,done:f,cacheStorageFactory:S,globalE2eStateManager:y})=>{let{testId:E,sessionId:T,orgId:v}=u,x=T,C=y.getSession(T);if(!C)throw new Error("No active session found");let{controller:_,context:L}=C;_.setOpen(),d=d.child({testId:E,orgId:v,sessionId:T,runId:x}),d.info({steps:e.map(se=>`${se.type}${"command"in se?` - ${se.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:r,context:L,browserConfig:l,aiSettings:c},"Socket execution parameters");let B=h??{},G=async()=>{o&&(await _.browser.reset({newUrl:r}),L.reset({baseUrl:r,currentUrl:_.browser.url(),variablesFromEnvironment:B,envName:p,testName:m}))},N=await s(v),k=await S(v),q=async()=>{let se=Date.now();try{await k.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:E,stepLists:{steps:e},logger:d})}catch(Je){d.error({err:Je},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{kt.distribution("cache-resolution",Date.now()-se,["executor:editor"])}};try{await mc({promiseGenerator:async()=>Promise.all([G(),q()]),signal:_.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),_.setOpen()}catch(se){if(t.emit("finished"),se.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${se}`)}let $=XK(e),he={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},K={orgId:v,runId:x,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},tt={controller:_,context:L,storage:N,codeEvalTools:g,usageTracker:new Ya,logger:d},De={test:{},step:{onDynamicAIActionStatusUpdateEvent:se=>{t.emit("dynamicCommandStatusUpdate",se)},onDynamicAIActionEvaluatingEvent:se=>{t.emit("dynamicCommandEvaluating",se)},onDynamicCommandGenerated:se=>{t.emit("dynamicCommandGenerated",se)},onDynamicCommandExecuted:se=>{t.emit("dynamicCommandExecuted",se)}}},ft=new Vm(t,N,v,E),rr=await zm({fixtures:tt,options:he,callbacks:De,inputs:K,testParams:{tracer:ft}}),je={logger:d,cacheStorage:k,orgId:v,testId:E,originalStepsWithCaches:{steps:$},updatedStepsWithCaches:{steps:e}};return rr?.status==="PASSED"?await ep(je):rr?.status==="FAILED"&&await tp(je),await ft.finish(),f?.(rr),rr.status};var ZO={event:"execute",createHandler:JK};import{cloneDeep as ZK}from"lodash-es";var e2=t=>async({command:e},r)=>{let{logger:n,generatorFactory:o,metadata:i}=t,a=ZK(e),s=Cw(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){r?.({result:s});return}"cache"in a&&(a.cache=void 0);try{let l=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});r?.({result:l})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),r?.({result:void 0})}}},eL={event:"lintStep",createHandler:e2};import{randomUUID as t2}from"crypto";var r2=({metadata:t,logger:e,storageFactory:r,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=t;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:h}=p;m.setOpen();let g=await r(i),f=Di.parse(u.advanced??{}),S={},y;if(c){if("useSelector"in l&&l.useSelector)try{let E=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);y=E.resolution.locator,S={target:E.target,thoughts:E.thoughts}}catch(E){e.warn({err:E},"Failed resolving target with selector"),s({err:`Failed locating element: ${E.message}`,decisions:E instanceof Dr?E.decisions:void 0});return}else try{let E=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:h,source:Ii(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&Au(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});S={target:E.target,thoughts:E.thoughts},y=E.resolution.locator}catch(E){(async()=>{try{let T=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:E,html:T.slice(0,1e5)},"Failed locating element with AI")}catch(T){e.warn({err:T},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${E.message}`});return}if(l.type==="SELECT_OPTION"&&y)try{S.options=await m.browser.getSelectOptions(y)}catch(E){e.warn({err:E},"Failed getting select options"),s({err:`Failed getting select options: ${E.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:E,width:T,height:v}=await m.screenshotWithDimensions({clearHighlights:!0,locator:y}),x=t2(),{universalHandle:C,appServerUrl:_}=await g.createOnDemandScreenshot(x,E,"image/jpeg");S.screenshot={data:C,width:T,height:v},e.info({width:T,height:v,appServerUrl:_,universalHandle:C},"Captured screenshot during locate")}catch(E){e.error({err:E},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${E.message}`});return}if(s({result:S}),y)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(y),m.browser.highlight(y)])}catch(E){e.warn({err:E},"Error highlighting element, continuing...")}}},tL={event:"locate",createHandler:r2};var n2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({event:o,percentX:i,percentY:a})=>{let s=r.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},rL={event:"mouseClickEvent",createHandler:n2};var o2=({metadata:t,generatorFactory:e,logger:r,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,r);p.setOpen(),d.browserBehavior.showOverlay=!0;let h=new AbortController;h.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(S){r.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let g=!1,f=(S,y)=>{y.type!=="PRESET_ACTION"||y.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:l,command:y.command,attribute:u}),h.abort(),g=!0)};setTimeout(()=>{g||(h.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:r,testId:s,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:h,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},nL={event:"recordTargetClick",createHandler:o2};var i2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},oL={event:"keyDownEvent",createHandler:i2};var a2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},iL={event:"keyUpEvent",createHandler:a2};var s2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=r.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let h=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),g=u.browserBehavior.recordingState?.transformer;g&&h&&g.recordScroll(h);return}p.showOverlay&&a(m,l);try{let h=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=h}catch(h){c++,c%5===0&&e.warn({err:h,mouseErrors:c},"Error in socket mouse move handler")}}},aL={event:"mouseMoveEvent",createHandler:s2};var l2=({metadata:t,generatorFactory:e,socket:r,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,h=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(g,f)=>{r.emit("stepRecorded",{stepId:c,step:g,offset:f})},onStepRecorded:(g,f)=>{r.emit("stepRecorded",{stepId:c,step:g,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:h}}},sL={event:"recordingStart",createHandler:l2};var c2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{let o=r.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},lL={event:"recordingStop",createHandler:c2};var u2=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;r.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,r),m=await n(d),{baseUrl:h}=await ua({testId:l,orgId:d,logger:r,storage:m,authorization:o,settings:p}),g=a.getSession(u);if(!g){t.emit("error",{message:"No session to refresh"});return}let{controller:f}=g;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();r.info({baseUrl:h,viewport:S},`Session refreshed for test ${l} at ${h}`),c()},cL={event:"refresh",createHandler:u2};var d2=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;r.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,r),d=await n(l),{baseUrl:p,envName:m,testName:h,environmentVariables:g}=await ua({testId:s,orgId:l,logger:r,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){t.emit("error",{message:"No session to reset"});return}let{controller:S,context:y}=f;await S.browser.reset({newUrl:p});let E=S.browser.baseUrl;y.reset({baseUrl:E,currentUrl:S.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let T=S.browser.getViewport(),v=Yr.USER_AGENT;r.info({baseUrl:p,viewport:T},`Session reset for test ${s} at ${E}`),t.emit("session",{url:E,userAgent:v,viewport:T,sessionId:c})},uL={event:"reset",createHandler:d2};var p2=({metadata:t,globalE2eStateManager:e})=>{let{sessionId:r}=t;return async({url:n})=>{let o=e.getSession(r);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},dL={event:"switchTab",createHandler:p2};async function pL(t){return QO(t)}var mL=[bx,ZO,tL,uL,cL,Sx,dL,eL,nL,sL,lL,aL,rL,oL,iL,Ex,yx];var hL=t=>{let{logger:e}=t,r=new m2(t.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return r.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await pL({...t,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}mL.forEach(i=>h2(i,{...t,socket:n,metadata:o,logger:e}))}),r},h2=(t,e)=>{let r=t.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(t.event)||e.logger.debug({...e.metadata,event:t.event},`Websocket event (${t.event})`);let i=a=>{e.logger.error({event:t.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=r.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(t.event,n)};import{Router as E2}from"express";import{Router as f2}from"express";import eu from"fs";import Zc from"path";import{v4 as S2}from"uuid";import y2 from"yaml";import{hostname as g2}from"os";var Qc="2.33.2",We=as({app:"desktop-server",hostname:g2(),disableConsoleLogs:!0}).child({cliVersion:Qc});(async()=>{try{let t=await mo(We);t.gitBranchName&&We.addBinding("branch",t.gitBranchName)}catch{}})();var js=f2();async function vE(t){return(await gp(t,We)).map(n=>{let o=t.modules[n.moduleId];if(!o){b.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}js.get("/",Ce(async(t,e)=>{let r=pe(),n=await ee(r),o=await vE(n);e.status(200).json(o)}));js.post("/",Ce(async(t,e)=>{let r;try{r=WA.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Po(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=pe(),o=(await ee(n)).modules;if(Object.values(o).find(s=>s.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let i=Zc.join(n.rootDir,r.folderPath??"");if(!eu.existsSync(i)||!eu.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await hp({...r,folder:i,project:n});e.status(201).json(a)}));js.get("/:moduleId",Ce(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await ee(pe()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await fn(n,r,b);e.json(o)}catch(o){e.status(400).json({err:o})}}));js.post("/:moduleId/duplicate",Ce(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=$A.parse(t.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}try{Po(r.name)}catch(g){e.status(400).json({error:g.message});return}let n=pe(),o=await ee(n),i=o.modules[t.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(g=>g.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let a=await fn(i,o,b),s=Zc.join(n.rootDir,Zc.dirname(i.relativePath));if(!eu.existsSync(s)||!eu.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=He(r.name),l=Zc.join(s,`${c}.module.yaml`),u=S2(),{stepsToSave:d}=await st({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:xt()}}),p={fileType:ye.MODULE,schemaVersion:Me,moduleId:u,name:r.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=y2.stringify(p);eu.writeFileSync(l,m,"utf-8");let h={relativeFilePath:Zc.relative(n.rootDir,l)};e.status(201).json(h)}));js.patch("/:moduleId/metadata",Ce(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=qA.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=pe(),o=await ee(n);$w({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:b,project:n}),e.status(201).json({message:"ok"})}));var gL=js;var fL=E2();fL.get("/",Ce(async(t,e)=>{let r=pe(),n=await ee(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await vE(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var SL=fL;import{Router as b2}from"express";var AE=b2();AE.get("/",Ce((t,e)=>{let r=fp(pe(),We);e.status(200).json(r)}));AE.get("/names",Ce((t,e)=>{let n=pe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var yL=AE;import{Router as T2}from"express";var EL=T2();EL.get("/",Ce((t,e)=>{let r={userId:qo(),orgId:xt(),cliVersion:Qc??"0.0.0"};e.status(200).json(r)}));var bL=EL;import{StreamableHTTPServerTransport as qY}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as KY}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as YY}from"crypto";import{Router as XY}from"express";import{McpServer as $Y}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as WY}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as w2}from"ai";import Km from"dedent";import x2 from"path";import{z as ci}from"zod";import{tool as v2}from"ai";import{z as A2}from"zod";var TL=(t,e)=>({builder:n=>v2({description:t.schema.description,inputSchema:A2.object(t.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${t.schema.name}`);try{await t.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.error({toolName:t.schema.name,input:o,err:a.content.map(s=>s.text).join(`
|
|
4383
|
+
${x.feedback}`,p.status="FAILED",l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,status:"FAILED",message:p.message}),p;L&&l.onDynamicAIActionEvaluatingEvent?.({stepId:L,status:"FAILED",message:x.feedback});break}case"IMPOSSIBLE":return p.message=`Our AI evaluator determined this task cannot be achieved: ${C}`,p.status="FAILED",l.onDynamicAIActionEvaluatingEvent?.({stepId:L??e.id,status:"FAILED",message:p.message}),p}let B=setTimeout(()=>{l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Deciding what to do next..."})},1500);d.info({commandIndex:S,lastActionHint:E},`Generating new sub-command ${S} within AI action`);let G,N;try{({command:G,reasoning:N}=await i.promptToCommand({goal:m,history:f,startingScreenshot:g,disableCache:n?.advanced.disableAICaching??!1,logger:d,actionHint:E,langfuseSessionId:u})),d.info({command:G,reasoning:N},"Got proposed command")}finally{clearTimeout(B)}if(G.type==="FAILURE")return clearTimeout(B),p.status="FAILED",p.message=`Our AI agent determined that no supported actions can fulfill the goals: ${N}`,p;let k={id:EE(),type:"PRESET_ACTION",command:G},q={substepIndex:S+1,message:N||"Generated new command."};l.onDynamicCommandGenerated?.({...q,step:k,parentStepId:e.id}),d.info({commandId:G.id},`Executing sub-command ${S} within AI step: ${ao(G)}`);let $=await r.startSubSteps(),K=(await t.executeStepList({...t,options:{...t.options,disableHealing:!0},listParams:{containerName:"AI action newly generated step",steps:[k],tracer:$}})).results[0];l.onDynamicAIActionStatusUpdateEvent?.({parentStepId:e.id,message:"Waiting for page to stabilize before next action..."}),await i.browser.waitForDOMStability({logger:d});let tt=await i.browser.screenshot({clearHighlights:!0,retries:1});p.results.push(K),f.push({screenshotBase64AfterCommand:`data:image/jpeg;base64,${tt.toString("base64")}`,urlAfterCommand:i.browser.url(),serializedCommand:ao(G),elementInteracted:K.results[0]?.elementInteracted,thoughts:N});let De={substepIndex:S,output:{...K,message:K.message??"Successfully executed preset action."},step:k,parentStepId:e.id};if(l.onDynamicCommandExecuted?.(De),await r.finish({output:Zu.parse(K),step:K,message:K.message,attempt:1}),K.status==="FAILED")if(p.status="FAILED",p.message=K.message,y<3)y++,T=`The last attempted action resulted in a Momentic error. A different element may need to be targeted. Error: ${K.message}`;else return p;else if(K.status==="CANCELLED")return p.status="CANCELLED",p.message=K.message,p;S++}};import{randomUUID as OK}from"crypto";var LK=3;async function GO(t){let{logger:e}=t.fixtures,{results:r}=t.failureRecoveryParams,n=r[r.length-1],o=DK(t.work,n);if(o)return e.info({failedResult:n,isNotEligible:o},"Skipping failure recovery because of ineligible failure"),{type:"NOT_ELIGIBLE",message:`The failed step is not eligible for failure recovery: ${o}`};e.info({failedResult:n},"Attempting failure recovery"),t.work.state.failureRecoveryAttempts=(t.work.state.failureRecoveryAttempts??0)+1;try{return await NK(t)}catch(i){return e.warn({err:i},"Error during failure recovery attempt, continuing..."),null}}async function NK(t){let{fixtures:e,work:r,failureRecoveryParams:n}=t,{controller:o,logger:i}=e,{testMetadata:a}=t.inputs,{results:s,failedStep:c,nextSteps:l,tracer:u}=n;if(!s.length)throw new Error("Attempted failure recovery with no failed results");await Promise.allSettled(r.asyncTasks??[]);let d=o.browser.url(),p=`data:image/jpeg;base64,${(await o.browser.screenshot({})).toString("base64")}`,m=(await o.browser.getBrowserState({})).serialize(),{results:h}=await hs(i,u,s,{numStepsWithScreenshots:8,addIndices:!0,includeBeforeScreenshots:!1}),g=l.map(_=>lo(_)),f=a?.description?.trim(),S=a?.advanced?.failureRecoveryInstructions?.trim(),{scenario:y,thoughts:E,instructions:T}=await o.getFailureRecoveryPlan({currentUrl:d,currentScreenshot:p,failedResults:h,currentPageState:m,nextStepsSerialized:g,testDescription:f||void 0,customInstructions:S||void 0});if(y!=="RECOVERABLE")return i.info({scenario:y,thoughts:E,instructions:T},"Failure recovery is not applicable"),{type:"NOT_ELIGIBLE",message:`Momentic's failure recovery agent determined that this failure is not eligible for recovery: ${E}`};if(!T)throw new Error("Momentic's failure recovery agent did not provide any instructions for recovery");let v={id:OK(),type:"AI_ACTION_DYNAMIC",text:T},x=await Gs(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures},listParams:{steps:[v,c],containerName:"AI-recovered step list",tracer:u}})),C=x.results[0];if(C&&C.type==="AI_ACTION_DYNAMIC")if(Vd({results:x.results,onPresetAction:_=>{_.aiSuggested=!0},onSimpleStepContainer:_=>{_.aiSuggested=!0}}),x.status==="SUCCESS"){let _=`The following steps were automatically executed by the failure recovery agent. Analysis: ${E}`;return C.message=_,kt.increment("test_event",1,["name:failure_recovery_success",`orgId:${t.inputs.orgId}`]),i.info({thoughts:E},"Failure recovery succeeded"),{type:"ATTEMPTED",status:"SUCCESS",result:x,message:_}}else{kt.increment("test_event",1,["name:failure_recovery_failure",`orgId:${t.inputs.orgId}`]);let _=`The following steps were unsuccessfully attempted by the failure recovery agent. Analysis: ${E}`;return C.message=_,i.info({thoughts:E,aiActionResult:C},"Failure recovery failed"),{type:"ATTEMPTED",status:"FAILED",result:x,message:_}}return null}function DK(t,e){if(!e)return"There is no failed result";if(e.type!=="PRESET_ACTION")return"The failed step is not a preset action";let r=e.message;return r?r.includes("AbortError:")?"The user aborted the test":NT.some(n=>r.includes(n))?"The failed step is an irrecoverable configuration error":(t.state.failureRecoveryAttempts??0)>LK?"Too many failure recovery attempts":"":"There is no error message available on the failed step"}import{randomUUID as Bm}from"crypto";import kK from"fast-json-patch";import{cloneDeep as FK}from"lodash-es";async function jO(t){let e=t.failedResults,r=[],{sectionParams:n,fixtures:o,work:i,startingUrl:a,startingContextSnapshot:s,tracer:c}=t,{step:l}=n,{controller:u,logger:d}=o,p=l?.autohealingConfig,m=p?.restartBehavior??{type:"GO_TO_SECTION_START"},h=p?.attempts??1;for(let g=0;g<h;g++){if(!e.terminalResult?.message)throw new Error("No error message in terminal result");let f=FK(l.steps);await Promise.allSettled(i.asyncTasks??[]);let{results:S}=await hs(d,c,e.results,{numStepsWithScreenshots:4}),y=await u.runSectionAutohealing({results:S,errorMessage:e.terminalResult?.message,goal:l.description});f=kK.applyPatch(f,y.patches).newDocument;let E=lr.fromSnapshot({snapshot:s,environmentVariables:o.context.getVariablesFromEnvironmentCopy()});await UK({logger:d,controller:u,tracer:c,context:E,restartConfig:m,startingUrl:a});let T=await Gs(t.work,()=>t.executeStepList({...t,fixtures:{...t.fixtures,context:E},listParams:{steps:f,containerName:"auto-healed step list",tracer:c}}));if(r.push(T.results),T.status==="SUCCESS")return{successfulHealing:{proposedStep:{...l,steps:f},listResult:T,context:E},healingAttempts:r};e=T}return{healingAttempts:r}}async function UK({logger:t,controller:e,tracer:r,restartConfig:n,context:o,startingUrl:i}){switch(n.type){case"NAVIGATE_URL":{let a={id:Bm(),type:"PRESET_ACTION",command:{id:Bm(),type:"NAVIGATE",url:n.url}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}case"GO_TO_SECTION_START":{let a={id:Bm(),type:"PRESET_ACTION",command:{id:Bm(),type:"NAVIGATE",url:i}},s=await r.startStep({logger:t,step:a,attempt:1});await e.executePresetCommand(null,s,a.command,o,!1);break}}}function VO(t,e){switch(t||(t="ON_FAILURE"),t){case"ALWAYS":return!0;case"ON_FAILURE":return!0;case"ON_ACTION_FAILURE":return!(!e||e.type==="PRESET_ACTION"&&Zb(e.command.type))}}async function $O(t){let{step:e,tracer:r}=t.sectionParams,{logger:n,controller:o,context:i}=t.fixtures,a=new Date,s=o.browser.url(),c=i.toObjectCopy(),l=await r.startSubSteps(),u=async()=>t.executeStepList({...t,listParams:{steps:e.steps,containerName:"section step list",tracer:l}}),d=e.autohealingConfig?await Gs(t.work,u):await u(),p,m;if(d.status==="FAILED"&&e.autohealingConfig&&!t.work.state.autoHealingDisabled&&VO(e.autohealingConfig.trigger,d.terminalResult)){let g=await r.startSubSteps(),f=await jO({...t,startingContextSnapshot:c,startingUrl:s,failedResults:d,tracer:g});f.successfulHealing&&(p=f.successfulHealing.proposedStep,d=f.successfulHealing.listResult,t.fixtures.context=f.successfulHealing.context),m=f.healingAttempts}let h={...e,...d,startedAt:a,finishedAt:new Date,proposedStep:p,healingAttempts:m};return Wr({asyncTasks:t.work.asyncTasks,nestedResults:d.results,result:h,logger:n}),h}var zK=60*60*1e3;async function Tn(t){let{results:e=[],containerName:r,steps:n,tracer:o}=t.listParams,{logger:i}=t.fixtures,a=o.getParentStepIdChain(),{fromStep:s,toStep:c}=t.inputs,l="SUCCESS",u,d=0;for(d;d<n.length;d++){let p=n[d];if(p.skipped)continue;if(t.work.fastForwardingToStep&&s){let y=JSON.stringify(a);if(p.id===s.fromStepId&&y===JSON.stringify(s.parentStepIdChain))t.work.fastForwardingToStep=!1;else if(!NC(p,a,s.fromStepId,s.parentStepIdChain))continue}let m=lo(p),h=0,g=1,f=Date.now();"retries"in p&&p.retries&&p.retries>0&&(g+=p.retries);let S;for(;h<g&&Date.now()-f<zK;){h++,i.info({step:p,currentAttempt:h},`Executing step ${d+1}/${n.length} in ${r}: ${m}`);let y=Date.now(),{stepResult:E,status:T,failureRecoveryResults:v,shouldStopExecuting:x}=await HK({attempt:h,params:t,step:p,i:d,steps:n,results:e,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:h===g});if(T==="FAILED"&&h<g){S=[...S??[],E],Date.now()-y<1e3&&await le(1e3-(Date.now()-y));continue}else e.push(E),S&&(E.previousAttempts=S);if(v&&e.push(...v),x)return l=T,u=E,{status:l,results:e,terminalResult:u};break}}return{status:l,results:e,terminalResult:u}}async function HK({attempt:t,params:e,step:r,i:n,steps:o,results:i,currentParentIdChain:a,fromStep:s,toStep:c,lastRetry:l}){let{tracer:u}=e.listParams,{logger:d,context:p,controller:m,codeEvalTools:h,usageTracker:g}=e.fixtures,{orgId:f}=e.inputs,S=new Date,y=await u.startStep({logger:d,step:r,attempt:t}),E=BK(r),T=p.toRedactedDisplayCopy(),v=m.browser.url(),x=m.executeAbortController.signal;g.trackStepExecution(r);let C,_;switch(r.type){case"PRESET_ACTION":{C="Preset action",_=await ca(r,async()=>await Um({...e,presetParams:{tracer:y,step:r}}),x);break}case"AI_ACTION":{C="AI action",_=await ca(r,()=>UO({...e,aiStepParams:{step:r,tracer:y},executeStepList:Tn}),x);break}case"AI_ACTION_DYNAMIC":{C="AI action",_=await ca(r,()=>zO({...e,aiStepParams:{step:r,tracer:y},executeStepList:Tn}),x);break}case"RESOLVED_MODULE":{C=`Module (${r.name})`,_=await ca(r,async()=>{let k=await LO({orgId:f,step:r,context:p,logger:d,codeEvalTools:h,signal:x});return yE({...e,executeStepList:Tn,moduleParams:{step:r,resolvedInputs:k,tracer:y}})},x);break}case"CONDITIONAL":{C="Conditional step",_=await ca(r,()=>kO({...e,conditionalParams:{step:r,tracer:y},executeStepList:Tn}),x);break}case"SECTION":{C="Section",_=await ca(r,()=>$O({...e,sectionParams:{step:r,tracer:y},executeStepList:Tn}),x);break}default:return(q=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}_.beforeUrl=_.beforeUrl??v,_.beforeTestContext=T,r.envKey&&p.setVariable(r.envKey,_.data);let L=m.browser.url();p.setCurrentUrl(L),_.afterUrl=_.afterUrl??L,_.afterTestContext=p.toRedactedDisplayCopy(),await GK({step:r,startedAt:S,stepTypeName:C,result:_,callbacks:e.callbacks,globalWorkRef:e.work,tracer:y,attempt:t});let B,G;if(l&&_.status==="FAILED"&&!e.work.state.failureRecoveryDisabled&&s?.fromStepId===void 0&&c?.toStepId===void 0){let k=await GO({...e,executeStepList:Tn,failureRecoveryParams:{failedStep:E,nextSteps:o.slice(n+1),results:i.concat(_),tracer:u}});k&&(k.type==="ATTEMPTED"?(B=k.result.results,G=k.status):k.type==="NOT_ELIGIBLE"&&(_.message=_.message?`${_.message} ${k.message}`:k.message),_.type==="PRESET_ACTION"&&(_.failureRecoveryStatus={type:k.type,message:k.message}))}return e.work.fastForwardingToStep&&s&&(s.fromStepId===r.id&&JSON.stringify(a)===JSON.stringify(s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1),r.type==="RESOLVED_MODULE"&&Qf(a,s.parentStepIdChain)&&(e.work.fastForwardingToStep=!1)),_.status!=="SUCCESS"&&G!=="SUCCESS"||m.closed?{shouldStopExecuting:!0,status:_.status,stepResult:_,failureRecoveryResults:B}:c&&r.id===c.toStepId&&JSON.stringify(a)===JSON.stringify(c.parentStepIdChain)?(m.setClosed(),{shouldStopExecuting:!0,status:"SUCCESS",stepResult:_,failureRecoveryResults:B}):{shouldStopExecuting:!1,status:"SUCCESS",stepResult:_,failureRecoveryResults:B}}async function GK({stepTypeName:t,step:e,result:r,tracer:n,attempt:o,startedAt:i}){let a=t.toLowerCase(),s=t.charAt(0).toUpperCase()+t.slice(1);n.recordStepDuration({step:e,durationMs:Date.now()-i.getTime()});let c="";switch(r.status){case"SUCCESS":c=r.message??`${s} executed successfully.`;break;case"FAILED":c=r.message??`${s} failed.`;break;case"CANCELLED":c=r.message??`${s} cancelled.`;break;default:throw new Error(`Unexpected ${a} status: ${r.status}`)}await n.finish({step:r,message:c,output:Zu.parse(r),attempt:o})}var WO="MOMENTIC_RUN_ID",qO="FINAL_SCREENSHOT_URL";import{randomUUID as KO}from"crypto";async function YO({browser:t,signal:e}){let r=new Date;try{return await t.navigate({url:t.baseUrl,initialNavigation:!0}),{status:"PASSED",results:[]}}catch(n){let o={id:KO(),type:"PRESET_ACTION",status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",failureReason:"UserInfrastructureError",message:n.message,startedAt:r,finishedAt:new Date,results:[],command:{id:KO(),type:"NAVIGATE",url:t.baseUrl}};return{status:e.aborted||n.name==="AbortError"?"CANCELLED":"FAILED",results:[],failedStepResult:o}}}var zm=async t=>{let{orgId:e,runId:r,testMetadata:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs;t.fixtures.logger=t.fixtures.logger.child({orgId:e,runId:r,testId:n?.id});let{logger:s,controller:c}=t.fixtures,{onTestComplete:l,onTestSuccess:u,onTestFailure:d}=t.callbacks.test,p=iM(s);if(t.options.reinitializeBrowser){let h=await YO({browser:c.browser,signal:c.executeAbortController.signal});if(h.status!=="PASSED")return await l?.(),clearInterval(p?.interval),h}let m;try{return s.info({platform:p?.platform,cpuMetadata:p?.cpuMetadata,labels:n?.labels,orgSettings:aR.parse(t.inputs.orgSettings)},`Starting run for Momentic test '${n?.name??"Unnamed test"}'`),m=await VK(t),m}finally{s.info({status:m?.status,labels:n?.labels},"Momentic test final result"),clearInterval(p?.interval),await l?.(),m?.status==="PASSED"?await u?.({steps:o,beforeSteps:i,afterSteps:a}):m?.status==="FAILED"&&await d?.({steps:o,beforeSteps:i,afterSteps:a})}};function jK({beforeStatus:t,mainStatus:e,afterStatus:r}){return t==="FAILED"?"FAILED":t==="CANCELLED"?"CANCELLED":r==="FAILED"?"FAILED":r==="CANCELLED"?"CANCELLED":e==="FAILED"?"FAILED":e==="CANCELLED"?"CANCELLED":"PASSED"}var VK=async t=>{let{tracer:e}=t.testParams,{fromStep:r,toStep:n,steps:o,beforeSteps:i,afterSteps:a}=t.inputs,{logger:s,controller:c,context:l,storage:u}=t.fixtures,{collectDebugData:d,disableHealing:p}=t.options;l.setCurrentUrl(c.browser.url());let m="test",h=o,g=[],f=p||r!==void 0||n!==void 0||void 0,S={results:g,state:{autoHealingDisabled:f,failureRecoveryDisabled:f,failureRecoveryAttempts:0},asyncTasks:[]},y=!1;r?.fromStepId&&r.fromStepId===n?.toStepId?(m="filtered step",S.fastForwardingToStep=!0):r?.fromStepId?(m="partial steps list from step",S.fastForwardingToStep=!0):n?m="partial steps list until step":(m="entire test",y=!0);let E,T,v;if(y&&i&&i.length>0){let N=await XO(i,"beforeSteps",t);E=N.status,T=N.results,v=N.terminalResult?{...N.terminalResult,failureReason:"SetupFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(N.failureRecoveryAttempts??0)}let x,C;if(E===void 0||E==="PASSED"){s.info({fromStep:r,toStep:n},`Starting execution of ${m}`);let N=await e.startMainStepList(),k=await Tn({...t,work:S,listParams:{steps:h,containerName:m,results:g,tracer:N}});x=k.status,C=k.terminalResult}let _,L,B;if(y&&a&&a.length>0){let N=await XO(a,"afterSteps",t);_=N.status,L=N.results,B=N.terminalResult?{...N.terminalResult,failureReason:"TeardownFailureError"}:void 0,S.state.failureRecoveryAttempts=(S.state.failureRecoveryAttempts??0)+(N.failureRecoveryAttempts??0)}let G=jK({beforeStatus:E,mainStatus:x,afterStatus:_});if(d&&$K({tracer:e,work:S,controller:c,storage:u,context:l,logger:s,status:G}),await Promise.allSettled(S.asyncTasks),S.asyncTasks.push(Promise.resolve(t.callbacks.test.onSaveFinalRunResults?.({results:g,beforeResults:T,afterResults:L}))),G==="FAILED"){let N=E==="FAILED"?v:void 0,k=_==="FAILED"?B:void 0;return{status:"FAILED",results:g,beforeResults:T,afterResults:L,failedStepResult:N??C??k}}else if(G==="CANCELLED")return{status:"CANCELLED",results:g,beforeResults:T,afterResults:L};return{status:"PASSED",failureRecoveryDetails:S.state.failureRecoveryAttempts?{attempts:S.state.failureRecoveryAttempts}:void 0,results:g,beforeResults:T,afterResults:L}};async function XO(t,e,r){let n=r.fixtures.logger,o=e==="beforeSteps"?await r.testParams.tracer.startBeforeStepList():await r.testParams.tracer.startAfterStepList();n.info(`Starting step execution for ${e}`);let i={results:[],asyncTasks:[],state:{}},a={...r.callbacks,test:{...r.callbacks.test,onSaveFinalRunResults:void 0,onUpdateRun:void 0,onTestComplete:void 0,onTestSuccess:void 0}},{status:s,results:c,terminalResult:l}=await Tn({...r,work:i,callbacks:a,listParams:{steps:t,containerName:e,tracer:o}});await Promise.allSettled(i.asyncTasks);let u;return s==="SUCCESS"?u="PASSED":s==="CANCELLED"?u="CANCELLED":u="FAILED",{status:u,results:c,terminalResult:l,failureRecoveryAttempts:i.state.failureRecoveryAttempts}}function $K({tracer:t,work:e,controller:r,storage:n,logger:o,context:i,status:a}){let s=r.browser,c=s.retrieveAndClearDebugData(),l=zC(c.logsPerPage);t.attachConsoleLogs({logger:o,logs:l}),a!=="PASSED"&&a!=="SUCCESS"&&(t.attachBrowserCrashDump({crashReportDirFetcher:()=>s.browserCrashDumpDir,logger:o}),e.asyncTasks.push((async()=>{try{let u=await s.screenshot({quality:75}),d=await lO({codePath:"test-complete-final",storage:n,screenshotBuff:u,logger:o}),p=await V(s.html(),{milliseconds:2e3});i.setVariable(qO,d),o.debug({finalPageHtml:p.slice(0,1e4)},"Final page state HTML"),o.debug({finalScreenshotUrl:d},"Uploaded final screenshot URL")}catch{}})()))}async function Hm({settings:t,customHeaders:e,envVariables:r,envName:n,testName:o,baseUrl:i,logger:a,localTools:s,orgId:c}){let l=Ga.parse(t);e&&(l.extraHeaders={...l.extraHeaders,...e});let u=new lr({baseUrl:i,envName:n,testName:o,variablesFromEnvironment:r,currentUrl:i});await Ap({obj:l,context:u,bannedKeys:[],allowList:wv,localTools:s,logger:a,orgId:c});try{return Ga.parse(l)}catch(d){throw new M("UserConfigurationError",`The templated browser settings configured by the user are invalid: ${d.message}`)}}async function Gm({orgId:t,testName:e,envName:r,baseEnvVariables:n,parameters:o,logger:i,localTools:a}){if(!o||o.length===0)return{...n};let s={...n};return await Promise.all(o.map(async c=>{let l=await mr({orgId:t,s:c.defaultValue,context:lr.dummyContext(e,r,s),logger:i,localTools:a});s[c.name]=l})),s}import{cloneDeep as XK}from"lodash-es";import{cloneDeep as WK}from"lodash-es";var qK={showOverlay:!1},jm=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:r,cleanup:n,clientIp:o,sessionId:i,socket:a}){return this.sessions.set(i,{controller:e,context:r,cleanup:n,clientIp:o,browserBehavior:WK(qK),socket:a}),i}removeSession(e,r){(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){r.error({err:a},"Error cleaning up browser in global state manager")}try{await o.cleanup?.()}catch(a){r.error({err:a},"Error running cleanup function in global state manager")}this.sessions.delete(e)})()}getSession(e){return this.sessions.get(e)}};function JO(t,e,r,n){let o=Date.now(),i=Date.now(),a,s,c,l,u=!1,d=async(g,f)=>{if(!g.closed&&!g.isInPageLoad)try{let S=c;c=void 0;let y=g.url(),E=f.toEditorDisplayCopy();JSON.stringify(E)===JSON.stringify(a)&&y===l&&o>i||(t.emit("browserState",{logsPerPage:S?.logsPerPage,viewport:g.getViewport(),url:y,iframeSrcUrls:s??[],context:E,isInPageLoad:g.isInPageLoad}),o=Date.now()),l=y,a=E}catch(S){if(!t.connected)return;let y=S instanceof Error?S.message:`${S}`;if(y.includes("Frame was detached")||y.includes("Not attached to an active page")||y.includes("browser has been closed")||y.includes("UserInfrastructureError"))return;r.error({err:S,sessionId:e},"Error grabbing browser state")}},p=setInterval(()=>{let g=n.getSession(e),f=g?.controller?.browser;if(!f||f.closed){r.debug("Clearing browser state socket cron due to the browser being closed"),clearInterval(p);return}d(f,g.context)},1e3),m=(g,f)=>!!(JSON.stringify(g)!==JSON.stringify(s)||f.logsPerPage.some(S=>S.length>0)),h=setInterval(async()=>{let f=n.getSession(e)?.controller?.browser;if(!f||f.closed){clearInterval(h);return}else if(u)return;u=!0;try{let S=await f.getAllFrameUrls(),y=f.retrieveAndClearDebugData();m(S,y)&&(s=S,c=y,i=Date.now())}catch(S){r.warn({err:S},"Failed to fetch extended details")}finally{u=!1}},2500);return{timers:[p,h]}}var KK=3;async function QO({socket:t,logger:e,storageFactory:r,uploadedFileStorage:n,visualDiffStorageFactory:o,devicePixelRatio:i,generatorFactory:a,enricherFactory:s,authorization:c,settingsFactory:l,getOrgId:u,branchGetter:d,globalE2eStateManager:p}){let m=t.id,h=t.handshake.query.testId;if(!h)throw new Error("Socket connection request is missing testId");let g=await u({type:"e2e",testId:h}),f=await d?.();e=e.child({testId:h,orgId:g,sessionId:m,branch:f});let S=await a(g,e),y=await s(g,e),E=await l(g,e),T=await r(g),{testMetadata:v,baseUrl:x,envName:C,browserConfig:_,aiSettings:L,environmentVariables:B,localCodeEvalTools:G}=await ua({testId:h,orgId:g,logger:e,storage:T,authorization:c,settings:E}),N=p.getSession(m);if(N)return e.info("Associating connection with existing session (likely reconnect)"),await N.controller.browser.clearAllCdpHighlights(),{type:"e2e",sessionId:m,orgId:g,testId:h};let k=t.handshake.headers["x-forwarded-for"]?.split(",")[0];if(e.info({clientIp:k,event:"connect",args:t.handshake.query},"Websocket event (connect)"),k&&p.getCurrentConnectionsByIp(k)>=KK)throw e.error({clientIp:k,sessions:p.getCurrentSessionsByIp(),...t.handshake.query},"Socket connection browser creation rate limit triggered"),new Error("You have exceeded the maximum number of connections allowed. Momentic limits the number of simultaneously open tabs to uphold browser reliability. Please close duplicate tabs and try again later.");p.reserveCapacityByIp(k);try{await YK({socket:t,baseUrl:x,envName:C,testMetadata:v,orgId:g,sessionId:m,logger:e,environmentVariables:B,clientIp:k,devicePixelRatio:i,storage:T,uploadedFileStorage:n,visualDiffScreenshotStorage:await o(g),localCodeEvalTools:G,generator:S,enricher:y,browserConfig:_,aiSettings:L,globalE2eStateManager:p})}catch(q){throw e.warn({err:q},"Error setting up socket session, possibly due to client closing the connection"),p.releaseCapacityByIp(k),q}return{type:"e2e",sessionId:m,testId:h,orgId:g}}async function YK({socket:t,baseUrl:e,envName:r,devicePixelRatio:n,testMetadata:o,orgId:i,sessionId:a,logger:s,storage:c,uploadedFileStorage:l,visualDiffScreenshotStorage:u,localCodeEvalTools:d,generator:p,environmentVariables:m,browserConfig:h,aiSettings:g,clientIp:f,enricher:S,globalE2eStateManager:y}){let E={viewport:o.advanced?.viewport??Kt,locale:o.advanced?.locale??Lo,timezoneId:o.advanced?.timezone??No,geolocation:o.advanced?.geolocation??Do,colorScheme:o.advanced?.colorScheme};n&&(E.deviceScaleFactor=n);let T=o.id,v=await Hm({settings:h,orgId:i,baseUrl:e,envName:r,testName:o.name,localTools:d,envVariables:m,logger:s,customHeaders:void 0});s=s.child({orgId:i,sessionId:a,testId:T});let x=await Yr.init({baseUrl:e,userBrowserSettings:v,enricher:S,storage:c,logger:s,contextArgs:E,iconKnowledgeBase:null,callbacks:{onTabsChange:(G,N)=>{t.emit("tabs",{tabs:G,activeTab:N})},onScreencastFrame:(G,N)=>{let k=t;Vr&&(k=t.compress(!0)),k.emit("screenshot",{buffer:G},()=>{N()})},onSvgsCollected:G=>{t.emit("newIconDetected",{numIcons:G.newSvgs.length}),c.saveNewIcons(G,s)},onNetworkLogs:G=>{t.emit("networkLogs",{harEntries:G})}}});await x.navigate({url:e,initialNavigation:!0});let C=new li({browser:x,generator:p,logger:s,orgId:i,options:{scratchPadId:void 0,slowMoMs:v.slowMoMs,autoFollowNewTabs:v.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:c,localCodeEvalTools:d,uploadedFileStorage:l,visualDiffScreenshotStorage:u}),_=JO(t,a,s,y),L=async()=>{_.timers.forEach(G=>clearInterval(G))},B=new lr({baseUrl:e,testName:o.name,currentUrl:C.browser.url(),variablesFromEnvironment:m,envName:r});if(!t.connected)throw await x.cleanup(),new Error("Socket not connected anymore, not proceeding with session setup");t.emit("session",{url:e,userAgent:Yr.USER_AGENT,viewport:C.browser.getViewport(),sessionId:a}),y.registerSession({controller:C,context:B,sessionId:a,cleanup:L,clientIp:f,socket:t})}async function ua({testId:t,orgId:e,logger:r,storage:n,authorization:o,settings:i}){let a=await n.fetchTestMetadata(t,r);if(!a)throw new Error(`Test metadata could not found for test ${t}`);let s;o?.type==="API_KEY"&&(s=new Nn({httpClient:new zt({...o,logger:r,mode:"interactive"}),fakerSeed:void 0}));let c=a.envs?.find(g=>g.default),l;c&&(l=await n.fetchEnvironment(c.name,r));let u=l&&"browser"in l?l.browser:void 0,d={...i.browser,...u,...a.advanced};d.browserType=Ku({browserType:d.browserType,orgDefaultBrowserType:i.browser?.defaultBrowserType});let p=a.baseUrl||l?.variables?.[At];if(!p)throw new Error("Base URL is empty in both test options and the configured environment");let m={...l?.variables};m=await Gm({orgId:e,testName:a.name,envName:l?.name,baseEnvVariables:m,parameters:a.parameters,logger:r,localTools:s});let h={...i.ai,...a.advanced};return{localCodeEvalTools:s,baseUrl:p,envName:l?.name,testName:a.name,browserConfig:d,environmentVariables:m,testMetadata:a,aiSettings:h}}var bE=class{parentTracer=null;socket;step;orgId;constructor({step:e,socket:r,parentTracer:n,orgId:o}){this.socket=r,this.parentTracer=n,this.step=e,this.orgId=o}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;kt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}recordTargetAutoHeal(){}async finish(e){switch(e.step.status){case"SUCCESS":this.socket.emit("success",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"FAILED":this.socket.emit("failure",{...e,parentStepIdChain:this.getParentStepIdChain()});return;case"CANCELLED":this.socket.emit("cancelled",{...e,parentStepIdChain:this.getParentStepIdChain()});return}}async startSubSteps(){return new So({parentStep:this.step,socket:this.socket,parentTracer:this,orgId:this.orgId})}},So=class{stepFrequenciesByType={};parentTracer;parentStep;socket;orgId;recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))kt.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:editor",`orgId:${this.orgId}`])}constructor({parentStep:e,socket:r,parentTracer:n,orgId:o}){this.parentTracer=n,this.parentStep=e,this.socket=r,this.orgId=o}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.recordStepStat(e.step),this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:this.getParentStepIdChain(),attempt:e.attempt}),new bE({step:e.step,parentTracer:this,socket:this.socket,orgId:this.orgId})}async finish(){this.sendFinalizedStepStats()}},Vm=class{constructor(e,r,n,o){this.socket=e;this.storage=r;this.orgId=n;this.testId=o}children=[];loggerBindings;setActiveVideo(){}async getScreenshot(){throw new Error("getScreenshot is not supported in the editor")}async getHtmlSnapshot(){throw new Error("getHtmlSnapshot is not supported in the editor")}onNetworkPage(){}onNetworkLogs(){}attachConsoleLogs(){}attachBrowserCrashDump(){}async finish(){this.socket.emit("finished"),await Promise.all(this.children.map(e=>e.finish()))}async startBeforeStepList(){let e=new So({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startMainStepList(){let e=new So({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}async startAfterStepList(){let e=new So({orgId:this.orgId,parentStep:null,parentTracer:null,socket:this.socket});return this.children.push(e),e}};var TE={currentlyExecutingRequests:{}},JK=t=>async(e,r)=>{let{testId:n,orgId:o}=t.metadata,i=await t.settingsFactory(o,t.logger),a=await t.storageFactory(o),s,c=await ua({testId:n,orgId:o,logger:t.logger,storage:a,authorization:t.authorization,settings:i}),l=`${n}|${c.baseUrl}`;try{let u=TE.currentlyExecutingRequests[l]??0;TE.currentlyExecutingRequests[l]=u+1,s=await QK({...t,...e,...c,done:r})}finally{t.logger.info({result:s,sessionId:t.metadata.sessionId},"Test execution complete"),TE.currentlyExecutingRequests[l]--}},QK=async({socket:t,steps:e,baseUrl:r,testMetadata:n,reInitialize:o,toStep:i,fromStep:a,storageFactory:s,aiSettings:c,browserConfig:l,metadata:u,logger:d,envName:p,testName:m,environmentVariables:h,localCodeEvalTools:g,done:f,cacheStorageFactory:S,globalE2eStateManager:y})=>{let{testId:E,sessionId:T,orgId:v}=u,x=T,C=y.getSession(T);if(!C)throw new Error("No active session found");let{controller:_,context:L}=C;_.setOpen(),d=d.child({testId:E,orgId:v,sessionId:T,runId:x}),d.info({steps:e.map(se=>`${se.type}${"command"in se?` - ${se.command.type}`:""}`),toStep:i,fromStep:a,reInitialize:o,envName:p,testName:m,baseUrl:r,context:L,browserConfig:l,aiSettings:c},"Socket execution parameters");let B=h??{},G=async()=>{o&&(await _.browser.reset({newUrl:r}),L.reset({baseUrl:r,currentUrl:_.browser.url(),variablesFromEnvironment:B,envName:p,testName:m}))},N=await s(v),k=await S(v),q=async()=>{let se=Date.now();try{await k.resolveStepCacheEntries({schemaVersion:n.schemaVersion,testId:E,stepLists:{steps:e},logger:d})}catch(Je){d.error({err:Je},"Failed to fetch step cache entries from Momentic server. This can drastically reduce test reliability and performance.")}finally{kt.distribution("cache-resolution",Date.now()-se,["executor:editor"])}};try{await mc({promiseGenerator:async()=>Promise.all([G(),q()]),signal:_.executeAbortController.signal,codePath:"resolveStepCacheAndInitBrowser"}),_.setOpen()}catch(se){if(t.emit("finished"),se.name!=="AbortError")throw new Error(`Failed to setup browser for execution: ${se}`)}let $=XK(e),he={collectDebugData:!1,reinitializeBrowser:!1,disableHealing:!0},K={orgId:v,runId:x,testMetadata:n,steps:e,fromStep:a,toStep:i,orgSettings:{ai:c,browser:l}},tt={controller:_,context:L,storage:N,codeEvalTools:g,usageTracker:new Ya,logger:d},De={test:{},step:{onDynamicAIActionStatusUpdateEvent:se=>{t.emit("dynamicCommandStatusUpdate",se)},onDynamicAIActionEvaluatingEvent:se=>{t.emit("dynamicCommandEvaluating",se)},onDynamicCommandGenerated:se=>{t.emit("dynamicCommandGenerated",se)},onDynamicCommandExecuted:se=>{t.emit("dynamicCommandExecuted",se)}}},ft=new Vm(t,N,v,E),rr=await zm({fixtures:tt,options:he,callbacks:De,inputs:K,testParams:{tracer:ft}}),je={logger:d,cacheStorage:k,orgId:v,testId:E,originalStepsWithCaches:{steps:$},updatedStepsWithCaches:{steps:e}};return rr?.status==="PASSED"?await ep(je):rr?.status==="FAILED"&&await tp(je),await ft.finish(),f?.(rr),rr.status};var ZO={event:"execute",createHandler:JK};import{cloneDeep as ZK}from"lodash-es";var e2=t=>async({command:e},r)=>{let{logger:n,generatorFactory:o,metadata:i}=t,a=ZK(e),s=Cw(a);if(s.category!=="NO_DESCRIPTION_PROVIDED"){if(s.category!=="NONE"){r?.({result:s});return}"cache"in a&&(a.cache=void 0);try{let l=await(await o(i.orgId,n)).getLintStepResult({command:a},{logger:n});r?.({result:l})}catch(c){n.error({event:"lint",err:c},"Failed to lint step"),r?.({result:void 0})}}},eL={event:"lintStep",createHandler:e2};import{randomUUID as t2}from"crypto";var r2=({metadata:t,logger:e,storageFactory:r,globalE2eStateManager:n})=>{let{sessionId:o,orgId:i}=t;return async(a,s)=>{let{description:c,command:l,testMetadata:u,returnScreenshot:d}=a;e.info({params:a},`Locate handler called - ${c}`);let p=n.getSession(o);if(!p)throw new Error("No active session found");let{controller:m,context:h}=p;m.setOpen();let g=await r(i),f=Di.parse(u.advanced??{}),S={},y;if(c){if("useSelector"in l&&l.useSelector)try{let E=await m.locateElementWithSelector(c,"iframeUrl"in l?l.iframeUrl:void 0);y=E.resolution.locator,S={target:E.target,thoughts:E.thoughts}}catch(E){e.warn({err:E},"Failed resolving target with selector"),s({err:`Failed locating element: ${E.message}`,decisions:E instanceof Dr?E.decisions:void 0});return}else try{let E=await m.locateElement({description:c,disableCache:f.disableAICaching??!1,skipWait:!0,testContext:h,source:Ii(l),iframeUrl:"iframeUrl"in l?l.iframeUrl:void 0,memory:"cache"in l&&l.cache&&"target"in l.cache&&Au(l.cache.target.memory)?l.cache.target.memory:void 0,logger:e});S={target:E.target,thoughts:E.thoughts},y=E.resolution.locator}catch(E){(async()=>{try{let T=await m.browser.getCondensedHtml({skipWait:!0});e.warn({err:E,html:T.slice(0,1e5)},"Failed locating element with AI")}catch(T){e.warn({err:T},"Failed grabbing HTML after trying to locate element with AI")}})(),s({err:`${E.message}`});return}if(l.type==="SELECT_OPTION"&&y)try{S.options=await m.browser.getSelectOptions(y)}catch(E){e.warn({err:E},"Failed getting select options"),s({err:`Failed getting select options: ${E.message}`});return}e.info({result:S},"Locate handler result")}if(d)try{let{buffer:E,width:T,height:v}=await m.screenshotWithDimensions({clearHighlights:!0,locator:y}),x=t2(),{universalHandle:C,appServerUrl:_}=await g.createOnDemandScreenshot(x,E,"image/jpeg");S.screenshot={data:C,width:T,height:v},e.info({width:T,height:v,appServerUrl:_,universalHandle:C},"Captured screenshot during locate")}catch(E){e.error({err:E},"Error capturing screenshot during locate"),s({err:`Error taking screenshot: ${E.message}`});return}if(s({result:S}),y)try{await Promise.all([m.browser.scrollIntoViewIfNeeded(y),m.browser.highlight(y)])}catch(E){e.warn({err:E},"Error highlighting element, continuing...")}}},tL={event:"locate",createHandler:r2};var n2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({event:o,percentX:i,percentY:a})=>{let s=r.getSession(n);if(!s)throw new Error("No active session found");let c=s.controller.browser;if(c.closed||c.getActivePage().isClosed()){e.warn("Ignoring mouse move because the browser is closed");return}try{await c.clickMouseFromPositionPercentages(o,i,a)}catch(l){e.error({err:l},"Error performing click during cloud recording in control mode")}}},rL={event:"mouseClickEvent",createHandler:n2};var o2=({metadata:t,generatorFactory:e,logger:r,socket:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c,parentStepIdChain:l,attribute:u})=>{let d=o.getSession(i);if(!d)throw new Error("No active session found");let{controller:p}=d,m=await e(a,r);p.setOpen(),d.browserBehavior.showOverlay=!0;let h=new AbortController;h.signal.addEventListener("abort",async()=>{try{d.browserBehavior.showOverlay=!1,await p.stopRecordMode()}catch(S){r.warn({err:S},"Failed to stop record mode in target click socket handler")}},{once:!0});let g=!1,f=(S,y)=>{y.type!=="PRESET_ACTION"||y.command.type!=="CLICK"||(n.emit("targetRecordingUpdate",{type:S,stepId:c,parentStepIdChain:l,command:y.command,attribute:u}),h.abort(),g=!0)};setTimeout(()=>{g||(h.abort(),n.emit("targetRecordingUpdate",{type:"error",err:"Timed out waiting for click event",stepId:c,parentStepIdChain:l,attribute:u}))},1e4),await p.startRecordMode({params:{generator:m,logger:r,testId:s,orgId:a,callbacks:{onActionReceived:S=>f("clickReceived",S),onStepRecorded:S=>f("descriptionGenerated",S)}},abortController:h,isClickToRecord:!0}),n.emit("targetRecordingUpdate",{type:"listenersInitialized",stepId:c,parentStepIdChain:l,attribute:u})}},nL={event:"recordTargetClick",createHandler:o2};var i2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyDown(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key down socket event error");return}throw s}}},oL={event:"keyDownEvent",createHandler:i2};var a2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async({key:o})=>{let i=r.getSession(n);if(!i)throw new Error("No active session found");if(o==="Dead")return;let{controller:a}=i;if(a.browser.closed||a.browser.getActivePage().isClosed()){e.debug({sessionId:n},"Browser is closed, ignoring keyboard press socket event");return}try{a.setOpen(),await a.browser.keyUp(o,{})}catch(s){if(s.message.includes("has been closed")){e.debug({sessionId:n,err:s},"Browser is closed, ignoring key up socket event error");return}throw s}}},iL={event:"keyUpEvent",createHandler:a2};var s2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t,o,i=0,a=(l,u)=>{let d=async()=>{o=void 0};clearTimeout(o),o=setTimeout(d,Math.min(1e3,250*(i+1)))},s,c=0;return async l=>{let u=r.getSession(n);if(!u)throw new Error("No active session found");let{controller:d,browserBehavior:p}=u,m=d.browser;if(m.closed||m.getActivePage().isClosed()){e.warn("Ignoring mouse move because the page is closed");return}if(l.event==="scroll"){let h=await m.scrollFromPositionPercentages(l.percentX,l.percentY,s?.x??0,s?.y??0),g=u.browserBehavior.recordingState?.transformer;g&&h&&g.recordScroll(h);return}p.showOverlay&&a(m,l);try{let h=await m.moveMouseFromPositionPercentages(l.percentX,l.percentY);c=0,s=h}catch(h){c++,c%5===0&&e.warn({err:h,mouseErrors:c},"Error in socket mouse move handler")}}},aL={event:"mouseMoveEvent",createHandler:s2};var l2=({metadata:t,generatorFactory:e,socket:r,logger:n,globalE2eStateManager:o})=>{let{sessionId:i,orgId:a,testId:s}=t;return async({stepId:c})=>{let l=o.getSession(i);if(!l)throw new Error("No active session found");let{controller:u,browserBehavior:d}=l,p=await e(a,n);n.info("Starting cloud recording");let m=new AbortController,h=await u.startRecordMode({params:{generator:p,logger:n,testId:s,orgId:a,callbacks:{onActionReceived:(g,f)=>{r.emit("stepRecorded",{stepId:c,step:g,offset:f})},onStepRecorded:(g,f)=>{r.emit("stepRecorded",{stepId:c,step:g,offset:f})}}},abortController:m,isClickToRecord:!1});d.recordingState={transformer:h}}},sL={event:"recordingStart",createHandler:l2};var c2=({metadata:t,logger:e,globalE2eStateManager:r})=>{let{sessionId:n}=t;return async()=>{let o=r.getSession(n);if(!o)throw new Error("No active session found");e.info("Stopping cloud recording"),await o.controller.stopRecordMode(),o.browserBehavior.recordingState=void 0,o.browserBehavior.showOverlay=!1}},lL={event:"recordingStop",createHandler:c2};var u2=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async(s,c)=>{let{testId:l,sessionId:u,orgId:d}=e;r.info({testId:l,sessionId:u},"Refresh event received");let p=await i(d,r),m=await n(d),{baseUrl:h}=await ua({testId:l,orgId:d,logger:r,storage:m,authorization:o,settings:p}),g=a.getSession(u);if(!g){t.emit("error",{message:"No session to refresh"});return}let{controller:f}=g;f.setOpen(),await f.browser.refresh();let S=f.browser.getViewport();r.info({baseUrl:h,viewport:S},`Session refreshed for test ${l} at ${h}`),c()},cL={event:"refresh",createHandler:u2};var d2=({socket:t,metadata:e,logger:r,storageFactory:n,authorization:o,settingsFactory:i,globalE2eStateManager:a})=>async()=>{let{testId:s,sessionId:c,orgId:l}=e;r.info({testId:s,sessionId:c},"Reset event received");let u=await i(l,r),d=await n(l),{baseUrl:p,envName:m,testName:h,environmentVariables:g}=await ua({testId:s,orgId:l,logger:r,storage:d,authorization:o,settings:u}),f=a.getSession(c);if(!f){t.emit("error",{message:"No session to reset"});return}let{controller:S,context:y}=f;await S.browser.reset({newUrl:p});let E=S.browser.baseUrl;y.reset({baseUrl:E,currentUrl:S.browser.url(),variablesFromEnvironment:g,envName:m,testName:h});let T=S.browser.getViewport(),v=Yr.USER_AGENT;r.info({baseUrl:p,viewport:T},`Session reset for test ${s} at ${E}`),t.emit("session",{url:E,userAgent:v,viewport:T,sessionId:c})},uL={event:"reset",createHandler:d2};var p2=({metadata:t,globalE2eStateManager:e})=>{let{sessionId:r}=t;return async({url:n})=>{let o=e.getSession(r);if(!o)throw new Error("No active session found");await o.controller.browser.switchToPage({type:"SUBSTRING",substring:n})}},dL={event:"switchTab",createHandler:p2};async function pL(t){return QO(t)}var mL=[bx,ZO,tL,uL,cL,Sx,dL,eL,nL,sL,lL,aL,rL,oL,iL,Ex,yx];var hL=t=>{let{logger:e}=t,r=new m2(t.baseServer,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0});return r.on("connection",async n=>{let o;try{e.info({event:"connection",transport:n.conn.transport.name},"Websocket connection established"),o=await pL({...t,socket:n,logger:e}),e=e.child(o)}catch(i){e.error({event:"connection",type:"websocket",err:i},"Failed to setup connection"),n.emit("error",{message:i instanceof Error?i.message:`${i}`}),n.disconnect(!0);return}mL.forEach(i=>h2(i,{...t,socket:n,metadata:o,logger:e}))}),r},h2=(t,e)=>{let r=t.createHandler(e),n=(...o)=>{["mouseMoveEvent","keyDownEvent","keyUpEvent","mouseClickEvent","lintStep"].includes(t.event)||e.logger.debug({...e.metadata,event:t.event},`Websocket event (${t.event})`);let i=a=>{e.logger.error({event:t.event,type:"websocket",err:a instanceof Error?a:new Error(`${a}`)},"Unhandled exception in socket handler"),e.socket.emit("error",{message:a instanceof Error?a.message:`${a}`})};try{let a=r.apply(void 0,o);a&&typeof a.catch=="function"&&a.catch(i)}catch(a){i(a)}};e.socket.on(t.event,n)};import{Router as E2}from"express";import{Router as f2}from"express";import eu from"fs";import Zc from"path";import{v4 as S2}from"uuid";import y2 from"yaml";import{hostname as g2}from"os";var Qc="2.33.3",qe=as({app:"desktop-server",hostname:g2(),disableConsoleLogs:!0}).child({cliVersion:Qc});(async()=>{try{let t=await mo(qe);t.gitBranchName&&qe.addBinding("branch",t.gitBranchName)}catch{}})();var js=f2();async function vE(t){return(await gp(t,qe)).map(n=>{let o=t.modules[n.moduleId];if(!o){b.warn(`Found a dangling module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}js.get("/",Ce(async(t,e)=>{let r=pe(),n=await ee(r),o=await vE(n);e.status(200).json(o)}));js.post("/",Ce(async(t,e)=>{let r;try{r=WA.parse(t.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{Po(r.name)}catch(s){e.status(400).json({error:`Invalid module name: ${s}`});return}let n=pe(),o=(await ee(n)).modules;if(Object.values(o).find(s=>s.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let i=Zc.join(n.rootDir,r.folderPath??"");if(!eu.existsSync(i)||!eu.statSync(i).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${i}' does not exist.`});return}let a=await hp({...r,folder:i,project:n});e.status(201).json(a)}));js.get("/:moduleId",Ce(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r=await ee(pe()),n=r.modules[t.params.moduleId];if(!n){e.status(404).json({error:"Module not found."});return}try{let o=await fn(n,r,b);e.json(o)}catch(o){e.status(400).json({err:o})}}));js.post("/:moduleId/duplicate",Ce(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=$A.parse(t.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}try{Po(r.name)}catch(g){e.status(400).json({error:g.message});return}let n=pe(),o=await ee(n),i=o.modules[t.params.moduleId];if(!i){e.status(404).json({error:"Module not found."});return}if(Object.values(o.modules).find(g=>g.name===r.name)){e.status(400).send(`A module with the name "${r.name}" already exists. Please choose a different name.`);return}let a=await fn(i,o,b),s=Zc.join(n.rootDir,Zc.dirname(i.relativePath));if(!eu.existsSync(s)||!eu.statSync(s).isDirectory()){e.status(400).json({error:`The folder configured for module creation '${s}' does not exist.`});return}let c=He(r.name),l=Zc.join(s,`${c}.module.yaml`),u=S2(),{stepsToSave:d}=await st({stepLists:{steps:a.steps},createNewCacheIds:!0,cacheCreationParams:{orgId:xt()}}),p={fileType:ye.MODULE,schemaVersion:Me,moduleId:u,name:r.name,description:"",enabled:!0,steps:d.steps,parameters:a.parameters,defaultParameters:a.defaultParameters,parameterEnums:a.parameterEnums,defaultCacheKey:a.defaultCacheKey,defaultCacheTtl:a.defaultCacheTtl,defaultCacheAllInvocations:a.defaultCacheAllInvocations,autoAuth:a.autoAuth,advanced:a.advanced},m=y2.stringify(p);eu.writeFileSync(l,m,"utf-8");let h={relativeFilePath:Zc.relative(n.rootDir,l)};e.status(201).json(h)}));js.patch("/:moduleId/metadata",Ce(async(t,e)=>{if(!t.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let r;try{r=qA.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=pe(),o=await ee(n);$w({moduleId:t.params.moduleId,content:r,momenticFiles:o,logger:b,project:n}),e.status(201).json({message:"ok"})}));var gL=js;var fL=E2();fL.get("/",Ce(async(t,e)=>{let r=pe(),n=await ee(r),o=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>o.add(u))});let i=Array.from(o).sort(),a=Object.values(n.tests),s=await vE(n),c={labels:i,tests:a,modules:s};e.status(200).json(c)}));var SL=fL;import{Router as b2}from"express";var AE=b2();AE.get("/",Ce((t,e)=>{let r=fp(pe(),qe);e.status(200).json(r)}));AE.get("/names",Ce((t,e)=>{let n=pe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var yL=AE;import{Router as T2}from"express";var EL=T2();EL.get("/",Ce((t,e)=>{let r={userId:qo(),orgId:xt(),cliVersion:Qc??"0.0.0"};e.status(200).json(r)}));var bL=EL;import{StreamableHTTPServerTransport as qY}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as KY}from"@modelcontextprotocol/sdk/types.js";import{randomUUID as YY}from"crypto";import{Router as XY}from"express";import{McpServer as $Y}from"@modelcontextprotocol/sdk/server/mcp.js";import{SSEServerTransport as WY}from"@modelcontextprotocol/sdk/server/sse.js";import{streamObject as w2}from"ai";import Km from"dedent";import x2 from"path";import{z as ci}from"zod";import{tool as v2}from"ai";import{z as A2}from"zod";var TL=(t,e)=>({builder:n=>v2({description:t.schema.description,inputSchema:A2.object(t.schema.inputSchema),execute:async o=>{let i=e(n);n.logger.info({input:o},`Executing tool ${t.schema.name}`);try{await t.handle(n,o,i,void 0)}catch(s){i.addError(String(s))}let a=await i.serialize();return a.isError?n.logger.error({toolName:t.schema.name,input:o,err:a.content.map(s=>s.text).join(`
|
|
4384
4384
|
`)},"Tool execution resulted in error"):n.logger.info({toolName:t.schema.name,input:o},"Tool execution completed"),a}}),tool:t});var tu=class{results=[];isError;addResult(e){this.results.push(e)}addError(e){this.results.push(`Error: ${e}`),this.isError=!0}getResult(){return this.results.join(`
|
|
4385
4385
|
`)}async serialize(){let e=[];return this.results.length&&(e.push("### Result"),e.push(this.results.join(`
|
|
4386
4386
|
`)),e.push("")),{content:[{type:"text",text:e.join(`
|
|
@@ -4744,7 +4744,7 @@ ${RL}
|
|
|
4744
4744
|
${n}`}import{tool as V2}from"ai";import{z as $2}from"zod";import U2 from"path";function wL(t,e){return e?[{type:"text",text:`<${e}>`},...t,{type:"text",text:`</${e}>`}]:t}function oe({text:t,xmlTag:e}){return wL([{type:"text",text:t}],e)}function B2({imageDataUri:t,xmlTag:e}){return wL([{type:"media",data:t,mediaType:"image/jpeg"}],e)}function we(t){if(t.length===0)throw new at("No content parts provided to construct the tool response content.");return{type:"content",value:t}}async function qn(t,e){let r=t.getActivePage(),n=await t.getBrowserState({skipWait:!1}),o=["### Page state",`- Page URL: ${r.url()}`,`- Page Title: ${await r.title()}`,"- Page Snapshot:","```xml",n.serialize(),"```"].join(`
|
|
4745
4745
|
`);return e!==void 0&&Pe(o)>e?oe({text:["### Page state",`- Page URL: ${r.url()}`,`- Page Title: ${await r.title()}`,"- Page Snapshot:","<WARNING>","The page state was too long and we had to truncate the page state.","</WARNING>"].join(`
|
|
4746
4746
|
`),xmlTag:"PageState"}):oe({text:o,xmlTag:"PageState"})}async function z2(t){let r=(await t.screenshot({retries:2})).toString("base64");return B2({imageDataUri:r,xmlTag:"Screenshot"})}async function H2(t,e,r){let n=await ee(t),o=await mt(U2.join(t.rootDir,e),r,n);try{let a=new nt({baseUrl:dr(),apiKey:wr(),logger:r}),s=await $r(r,a,t),c=Wo({logger:r,orgId:xt(),client:a,gitMetadata:s,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}),{steps:l,beforeSteps:u,afterSteps:d}=await Kd({cacheStorage:c,logger:r,schemaVersion:o.schemaVersion,stepLists:{steps:o.steps,beforeSteps:o.beforeSteps,afterSteps:o.afterSteps},testId:o.id});o.beforeSteps=u,o.steps=l,o.afterSteps=d}catch(a){r.error({err:a},"Failed to resolve step cache entries for copilot test view")}let i=[];return i.push("### Test"),i.push(`Name: ${o.name}`),o.description&&i.push(`Description: ${o.description}`),i.push(""),o.beforeSteps&&o.beforeSteps.length>0&&(i.push(lp(o.beforeSteps,"Setup Steps")),i.push("")),i.push(lp(o.steps,"Main Steps")),o.afterSteps&&o.afterSteps.length>0&&(i.push(""),i.push(lp(o.afterSteps,"Teardown Steps"))),oe({text:i.join(`
|
|
4747
|
-
`),xmlTag:"TestContent"})}async function xL(t,e){let[r,n]=await Promise.all([qn(t,e),z2(t)]);return we([...r,...n])}async function wE(t,e,r){return we(await H2(t,e,r))}function G2(t,e=2e4){let r={};for(let[n,o]of Object.entries(t)){if(typeof o=="object"&&o!==null){let i=JSON.stringify(o,null,2);if(Pe(i)>e){r[n]="[too large truncated]";continue}r[n]=o;continue}r[n]=o}return r}function j2(t,e){let r={},n=0,o=Object.entries(t).map(([i,a])=>{let s=JSON.stringify(a,null,2),c=Pe(s);return{key:i,value:a,tokens:c}}).sort((i,a)=>i.tokens-a.tokens);for(let{key:i,value:a,tokens:s}of o)n+s<=e&&(r[i]=a,n+=s);return r}function pa(t,e){let r=e?.tokenLimit,n=e?.perItemLimit??2e4,o=t.toObjectCopy(),i=JSON.stringify(o,null,2);if(r===void 0)return oe({text:i,xmlTag:"EnvironmentVariables"});if(Pe(i)<=r)return oe({text:i,xmlTag:"EnvironmentVariables"});let s=G2(o,n),c=JSON.stringify(s,null,2);if(Pe(c)<=r)return oe({text:c,xmlTag:"EnvironmentVariables"});let u=j2(s,r);return oe({text:JSON.stringify(u,null,2),xmlTag:"EnvironmentVariables"})}async function _L(t,e){return we(pa(t,e))}var W2=1,ML=t=>({name:"get_browser_state",tool:V2({description:"Return the current browser state, including URL, title, and serialized accessibility snapshot.",inputSchema:$2.object({}),toModelOutput:r=>r,execute:async()=>{let r=t.controller.browser,n=t.conversationTokenTarget/W2;return xL(r,n)}})});import{tool as jL}from"ai";import iY from"fs";import rh from"path";import{z as qe}from"zod";var kE=Symbol.for("immer-nothing"),ru=Symbol.for("immer-draftable"),Ir=Symbol.for("immer-state");function er(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var ha=Object.getPrototypeOf;function ga(t){return!!t&&!!t[Ir]}function di(t){return t?NL(t)||Array.isArray(t)||!!t[ru]||!!t.constructor?.[ru]||su(t)||lu(t):!1}var q2=Object.prototype.constructor.toString();function NL(t){if(!t||typeof t!="object")return!1;let e=ha(t);if(e===null)return!0;let r=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;return r===Object?!0:typeof r=="function"&&Function.toString.call(r)===q2}function nu(t,e){fa(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function fa(t){let e=t[Ir];return e?e.type_:Array.isArray(t)?1:su(t)?2:lu(t)?3:0}function ou(t,e){return fa(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function xE(t,e){return fa(t)===2?t.get(e):t[e]}function DL(t,e,r){let n=fa(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function K2(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function su(t){return t instanceof Map}function lu(t){return t instanceof Set}function ma(t){return t.copy_||t.base_}function IE(t,e){if(su(t))return new Map(t);if(lu(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=NL(t);if(e===!0||e==="class_only"&&!r){let n=Object.getOwnPropertyDescriptors(t);delete n[Ir];let o=Reflect.ownKeys(n);for(let i=0;i<o.length;i++){let a=o[i],s=n[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(n[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:t[a]})}return Object.create(ha(t),n)}else{let n=ha(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function FE(t,e=!1){return th(t)||ga(t)||!di(t)||(fa(t)>1&&(t.set=t.add=t.clear=t.delete=Y2),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>FE(n,!0))),t}function Y2(){er(2)}function th(t){return Object.isFrozen(t)}var PE={};function Sa(t){let e=PE[t];return e||er(0,t),e}function X2(t,e){PE[t]||(PE[t]=e)}var iu;function kL(){return iu}function J2(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function IL(t,e){e&&(Sa("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function OE(t){LE(t),t.drafts_.forEach(Q2),t.drafts_=null}function LE(t){t===iu&&(iu=t.parent_)}function PL(t){return iu=J2(iu,t)}function Q2(t){let e=t[Ir];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function OL(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[Ir].modified_&&(OE(e),er(4)),di(t)&&(t=Zm(e,t),e.parent_||eh(e,t)),e.patches_&&Sa("Patches").generateReplacementPatches_(r[Ir].base_,t,e.patches_,e.inversePatches_)):t=Zm(e,r,[]),OE(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==kE?t:void 0}function Zm(t,e,r){if(th(e))return e;let n=e[Ir];if(!n)return nu(e,(o,i)=>LL(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return eh(t,n.base_,!0),n.base_;if(!n.finalized_){n.finalized_=!0,n.scope_.unfinalizedDrafts_--;let o=n.copy_,i=o,a=!1;n.type_===3&&(i=new Set(o),o.clear(),a=!0),nu(i,(s,c)=>LL(t,n,o,s,c,r,a)),eh(t,o,!1),r&&t.patches_&&Sa("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function LL(t,e,r,n,o,i,a){if(ga(o)){let s=i&&e&&e.type_!==3&&!ou(e.assigned_,n)?i.concat(n):void 0,c=Zm(t,o,s);if(DL(r,n,c),ga(c))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(di(o)&&!th(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;Zm(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&eh(t,o)}}function eh(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&FE(e,r)}function Z2(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:kL(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=UE;r&&(o=[n],i=au);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var UE={get(t,e){if(e===Ir)return t;let r=ma(t);if(!ou(r,e))return eY(t,r,e);let n=r[e];return t.finalized_||!di(n)?n:n===_E(t.base_,e)?(ME(t),t.copy_[e]=DE(n,t)):n},has(t,e){return e in ma(t)},ownKeys(t){return Reflect.ownKeys(ma(t))},set(t,e,r){let n=FL(ma(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=_E(ma(t),e),i=o?.[Ir];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(K2(r,o)&&(r!==void 0||ou(t.base_,e)))return!0;ME(t),NE(t)}return t.copy_[e]===r&&(r!==void 0||e in t.copy_)||Number.isNaN(r)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=r,t.assigned_[e]=!0),!0},deleteProperty(t,e){return _E(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,ME(t),NE(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=ma(t),n=Reflect.getOwnPropertyDescriptor(r,e);return n&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:n.enumerable,value:r[e]}},defineProperty(){er(11)},getPrototypeOf(t){return ha(t.base_)},setPrototypeOf(){er(12)}},au={};nu(UE,(t,e)=>{au[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});au.deleteProperty=function(t,e){return au.set.call(this,t,e,void 0)};au.set=function(t,e,r){return UE.set.call(this,t[0],e,r,t[0])};function _E(t,e){let r=t[Ir];return(r?ma(r):t)[e]}function eY(t,e,r){let n=FL(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function FL(t,e){if(!(e in t))return;let r=ha(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=ha(r)}}function NE(t){t.modified_||(t.modified_=!0,t.parent_&&NE(t.parent_))}function ME(t){t.copy_||(t.copy_=IE(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var tY=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(e,r,n)=>{if(typeof e=="function"&&typeof r!="function"){let i=r;r=e;let a=this;return function(c=i,...l){return a.produce(c,u=>r.call(this,u,...l))}}typeof r!="function"&&er(6),n!==void 0&&typeof n!="function"&&er(7);let o;if(di(e)){let i=PL(this),a=DE(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?OE(i):LE(i)}return IL(i,n),OL(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===kE&&(o=void 0),this.autoFreeze_&&FE(o,!0),n){let i=[],a=[];Sa("Patches").generateReplacementPatches_(e,o,i,a),n(i,a)}return o}else er(1,e)},this.produceWithPatches=(e,r)=>{if(typeof e=="function")return(a,...s)=>this.produceWithPatches(a,c=>e(c,...s));let n,o;return[this.produce(e,r,(a,s)=>{n=a,o=s}),n,o]},typeof t?.autoFreeze=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){di(t)||er(8),ga(t)&&(t=rY(t));let e=PL(this),r=DE(t,void 0);return r[Ir].isManual_=!0,LE(e),r}finishDraft(t,e){let r=t&&t[Ir];(!r||!r.isManual_)&&er(9);let{scope_:n}=r;return IL(n,e),OL(void 0,n)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}applyPatches(t,e){let r;for(r=e.length-1;r>=0;r--){let o=e[r];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}r>-1&&(e=e.slice(r+1));let n=Sa("Patches").applyPatches_;return ga(t)?n(t,e):this.produce(t,o=>n(o,e))}};function DE(t,e){let r=su(t)?Sa("MapSet").proxyMap_(t,e):lu(t)?Sa("MapSet").proxySet_(t,e):Z2(t,e);return(e?e.scope_:kL()).drafts_.push(r),r}function rY(t){return ga(t)||er(10,t),UL(t)}function UL(t){if(!di(t)||th(t))return t;let e=t[Ir],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=IE(t,e.scope_.immer_.useStrictShallowCopy_)}else r=IE(t,!0);return nu(r,(n,o)=>{DL(r,n,UL(o))}),e&&(e.finalized_=!1),r}function BL(){let e="replace",r="add",n="remove";function o(p,m,h,g){switch(p.type_){case 0:case 2:return a(p,m,h,g);case 1:return i(p,m,h,g);case 3:return s(p,m,h,g)}}function i(p,m,h,g){let{base_:f,assigned_:S}=p,y=p.copy_;y.length<f.length&&([f,y]=[y,f],[h,g]=[g,h]);for(let E=0;E<f.length;E++)if(S[E]&&y[E]!==f[E]){let T=m.concat([E]);h.push({op:e,path:T,value:d(y[E])}),g.push({op:e,path:T,value:d(f[E])})}for(let E=f.length;E<y.length;E++){let T=m.concat([E]);h.push({op:r,path:T,value:d(y[E])})}for(let E=y.length-1;f.length<=E;--E){let T=m.concat([E]);g.push({op:n,path:T})}}function a(p,m,h,g){let{base_:f,copy_:S}=p;nu(p.assigned_,(y,E)=>{let T=xE(f,y),v=xE(S,y),x=E?ou(f,y)?e:r:n;if(T===v&&x===e)return;let C=m.concat(y);h.push(x===n?{op:x,path:C}:{op:x,path:C,value:v}),g.push(x===r?{op:n,path:C}:x===n?{op:r,path:C,value:d(T)}:{op:e,path:C,value:d(T)})})}function s(p,m,h,g){let{base_:f,copy_:S}=p,y=0;f.forEach(E=>{if(!S.has(E)){let T=m.concat([y]);h.push({op:n,path:T,value:E}),g.unshift({op:r,path:T,value:E})}y++}),y=0,S.forEach(E=>{if(!f.has(E)){let T=m.concat([y]);h.push({op:r,path:T,value:E}),g.unshift({op:n,path:T,value:E})}y++})}function c(p,m,h,g){h.push({op:e,path:[],value:m===kE?void 0:m}),g.push({op:e,path:[],value:p})}function l(p,m){return m.forEach(h=>{let{path:g,op:f}=h,S=p;for(let v=0;v<g.length-1;v++){let x=fa(S),C=g[v];typeof C!="string"&&typeof C!="number"&&(C=""+C),(x===0||x===1)&&(C==="__proto__"||C==="constructor")&&er(19),typeof S=="function"&&C==="prototype"&&er(19),S=xE(S,C),typeof S!="object"&&er(18,g.join("/"))}let y=fa(S),E=u(h.value),T=g[g.length-1];switch(f){case e:switch(y){case 2:return S.set(T,E);case 3:er(16);default:return S[T]=E}case r:switch(y){case 1:return T==="-"?S.push(E):S.splice(T,0,E);case 2:return S.set(T,E);case 3:return S.add(E);default:return S[T]=E}case n:switch(y){case 1:return S.splice(T,1);case 2:return S.delete(T);case 3:return S.delete(h.value);default:return delete S[T]}default:er(17,f)}}),p}function u(p){if(!di(p))return p;if(Array.isArray(p))return p.map(u);if(su(p))return new Map(Array.from(p.entries()).map(([h,g])=>[h,u(g)]));if(lu(p))return new Set(Array.from(p).map(u));let m=Object.create(ha(p));for(let h in p)m[h]=u(p[h]);return ou(p,ru)&&(m[ru]=p[ru]),m}function d(p){return ga(p)?u(p):p}X2("Patches",{applyPatches_:l,generatePatches_:o,generateReplacementPatches_:c})}var Pr=new tY,i3e=Pr.produce,zL=Pr.produceWithPatches.bind(Pr),a3e=Pr.setAutoFreeze.bind(Pr),s3e=Pr.setUseStrictShallowCopy.bind(Pr),l3e=Pr.applyPatches.bind(Pr),c3e=Pr.createDraft.bind(Pr),u3e=Pr.finishDraft.bind(Pr);import{v4 as nY}from"uuid";BL();function $s({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=zL(r,n),c={id:nY(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return e?.emit("copilotPatch",c),t.info({description:o},"Emitting copilot patch"),{patch:c,newState:i}}import oY from"fs";import Ws from"path";function HL(t){let e=t.subDir?Ws.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${He(t.name)}.module.yaml`,n=Ws.join(e,r),o=Ws.relative(t.project.rootDir,n),i=oY.statSync(n);return{type:ye.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:Ws.sep,fullPathSegments:n.split(Ws.sep),relativePathSegments:o.split(Ws.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as BE}from"crypto";import{z as GL}from"zod";function cu(t){let e=t.config.ai?.aiAction??!1,r=e?"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use. The AI_ACTION_DYNAMIC is an AI action that will dynamically generate up to 15 steps to achieve a goal.":"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use.";return e?GL.discriminatedUnion("type",[cg,ug,ZT]).describe(r):GL.discriminatedUnion("type",[cg,ug]).describe(r)}async function qs(t,e,r){switch(t.type){case"PRESET_ACTION":{let n=ju(t.action),o=t.envKey&&lg.includes(n.type)?t.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:BE(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=t.module,{entity:i,momenticFiles:a}=await Wn(e,n,"module"),s=await fn(i,a,r);ev(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:BE(),inputs:l};return{...s,...u,type:"RESOLVED_MODULE"}}case"AI_ACTION_DYNAMIC":{if(!(e.config.ai?.aiAction??!1))throw new Error("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return{type:"AI_ACTION_DYNAMIC",text:t.text,id:BE()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(t)}}async function VL({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await st({stepLists:{steps:e}});xr({content:{...t,steps:o.steps},schemaVersion:Me,momenticFiles:r,project:n})}var $L=t=>({name:"module_create",tool:jL({description:"Create a module. If startIndex is provided, the steps will be extracted from the current test, a module will be created with those steps, and the test will be updated to reference the new module. If no startIndex is provided, an unreferenced module will be created. Automatically splices and repairs the test to reference the new module.",inputSchema:qe.object({name:qe.string(),description:qe.string(),enabled:qe.boolean().default(!0),parameters:qe.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:qe.record(qe.string(),qe.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:qe.record(qe.string(),qe.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:qe.record(qe.string(),qe.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant if startIndex is provided."),subDir:qe.string().optional().describe("sub directory to create the module in. If not provided, the module will be created in the project's root directory."),startIndex:qe.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:qe.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}),execute:async r=>{let{project:n,logger:o,testPath:i,socket:a,saveChangesToDisk:s}=t,c=r.startIndex??0,l=r.endIndex??c+1,u=await ee(n);if(Object.values(u.modules).find(f=>f.name===r.name))return we(oe({text:`Error: A module with the name "${r.name}" already exists. Please use a different name.`,xmlTag:"Error"}));if(r.parameters!==void 0){let f=r.defaultParameters?Object.keys(r.defaultParameters):[],S=r.parameterEnums?Object.keys(r.parameterEnums):[],y=new Set([...f,...S]);for(let E of y)if(!r.parameters.includes(E))return we(oe({text:`Error: Default parameter "${E}" is not defined in parameters array. Available parameters: ${r.parameters.join(", ")}`,xmlTag:"Error"}))}let p=[];if(r.startIndex!==void 0){if(!i)return we(oe({text:"Error: testPath is required when extracting steps from the current test.",xmlTag:"Error"}));let f=await mt(rh.join(n.rootDir,i),o,u);if(c<0||c>=f.steps.length)return we(oe({text:`Error: startIndex ${c} is out of bounds. Test has ${f.steps.length} steps.`,xmlTag:"Error"}));if(l<=c||l>f.steps.length)return we(oe({text:`Error: endIndex ${l} is out of bounds. Must be between ${c+1} and ${f.steps.length}.`,xmlTag:"Error"}));p=f.steps.slice(c,l);for(let S of p)if(S.type==="RESOLVED_MODULE")return we(oe({text:"Error: Modules cannot be nested. Please select steps that do not include module references.",xmlTag:"Error"}))}let m=r.subDir?rh.join(n.rootDir,r.subDir):n.rootDir;r.subDir&&iY.mkdirSync(m,{recursive:!0});let h=await hp({name:r.name,description:r.description??"",enabled:r.enabled??!0,steps:p,folder:m,project:n}),g=HL({project:n,name:r.name,moduleId:h.moduleId,subDir:r.subDir,description:h.description??void 0});if(u.modules[h.moduleId]=g,r.parameters!==void 0||r.defaultParameters!==void 0||r.parameterEnums!==void 0){let f={moduleId:h.moduleId,name:r.name,description:r.description??h.description,enabled:r.enabled??h.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums};await VL({moduleMetadata:f,steps:p,momenticFiles:u,project:n}),h={...h,name:r.name,description:r.description??h.description,enabled:r.enabled??h.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums}}if(r.startIndex!==void 0){let f=await mt(rh.join(n.rootDir,i),o,u),S={steps:f.steps??[],beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[]},y={type:"MODULE",module:{selector:{id:h.moduleId},inputs:r.moduleInputs??{}}},E;try{E=await qs(y,n,o)}catch(x){return we(oe({text:`Module "${r.name}" was created successfully, but could not be added to the test. ${String(x)}`,xmlTag:"Error"}))}let T=x=>{x.steps.splice(c,l-c,E)},{newState:v}=$s({logger:o,socket:a,baseState:S,recipe:T,description:`Create module "${r.name}" from steps ${c}-${l-1}`});if(s){let{stepsToSave:x,moduleUpdates:C}=await st({stepLists:v});C.forEach(_=>{xr({content:_,schemaVersion:Me,momenticFiles:u,project:n})}),br({relativeTestPath:i,steps:x,schemaVersion:Me,project:n})}}return we(oe({text:JSON.stringify(h,null,2),xmlTag:"ModuleResult"}))}})});function aY(t,e,r,n,o){if(t===void 0&&e!==void 0)throw new at("Validation Error: startIndex is required when endIndex is provided.");if(t!==void 0&&e===void 0&&r===0)throw new at("Validation Error: steps are required when startIndex is provided without an endIndex.");if(t!==void 0&&(t>n||t<0))throw new at(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&t===void 0)throw new at("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&t!==void 0&&e<t)throw new at("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new at(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let i=t??n;if((e??i)===i&&r===0&&!o)throw new at("Validation Error: Nothing to change. Provide steps, a valid delete range, or metadata updates.")}var WL=t=>{let e=cu(t.project);return{name:"module_update",tool:jL({description:"Edit a module's steps and/or metadata. Provide startIndex (and optional endIndex) to replace or remove that range; omit endIndex to insert at startIndex; omit both indices to append new steps. Use an empty steps array with both indices to delete the range. Optionally update metadata like parameters. Omit both indices and steps to only update metadata.",inputSchema:qe.object({selector:Oo,steps:e.array(),startIndex:qe.number().optional(),endIndex:qe.number().optional(),description:qe.string().optional().describe("New description for the module."),enabled:qe.boolean().optional().describe("New enabled state for the module."),parameters:qe.string().array().optional().describe("New array of parameter names, e.g., ['apiKey', 'userId']. Replaces all existing parameters, resets default parameters and parameter enums if set."),defaultParameters:qe.record(qe.string(),qe.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:qe.record(qe.string(),qe.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}),execute:async n=>{let{project:o,logger:i,socket:a,testPath:s,saveChangesToDisk:c}=t,l=await Promise.all(n.steps.map(E=>qs(E,o,i))),{entity:u,momenticFiles:d}=await Wn(o,n.selector,"module"),p=await fn(u,d,i),m=l.find(E=>!ng(E));if(m)return we(oe({text:`Error: step type ${m.type} cannot be added to a module.`,xmlTag:"Error"}));let h=n.description!==void 0||n.enabled!==void 0||n.parameters!==void 0||n.defaultParameters!==void 0||n.parameterEnums!==void 0;try{aY(n.startIndex,n.endIndex,n.steps.length,p.steps.length,h)}catch(E){return we(oe({text:String(E),xmlTag:"Error"}))}let g=p.steps;if(n.steps.length>0||n.startIndex!==void 0||n.endIndex!==void 0){g=[...p.steps];let E=n.startIndex!==void 0?n.startIndex:g.length,T=n.endIndex!==void 0?n.endIndex:E;g.splice(E,T-E,...l)}let f={moduleId:p.moduleId,name:p.name,description:n.description??p.description,enabled:n.enabled??p.enabled,parameters:n.parameters??p.parameters,defaultParameters:n.defaultParameters??p.defaultParameters,parameterEnums:n.parameterEnums??p.parameterEnums};n.parameters!==void 0&&(f.defaultParameters=n.defaultParameters??{},f.parameterEnums=n.parameterEnums??{});let S=null;if(s){let E=await mt(rh.join(o.rootDir,s),i,d);S={steps:E.steps??[],beforeSteps:E.beforeSteps??[],afterSteps:E.afterSteps??[]}}c&&await VL({moduleMetadata:f,steps:g,momenticFiles:d,project:o}),s&&S&&$s({logger:i,socket:a,baseState:S,recipe:T=>{let v=x=>{for(let C of x)C.type==="RESOLVED_MODULE"&&C.moduleId===p.moduleId&&(C.steps=g)};v(T.steps),v(T.beforeSteps),v(T.afterSteps)},description:`Update module "${p.name}"`});let y={...f,stepCount:g.length};return we(oe({text:JSON.stringify(y,null,2),xmlTag:"ModuleResult"}))}})}};import{tool as oh}from"ai";import{randomUUID as nh}from"crypto";import{z as pi}from"zod";var sY=t=>({name:"preview_preflight",tool:oh({description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:pi.object({description:pi.string().describe("Description of the element to preview.")}),toModelOutput:r=>r,execute:async({description:r})=>{let{controller:n,logger:o,testContext:i}=t;try{let a=await n.locateElement({description:r,disableCache:!0,skipWait:!0,logger:o,testContext:i});a.resolution.locator&&await Promise.all([n.browser.scrollIntoViewIfNeeded(a.resolution.locator),n.browser.highlight(a.resolution.locator)]);let s=[...oe({text:`Found element matching description: ${a.target.id}`,xmlTag:"Result"})];return a.target.nodeOnlySerializedHtml&&s.push(...oe({text:`HTML: ${a.target.nodeOnlySerializedHtml}`})),s.push(...await qn(n.browser)),we(s)}catch(a){let s=[...oe({text:`Failed to find any element matching description: ${a}`,xmlTag:"Error"}),...await qn(n.browser)];return we(s)}}})}),lY=t=>({name:"preview_ensure",tool:oh({description:"Confirm page state.",inputSchema:pi.object({assertion:pi.string().describe("Assertion to confirm page state.")}),toModelOutput:r=>r,execute:async({assertion:r})=>{let{logger:n,storage:o,controller:i,codeEvalTools:a,socket:s,orgId:c,testContext:l}=t,u={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:r,id:nh()},id:nh()},d=await Wm({step:u,controller:i,storage:o,codeEvalTools:a,logger:n,socket:s,orgId:c,testContext:l}),p=[];return d?d.status==="SUCCESS"?p.push(...oe({text:`Assertion is true: ${d.message}`,xmlTag:"SuccessfulResult"})):p.push(...oe({text:`Assertion is false: ${d.message}`,xmlTag:"Error"})):p.push(...oe({text:"Assertion executed with unknown result.",xmlTag:"Error"})),p.push(...await qn(i.browser)),we(p)}})}),cY=t=>({name:"preview_step",tool:oh({description:"Execute a step without adding it to the test.",inputSchema:pi.object({command:Fa}),toModelOutput:r=>r,execute:async({command:r})=>{let{logger:n,storage:o,controller:i,codeEvalTools:a,socket:s,orgId:c,testContext:l}=t,u=ju(r),d={type:"PRESET_ACTION",command:u,id:nh()},p=await Wm({step:d,controller:i,storage:o,codeEvalTools:a,logger:n,socket:s,orgId:c,testContext:l}),m=[];return p?p.status==="SUCCESS"?m.push(...oe({text:`Step Execution successful: ${p.message}`,xmlTag:"SuccessfulResult"})):m.push(...oe({text:`Step Execution failed: ${p.message}`,xmlTag:"Error"})):m.push(...oe({text:"Step Execution errored for an unknown reason.",xmlTag:"Error"})),m.push(...await qn(i.browser)),m.push(...pa(l)),we(m)}})}),uY=t=>{let{project:e}=t;return e.config.ai?.aiAction??!1?{name:"preview_ai_action",tool:oh({description:"Execute an AI action without adding it to the test. This will dynamically generate and run steps to achieve the goal. Note this tool will update and move your test state forward, so if it fails you must rerun the test up to this step before trying again.",inputSchema:pi.object({text:pi.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:pi.number().optional()}),toModelOutput:o=>o,execute:async({text:o,retries:i})=>{let{logger:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=t,m={type:"AI_ACTION_DYNAMIC",text:o,id:nh(),retries:i},h=await Wm({step:m,controller:c,storage:s,codeEvalTools:l,logger:a,socket:u,orgId:d,testContext:p}),g=[];return h?h.status==="SUCCESS"?g.push(...oe({text:`AI action completed successfully: ${h.message??"Goal achieved"}`,xmlTag:"SuccessfulResult"})):g.push(...oe({text:`AI action failed: ${h.message??"Unknown error while previewing AI action"}`,xmlTag:"Error"})):g.push(...oe({text:"AI action executed with unknown result.",xmlTag:"Error"})),g.push(...await qn(c.browser)),g.push(...pa(p)),we(g)}})}:void 0},qL=[sY,lY,cY,uY];import{tool as GE}from"ai";import ZL from"path";import{z as uu}from"zod";import{tool as zE}from"ai";import KL from"path";import{z as mi}from"zod";var HE=t=>{throw new Error(`Unknown test section: ${t}`)},ih=mi.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)");function YL(t,e){switch(e){case"setup":return t.beforeSteps;case"teardown":return t.afterSteps;case"main":return t.steps;default:return HE(e)}}var XL=t=>{let e=cu(t.project);return{name:"test_insert_step",tool:zE({description:"Insert a step or module into the test.",inputSchema:mi.object({index:mi.number(),step:e,targetSection:ih.default("main")}),execute:async n=>{let{project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c}=t,l=await ee(o),u=await mt(KL.join(o.rootDir,a),i,l),d={steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]},p=YL(d,n.targetSection);if(n.index<0||n.index>p.length)return we(oe({text:`Error: Invalid index ${n.index} for inserting into ${n.targetSection} section with ${p.length} steps (must be 0-${p.length})`,xmlTag:"Error"}));let m=await qs(n.step,o,i),h=f=>{switch(n.targetSection){case"setup":f.beforeSteps.splice(n.index,0,m);break;case"teardown":f.afterSteps.splice(n.index,0,m);break;case"main":f.steps.splice(n.index,0,m);break;default:HE(n.targetSection)}},{newState:g}=$s({logger:i,socket:s,baseState:d,recipe:h,description:`Insert ${m.type} step at index ${n.index} in ${n.targetSection}`});if(c){let{stepsToSave:f,moduleUpdates:S}=await st({stepLists:g});S.forEach(y=>{xr({content:y,schemaVersion:Me,momenticFiles:l,project:o})}),br({relativeTestPath:a,steps:f,schemaVersion:Me,project:o})}return we(oe({text:`Successfully inserted step at index ${n.index} in the ${n.targetSection} section.`,xmlTag:"Result"}))}})}},JL=t=>{let e=cu(t.project);return{name:"test_splice_steps",tool:zE({description:"Splice steps in the test. This is the primary tool for replacing, removing, or bulk inserting steps. Never use this as a means to bypass a failure. Examples: Replace step at index 5: splice(startIndex=5, deleteCount=1, steps=[newStep]). Delete step at index 5: splice(startIndex=5, deleteCount=1, steps=[]). Insert multiple steps at index 5: splice(startIndex=5, deleteCount=0, steps=[step1, step2]).",inputSchema:mi.object({startIndex:mi.number(),deleteCount:mi.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:e.array(),targetSection:ih.default("main"),returnTest:mi.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}),execute:async n=>{let{project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c}=t,l=await ee(o),u=await mt(KL.join(o.rootDir,a),i,l),d={steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]},p=YL(d,n.targetSection);if(n.startIndex<0||n.startIndex>p.length)return we(oe({text:`Error: Invalid startIndex ${n.startIndex} for splicing ${n.targetSection} section with ${p.length} steps (must be 0-${p.length})`,xmlTag:"Error"}));let m=await Promise.all(n.steps.map(E=>qs(E,o,i))),h=E=>{switch(n.targetSection){case"setup":E.beforeSteps.splice(n.startIndex,n.deleteCount,...m);break;case"teardown":E.afterSteps.splice(n.startIndex,n.deleteCount,...m);break;case"main":E.steps.splice(n.startIndex,n.deleteCount,...m);break;default:HE(n.targetSection)}},g=n.steps.length,f=n.deleteCount,{newState:S}=$s({logger:i,socket:s,baseState:d,recipe:h,description:`Splice ${g} step(s) at index ${n.startIndex} in ${n.targetSection}, removing ${f}`});if(c){let{stepsToSave:E,moduleUpdates:T}=await st({stepLists:S});T.forEach(v=>{xr({content:v,schemaVersion:Me,momenticFiles:l,project:o})}),br({relativeTestPath:a,steps:E,schemaVersion:Me,project:o})}let y=[...oe({text:`Successfully spliced ${g} step(s) at index ${n.startIndex} in the ${n.targetSection} section, removing ${f} step(s).`,xmlTag:"Result"})];return n.returnTest&&y.push(...oe({text:JSON.stringify(await wE(o,a,i),null,2),xmlTag:"TestContent"})),we(y)}})}},QL=t=>({name:"test_get",tool:zE({description:"Retrieve the full test contents, including simplified cache data on some steps enabling you to inspect resolved locators and debug targeting issues. For context, the caches are just simplified targeting information",inputSchema:mi.object({}),execute:async()=>wE(t.project,t.testPath,t.logger)})});var eN=3,tN=t=>({name:"get_environment_variables",tool:GE({description:"Get the current environment variables.",inputSchema:uu.object({}),toModelOutput:r=>r,execute:async()=>{let r=t.conversationTokenTarget/eN;return _L(t.testContext,{tokenLimit:r})}})}),rN=t=>({name:"reset_session",tool:GE({description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:uu.object({}),toModelOutput:r=>r,execute:async()=>{let{project:r,logger:n,testPath:o,orgId:i,codeEvalTools:a}=t,s=await ee(r),c=await mt(ZL.join(r.rootDir,o),n,s),l=c.baseUrl,u,d={};if(!l&&c.envs){let m=c.envs.find(h=>h.default);if(m)try{let h=Ki(m.name,r,n);u=h.name,d=h.variables;let g=h.variables[At];typeof g=="string"&&(l=g)}catch(h){n.warn({err:h,envName:m.name},"Failed to resolve environment for reset")}}l||(l="about:blank"),d=await Gm({orgId:i,testName:c.name,envName:u,baseEnvVariables:d,parameters:c.parameters,logger:n,localTools:a}),await t.controller.browser.reset({newUrl:l}),t.testContext.reset({baseUrl:l,testName:c.name,currentUrl:t.controller.browser.url(),variablesFromEnvironment:d,envName:u});let p=[...oe({text:`Session reset to ${l}.`,xmlTag:"Result"}),...await qn(t.controller.browser),...pa(t.testContext)];return we(p)}})}),nN=t=>({name:"run_step",tool:GE({description:"Run the step in the test at the given startIndex. If there is no endIndex, the step at the startIndex will be executed. EndIndex is the last step that is run (end index is inclusive).",inputSchema:uu.object({fromIndex:uu.number(),toIndex:uu.number().optional(),targetSection:ih.default("main")}),toModelOutput:r=>r,execute:async({fromIndex:r,toIndex:n,targetSection:o})=>{let{project:i,logger:a,testPath:s,storage:c,controller:l,codeEvalTools:u,socket:d,orgId:p,testContext:m,conversationTokenTarget:h}=t,g=r,f=n??g,S=await ee(i),y=await mt(ZL.join(i.rootDir,s),a,S),E;switch(o){case"setup":E=y.beforeSteps??[];break;case"teardown":E=y.afterSteps??[];break;case"main":E=y.steps;break;default:return(q=>{throw new Error(`Unknown test section: ${q}`)})(o)}if(g<0||g>=E.length)return we(oe({text:`Error: startIndex is out of bounds for ${o} section with ${E.length} steps.`,xmlTag:"Error"}));if(f<g)return we(oe({text:"Error: toIndex must be greater than or equal to fromIndex.",xmlTag:"Error"}));if(f>=E.length)return we(oe({text:`Error: toIndex is out of bounds for ${o} section with ${E.length} steps.`,xmlTag:"Error"}));let T=E.slice(g,f+1);if(T.length===0)return we(oe({text:"Error: No steps were executed.",xmlTag:"Error"}));l.setOpen();let{results:v}=await RE({steps:T,controller:l,storage:c,codeEvalTools:u,logger:a,socket:d,orgId:p,testContext:m});if(!v||v.length===0)return we(oe({text:"Error: No steps were executed.",xmlTag:"Error"}));let x=v.at(-1);if(!x)return we(oe({text:"Error: No steps were executed.",xmlTag:"Error"}));if(x.status!=="SUCCESS"){let k=g+v.length-1;return we(oe({text:`Error: Step at index ${k} failed: ${x.message}`,xmlTag:"Error"}))}let C=o==="main"?"":` in ${o}`,_=g===f?`Step at index ${f}${C}`:`Steps ${g}-${f}${C}`,L=[];if(x.status==="SUCCESS"){let k=`${_} executed successfully. Last step result: ${x.message}`;L.push(...oe({text:k,xmlTag:"Result"})),x.data&&L.push(...oe({text:`Data: ${JSON.stringify(x.data,null,2)}`,xmlTag:"ResultData"}))}let B=h/eN,[G,N]=await Promise.all([qn(l.browser,B),pa(m,{tokenLimit:B})]);return we([...L,...G,...N])}})});var oN=[ML,tN,nN,QL,rN,XL,JL,$L,WL,...qL];var hY=1e5,iN=8e4,jE=2,aN="[trimmed: omitted due to context budget]",VE=50,gY=1600;function fY(t,e){return typeof t=="object"&&t!==null&&t.type===e}function SY(t,e,r){let n=0,o=[];for(let i of t){let a=i.content;if(!Array.isArray(a)){o.push(i);continue}let s=[];for(let c of a){if(n>=e){s.push(c);continue}if(!fY(c,r)){s.push(c);continue}if(r==="image"){n>=e?s.push(c):n+=gY;continue}let l=r==="tool-result"?"output":"input",u=r==="tool-result"?c.output:c.input;if(u===void 0||u===aN){s.push(c);continue}let d=Pe(u);n+=d,s.push({...c,[l]:aN})}s.length!==0&&o.push({...i,content:s})}return{messages:o,trimmedTokens:n}}function yY(t){let e=t[0];return e?"parts"in e&&Array.isArray(e.parts):!1}function EY(t){return pY({messages:t,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:["momentic_module_get","momentic_module_recommend","get_environment_variables"]},{type:"before-last-5-messages",tools:["run_step","preview_ai_action"]},{type:"before-last-3-messages",tools:["test_get","reset_session","test_insert_step","test_splice_steps","preview_ensure","momentic_module_create"]},{type:"before-last-2-messages",tools:["observe_page","momentic_module_list","momentic_module_change"]},{type:"before-last-1-messages",tools:["preview_preflight","preview_step"]}],emptyMessages:"remove"})}var bY=["tool-result","image","tool-call"],TY=.3;function du(t,e,r){let n=[...t];for(let o of bY){let i=Pe(n);if(i<=e)break;let a=i-e,s=SY(n,a,o);n=s.messages,s.trimmedTokens>0&&r.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:Pe(n)},"Trimmed content")}return n}function vY(t,e,r){let n=Pe(t);if(n<=e||t.length<=1)return t;let o=t[0],i=[],a=[];if(t.length>jE+1?(i=t.slice(1,t.length-jE),a=t.slice(t.length-jE)):a=t.slice(1),i.length>0){i=du(i,e,r);let u=[o,...i,...a];if(n=Pe(u),n<=e)return u}let s=Pe(i),c=s/e;if(c<TY){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=du(d,e,r),m=[o,...p,u];if(n=Pe(m),n<=e)return m;let h=du([...p,u],e,r),g=[o,...h];if(n=Pe(g),n<=e)return g}else if(a.length===1){let u=[...i,...a],d=du(u,e,r),p=[o,...d];if(n=Pe(p),n<=e)return p}}else for(r.debug({headBudgetRatio:c,middleMsgTokens:s,targetTokens:e},"Middle exceeds 30% budget, removing messages");i.length>0;){i.shift();let u=[o,...i,...a];if(n=Pe(u),n<=e)return u}a=du(a,e,r);let l=[o,...i,...a];if(n=Pe(l),n<=e)return l;for(;a.length>0;)if(a.shift(),l=[o,...i,...a],n=Pe(l),n<=e)return l;return n>e&&r.warn({targetTokens:e,finalTokenCount:n,remainingMessages:l.length},"Unable to meet token target after all pruning phases"),l}function AY(t,e,r,n){let o=EY(t),i=Pe(o);return i>e&&(n.debug({projected:i,threshold:e,target:r},"Context exceeds threshold, pruning messages"),o=vY(o,r,n)),o}function ah(t){let{testPath:e,messages:r,logger:n,session:o,sessionId:i,hooks:a={},saveChangesToDisk:s=!1}=t,{onStepFinish:c,onPrepareStep:l,onChunk:u,onError:d,onFinish:p}=a,m=wr(),h=xt(),g=dr(),f=pe(),S=new nt({apiKey:m,baseUrl:g,logger:n}),y=new ui(S,h),E=new Nn({httpClient:new zt({baseUrl:S.baseUrl,apiKey:S.apiKey,logger:n,mode:"interactive"}),fakerSeed:f.config.advanced?.fakerConstantSeed?rs:void 0}),T={project:f,apiKey:m,orgId:h,baseUrl:g,sessionId:i,logger:n,storage:y,codeEvalTools:E,saveChangesToDisk:s,testPath:e,testContext:o.context,controller:o.controller,socket:o.socket,conversationTokenTarget:iN},v=Ym.reduce((N,{name:k,builder:q})=>(N[k]=q(T),N),{}),x={};for(let N of oN){let k=N(T);k&&(x[k.name]=k.tool)}let C={...v,...x},_=$m(i),L=async N=>{let{messages:k}=N;l&&await l(k);let q=AY(k,hY,iN,n),$=Pe(k);return $>tR&&n.debug({originalCount:k.length,prunedCount:q.length,originalTokens:$,prunedTokens:Pe(q)},"Prepared messages for copilot step"),{...N,messages:q}},B={model:_("claude-sonnet-4-5-20250929"),stopWhen:mY(VE),maxRetries:4,system:CL(f),tools:C,prepareStep:L,onStepFinish:c,onChunk:u,onError:d,onFinish:async({finishReason:N,usage:k,text:q,response:$})=>{n.info({finishReason:N,usage:k,sessionId:i},"Full copilot turn finished"),p&&await p({finishReason:N,usage:k,text:q,response:$})}},G=yY(r)?dY(r,{tools:B.tools}):r;return{...B,messages:G}}var g8e=new Error("timeout while waiting for mutex to become available"),f8e=new Error("mutex already locked"),RY=new Error("request for lock canceled"),CY=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},$E=class{constructor(e,r=RY){this._value=e,this._cancelError=r,this._queue=[],this._weightedWaiters=[]}acquire(e=1,r=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((n,o)=>{let i={resolve:n,reject:o,weight:e,priority:r},a=sN(this._queue,s=>r<=s.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return CY(this,arguments,void 0,function*(r,n=1,o=0){let[i,a]=yield this.acquire(n,o);try{return yield r(i)}finally{a()}})}waitForUnlock(e=1,r=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,r)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),wY(this._weightedWaiters[e-1],{resolve:n,priority:r})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let r=this._value;this._value-=e.weight,e.resolve([r,this._newReleaser(e.weight)])}_newReleaser(e){let r=!1;return()=>{r||(r=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let r=this._weightedWaiters[e-1];r&&(r.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let r=this._value;r>0;r--){let n=this._weightedWaiters[r-1];if(!n)continue;let o=n.findIndex(i=>i.priority<=e);(o===-1?n:n.splice(0,o)).forEach(i=>i.resolve())}}}_couldLockImmediately(e,r){return(this._queue.length===0||this._queue[0].priority<r)&&e<=this._value}};function wY(t,e){let r=sN(t,n=>e.priority<=n.priority);t.splice(r+1,0,e)}function sN(t,e){for(let r=t.length-1;r>=0;r--)if(e(t[r]))return r;return-1}var xY=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},sh=class{constructor(e){this._semaphore=new $E(1,e)}acquire(){return xY(this,arguments,void 0,function*(e=0){let[,r]=yield this._semaphore.acquire(1,e);return r})}runExclusive(e,r=0){return this._semaphore.runExclusive(()=>e(),1,r)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}};var WE=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,r){r.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new sh);let o=await this.mutexes.get(e).acquire();try{let i=this.activeControllers.get(e);i&&!i.signal.aborted&&i.abort(new Error("Superseded by newer momentic_test_edit invocation. Stop executing edit_test requests to this test and ask the user what to do next."));let a=new AbortController;return this.activeControllers.set(e,a),{signal:AbortSignal.any([r,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},lN=new WE;import Ks from"dedent";function _Y(){let t=Object.entries(Xh).map(([e,r])=>`- **${e}**: ${r}`).join(`
|
|
4747
|
+
`),xmlTag:"TestContent"})}async function xL(t,e){let[r,n]=await Promise.all([qn(t,e),z2(t)]);return we([...r,...n])}async function wE(t,e,r){return we(await H2(t,e,r))}function G2(t,e=2e4){let r={};for(let[n,o]of Object.entries(t)){if(typeof o=="object"&&o!==null){let i=JSON.stringify(o,null,2);if(Pe(i)>e){r[n]="[too large truncated]";continue}r[n]=o;continue}r[n]=o}return r}function j2(t,e){let r={},n=0,o=Object.entries(t).map(([i,a])=>{let s=JSON.stringify(a,null,2),c=Pe(s);return{key:i,value:a,tokens:c}}).sort((i,a)=>i.tokens-a.tokens);for(let{key:i,value:a,tokens:s}of o)n+s<=e&&(r[i]=a,n+=s);return r}function pa(t,e){let r=e?.tokenLimit,n=e?.perItemLimit??2e4,o=t.toObjectCopy(),i=JSON.stringify(o,null,2);if(r===void 0)return oe({text:i,xmlTag:"EnvironmentVariables"});if(Pe(i)<=r)return oe({text:i,xmlTag:"EnvironmentVariables"});let s=G2(o,n),c=JSON.stringify(s,null,2);if(Pe(c)<=r)return oe({text:c,xmlTag:"EnvironmentVariables"});let u=j2(s,r);return oe({text:JSON.stringify(u,null,2),xmlTag:"EnvironmentVariables"})}async function _L(t,e){return we(pa(t,e))}var W2=1,ML=t=>({name:"get_browser_state",tool:V2({description:"Return the current browser state, including URL, title, and serialized accessibility snapshot.",inputSchema:$2.object({}),toModelOutput:r=>r,execute:async()=>{let r=t.controller.browser,n=t.conversationTokenTarget/W2;return xL(r,n)}})});import{tool as jL}from"ai";import iY from"fs";import rh from"path";import{z as Ke}from"zod";var kE=Symbol.for("immer-nothing"),ru=Symbol.for("immer-draftable"),Ir=Symbol.for("immer-state");function er(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var ha=Object.getPrototypeOf;function ga(t){return!!t&&!!t[Ir]}function di(t){return t?NL(t)||Array.isArray(t)||!!t[ru]||!!t.constructor?.[ru]||su(t)||lu(t):!1}var q2=Object.prototype.constructor.toString();function NL(t){if(!t||typeof t!="object")return!1;let e=ha(t);if(e===null)return!0;let r=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;return r===Object?!0:typeof r=="function"&&Function.toString.call(r)===q2}function nu(t,e){fa(t)===0?Reflect.ownKeys(t).forEach(r=>{e(r,t[r],t)}):t.forEach((r,n)=>e(n,r,t))}function fa(t){let e=t[Ir];return e?e.type_:Array.isArray(t)?1:su(t)?2:lu(t)?3:0}function ou(t,e){return fa(t)===2?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function xE(t,e){return fa(t)===2?t.get(e):t[e]}function DL(t,e,r){let n=fa(t);n===2?t.set(e,r):n===3?t.add(r):t[e]=r}function K2(t,e){return t===e?t!==0||1/t===1/e:t!==t&&e!==e}function su(t){return t instanceof Map}function lu(t){return t instanceof Set}function ma(t){return t.copy_||t.base_}function IE(t,e){if(su(t))return new Map(t);if(lu(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);let r=NL(t);if(e===!0||e==="class_only"&&!r){let n=Object.getOwnPropertyDescriptors(t);delete n[Ir];let o=Reflect.ownKeys(n);for(let i=0;i<o.length;i++){let a=o[i],s=n[a];s.writable===!1&&(s.writable=!0,s.configurable=!0),(s.get||s.set)&&(n[a]={configurable:!0,writable:!0,enumerable:s.enumerable,value:t[a]})}return Object.create(ha(t),n)}else{let n=ha(t);if(n!==null&&r)return{...t};let o=Object.create(n);return Object.assign(o,t)}}function FE(t,e=!1){return th(t)||ga(t)||!di(t)||(fa(t)>1&&(t.set=t.add=t.clear=t.delete=Y2),Object.freeze(t),e&&Object.entries(t).forEach(([r,n])=>FE(n,!0))),t}function Y2(){er(2)}function th(t){return Object.isFrozen(t)}var PE={};function Sa(t){let e=PE[t];return e||er(0,t),e}function X2(t,e){PE[t]||(PE[t]=e)}var iu;function kL(){return iu}function J2(t,e){return{drafts_:[],parent_:t,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function IL(t,e){e&&(Sa("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function OE(t){LE(t),t.drafts_.forEach(Q2),t.drafts_=null}function LE(t){t===iu&&(iu=t.parent_)}function PL(t){return iu=J2(iu,t)}function Q2(t){let e=t[Ir];e.type_===0||e.type_===1?e.revoke_():e.revoked_=!0}function OL(t,e){e.unfinalizedDrafts_=e.drafts_.length;let r=e.drafts_[0];return t!==void 0&&t!==r?(r[Ir].modified_&&(OE(e),er(4)),di(t)&&(t=Zm(e,t),e.parent_||eh(e,t)),e.patches_&&Sa("Patches").generateReplacementPatches_(r[Ir].base_,t,e.patches_,e.inversePatches_)):t=Zm(e,r,[]),OE(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==kE?t:void 0}function Zm(t,e,r){if(th(e))return e;let n=e[Ir];if(!n)return nu(e,(o,i)=>LL(t,n,e,o,i,r)),e;if(n.scope_!==t)return e;if(!n.modified_)return eh(t,n.base_,!0),n.base_;if(!n.finalized_){n.finalized_=!0,n.scope_.unfinalizedDrafts_--;let o=n.copy_,i=o,a=!1;n.type_===3&&(i=new Set(o),o.clear(),a=!0),nu(i,(s,c)=>LL(t,n,o,s,c,r,a)),eh(t,o,!1),r&&t.patches_&&Sa("Patches").generatePatches_(n,r,t.patches_,t.inversePatches_)}return n.copy_}function LL(t,e,r,n,o,i,a){if(ga(o)){let s=i&&e&&e.type_!==3&&!ou(e.assigned_,n)?i.concat(n):void 0,c=Zm(t,o,s);if(DL(r,n,c),ga(c))t.canAutoFreeze_=!1;else return}else a&&r.add(o);if(di(o)&&!th(o)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;Zm(t,o),(!e||!e.scope_.parent_)&&typeof n!="symbol"&&Object.prototype.propertyIsEnumerable.call(r,n)&&eh(t,o)}}function eh(t,e,r=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&FE(e,r)}function Z2(t,e){let r=Array.isArray(t),n={type_:r?1:0,scope_:e?e.scope_:kL(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=n,i=UE;r&&(o=[n],i=au);let{revoke:a,proxy:s}=Proxy.revocable(o,i);return n.draft_=s,n.revoke_=a,s}var UE={get(t,e){if(e===Ir)return t;let r=ma(t);if(!ou(r,e))return eY(t,r,e);let n=r[e];return t.finalized_||!di(n)?n:n===_E(t.base_,e)?(ME(t),t.copy_[e]=DE(n,t)):n},has(t,e){return e in ma(t)},ownKeys(t){return Reflect.ownKeys(ma(t))},set(t,e,r){let n=FL(ma(t),e);if(n?.set)return n.set.call(t.draft_,r),!0;if(!t.modified_){let o=_E(ma(t),e),i=o?.[Ir];if(i&&i.base_===r)return t.copy_[e]=r,t.assigned_[e]=!1,!0;if(K2(r,o)&&(r!==void 0||ou(t.base_,e)))return!0;ME(t),NE(t)}return t.copy_[e]===r&&(r!==void 0||e in t.copy_)||Number.isNaN(r)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=r,t.assigned_[e]=!0),!0},deleteProperty(t,e){return _E(t.base_,e)!==void 0||e in t.base_?(t.assigned_[e]=!1,ME(t),NE(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0},getOwnPropertyDescriptor(t,e){let r=ma(t),n=Reflect.getOwnPropertyDescriptor(r,e);return n&&{writable:!0,configurable:t.type_!==1||e!=="length",enumerable:n.enumerable,value:r[e]}},defineProperty(){er(11)},getPrototypeOf(t){return ha(t.base_)},setPrototypeOf(){er(12)}},au={};nu(UE,(t,e)=>{au[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}});au.deleteProperty=function(t,e){return au.set.call(this,t,e,void 0)};au.set=function(t,e,r){return UE.set.call(this,t[0],e,r,t[0])};function _E(t,e){let r=t[Ir];return(r?ma(r):t)[e]}function eY(t,e,r){let n=FL(e,r);return n?"value"in n?n.value:n.get?.call(t.draft_):void 0}function FL(t,e){if(!(e in t))return;let r=ha(t);for(;r;){let n=Object.getOwnPropertyDescriptor(r,e);if(n)return n;r=ha(r)}}function NE(t){t.modified_||(t.modified_=!0,t.parent_&&NE(t.parent_))}function ME(t){t.copy_||(t.copy_=IE(t.base_,t.scope_.immer_.useStrictShallowCopy_))}var tY=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(e,r,n)=>{if(typeof e=="function"&&typeof r!="function"){let i=r;r=e;let a=this;return function(c=i,...l){return a.produce(c,u=>r.call(this,u,...l))}}typeof r!="function"&&er(6),n!==void 0&&typeof n!="function"&&er(7);let o;if(di(e)){let i=PL(this),a=DE(e,void 0),s=!0;try{o=r(a),s=!1}finally{s?OE(i):LE(i)}return IL(i,n),OL(o,i)}else if(!e||typeof e!="object"){if(o=r(e),o===void 0&&(o=e),o===kE&&(o=void 0),this.autoFreeze_&&FE(o,!0),n){let i=[],a=[];Sa("Patches").generateReplacementPatches_(e,o,i,a),n(i,a)}return o}else er(1,e)},this.produceWithPatches=(e,r)=>{if(typeof e=="function")return(a,...s)=>this.produceWithPatches(a,c=>e(c,...s));let n,o;return[this.produce(e,r,(a,s)=>{n=a,o=s}),n,o]},typeof t?.autoFreeze=="boolean"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){di(t)||er(8),ga(t)&&(t=rY(t));let e=PL(this),r=DE(t,void 0);return r[Ir].isManual_=!0,LE(e),r}finishDraft(t,e){let r=t&&t[Ir];(!r||!r.isManual_)&&er(9);let{scope_:n}=r;return IL(n,e),OL(void 0,n)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}applyPatches(t,e){let r;for(r=e.length-1;r>=0;r--){let o=e[r];if(o.path.length===0&&o.op==="replace"){t=o.value;break}}r>-1&&(e=e.slice(r+1));let n=Sa("Patches").applyPatches_;return ga(t)?n(t,e):this.produce(t,o=>n(o,e))}};function DE(t,e){let r=su(t)?Sa("MapSet").proxyMap_(t,e):lu(t)?Sa("MapSet").proxySet_(t,e):Z2(t,e);return(e?e.scope_:kL()).drafts_.push(r),r}function rY(t){return ga(t)||er(10,t),UL(t)}function UL(t){if(!di(t)||th(t))return t;let e=t[Ir],r;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,r=IE(t,e.scope_.immer_.useStrictShallowCopy_)}else r=IE(t,!0);return nu(r,(n,o)=>{DL(r,n,UL(o))}),e&&(e.finalized_=!1),r}function BL(){let e="replace",r="add",n="remove";function o(p,m,h,g){switch(p.type_){case 0:case 2:return a(p,m,h,g);case 1:return i(p,m,h,g);case 3:return s(p,m,h,g)}}function i(p,m,h,g){let{base_:f,assigned_:S}=p,y=p.copy_;y.length<f.length&&([f,y]=[y,f],[h,g]=[g,h]);for(let E=0;E<f.length;E++)if(S[E]&&y[E]!==f[E]){let T=m.concat([E]);h.push({op:e,path:T,value:d(y[E])}),g.push({op:e,path:T,value:d(f[E])})}for(let E=f.length;E<y.length;E++){let T=m.concat([E]);h.push({op:r,path:T,value:d(y[E])})}for(let E=y.length-1;f.length<=E;--E){let T=m.concat([E]);g.push({op:n,path:T})}}function a(p,m,h,g){let{base_:f,copy_:S}=p;nu(p.assigned_,(y,E)=>{let T=xE(f,y),v=xE(S,y),x=E?ou(f,y)?e:r:n;if(T===v&&x===e)return;let C=m.concat(y);h.push(x===n?{op:x,path:C}:{op:x,path:C,value:v}),g.push(x===r?{op:n,path:C}:x===n?{op:r,path:C,value:d(T)}:{op:e,path:C,value:d(T)})})}function s(p,m,h,g){let{base_:f,copy_:S}=p,y=0;f.forEach(E=>{if(!S.has(E)){let T=m.concat([y]);h.push({op:n,path:T,value:E}),g.unshift({op:r,path:T,value:E})}y++}),y=0,S.forEach(E=>{if(!f.has(E)){let T=m.concat([y]);h.push({op:r,path:T,value:E}),g.unshift({op:n,path:T,value:E})}y++})}function c(p,m,h,g){h.push({op:e,path:[],value:m===kE?void 0:m}),g.push({op:e,path:[],value:p})}function l(p,m){return m.forEach(h=>{let{path:g,op:f}=h,S=p;for(let v=0;v<g.length-1;v++){let x=fa(S),C=g[v];typeof C!="string"&&typeof C!="number"&&(C=""+C),(x===0||x===1)&&(C==="__proto__"||C==="constructor")&&er(19),typeof S=="function"&&C==="prototype"&&er(19),S=xE(S,C),typeof S!="object"&&er(18,g.join("/"))}let y=fa(S),E=u(h.value),T=g[g.length-1];switch(f){case e:switch(y){case 2:return S.set(T,E);case 3:er(16);default:return S[T]=E}case r:switch(y){case 1:return T==="-"?S.push(E):S.splice(T,0,E);case 2:return S.set(T,E);case 3:return S.add(E);default:return S[T]=E}case n:switch(y){case 1:return S.splice(T,1);case 2:return S.delete(T);case 3:return S.delete(h.value);default:return delete S[T]}default:er(17,f)}}),p}function u(p){if(!di(p))return p;if(Array.isArray(p))return p.map(u);if(su(p))return new Map(Array.from(p.entries()).map(([h,g])=>[h,u(g)]));if(lu(p))return new Set(Array.from(p).map(u));let m=Object.create(ha(p));for(let h in p)m[h]=u(p[h]);return ou(p,ru)&&(m[ru]=p[ru]),m}function d(p){return ga(p)?u(p):p}X2("Patches",{applyPatches_:l,generatePatches_:o,generateReplacementPatches_:c})}var Pr=new tY,i3e=Pr.produce,zL=Pr.produceWithPatches.bind(Pr),a3e=Pr.setAutoFreeze.bind(Pr),s3e=Pr.setUseStrictShallowCopy.bind(Pr),l3e=Pr.applyPatches.bind(Pr),c3e=Pr.createDraft.bind(Pr),u3e=Pr.finishDraft.bind(Pr);import{v4 as nY}from"uuid";BL();function $s({logger:t,socket:e,baseState:r,recipe:n,description:o}){let[i,a,s]=zL(r,n),c={id:nY(),patches:a,inversePatches:s,description:o,timestamp:Date.now()};return e?.emit("copilotPatch",c),t.info({description:o},"Emitting copilot patch"),{patch:c,newState:i}}import oY from"fs";import Ws from"path";function HL(t){let e=t.subDir?Ws.join(t.project.rootDir,t.subDir):t.project.rootDir,r=`${He(t.name)}.module.yaml`,n=Ws.join(e,r),o=Ws.relative(t.project.rootDir,n),i=oY.statSync(n);return{type:ye.MODULE,name:t.name,id:t.moduleId,description:t.description??void 0,relativePath:o,fullFilePath:n,platformSep:Ws.sep,fullPathSegments:n.split(Ws.sep),relativePathSegments:o.split(Ws.sep),fileName:r,lastModified:i.mtime,createdAt:i.birthtime}}import{randomUUID as BE}from"crypto";import{z as GL}from"zod";function cu(t){let e=t.config.ai?.aiAction??!1,r=e?"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use. The AI_ACTION_DYNAMIC is an AI action that will dynamically generate up to 15 steps to achieve a goal.":"The step types that can be ingested for a test change. The PRESET_ACTION's action can be seen as a single step command. The MODULE is a module step to use.";return e?GL.discriminatedUnion("type",[cg,ug,ZT]).describe(r):GL.discriminatedUnion("type",[cg,ug]).describe(r)}async function qs(t,e,r){switch(t.type){case"PRESET_ACTION":{let n=ju(t.action),o=t.envKey&&lg.includes(n.type)?t.envKey:void 0;return{type:"PRESET_ACTION",command:n,id:BE(),envKey:o}}case"MODULE":{let{selector:n,inputs:o}=t.module,{entity:i,momenticFiles:a}=await Wn(e,n,"module"),s=await fn(i,a,r);ev(o,s);let l=Object.keys(o??{}).length>0?o??{}:(s.parameters?.length??0)>0?{}:void 0,u={id:BE(),inputs:l};return{...s,...u,type:"RESOLVED_MODULE"}}case"AI_ACTION_DYNAMIC":{if(!(e.config.ai?.aiAction??!1))throw new Error("AI actions are disabled. Enable AI actions in your momentic.config.yaml by setting 'ai.aiAction: true' to use this feature.");return{type:"AI_ACTION_DYNAMIC",text:t.text,id:BE()}}default:return(o=>{throw new Error("You missed a case in the switch above")})(t)}}async function VL({moduleMetadata:t,steps:e,momenticFiles:r,project:n}){let{stepsToSave:o}=await st({stepLists:{steps:e}});xr({content:{...t,steps:o.steps},schemaVersion:Me,momenticFiles:r,project:n})}var $L=t=>({name:"module_create",tool:jL({description:"Create a module. If startIndex is provided, the steps will be extracted from the current test, a module will be created with those steps, and the test will be updated to reference the new module. If no startIndex is provided, an unreferenced module will be created. Automatically splices and repairs the test to reference the new module.",inputSchema:Ke.object({name:Ke.string(),description:Ke.string(),enabled:Ke.boolean().default(!0),parameters:Ke.string().array().optional().describe("Array of parameter names for the module, e.g., ['apiKey', 'userId']."),defaultParameters:Ke.record(Ke.string(),Ke.string()).optional().describe("Default values for parameters, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ke.record(Ke.string(),Ke.string().array()).optional().describe("Enum options for parameters, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters."),moduleInputs:Ke.record(Ke.string(),Ke.string()).optional().describe("Input parameters to pass to the new module when it's inserted into the test. Keys must match the module's defined parameters. Only relevant if startIndex is provided."),subDir:Ke.string().optional().describe("sub directory to create the module in. If not provided, the module will be created in the project's root directory."),startIndex:Ke.number().optional().describe("Start index of steps to extract from the current test (0-based)."),endIndex:Ke.number().optional().describe("End index of steps to extract from the current test (exclusive). If not provided, extracts just the startIndex.")}),execute:async r=>{let{project:n,logger:o,testPath:i,socket:a,saveChangesToDisk:s}=t,c=r.startIndex??0,l=r.endIndex??c+1,u=await ee(n);if(Object.values(u.modules).find(f=>f.name===r.name))return we(oe({text:`Error: A module with the name "${r.name}" already exists. Please use a different name.`,xmlTag:"Error"}));if(r.parameters!==void 0){let f=r.defaultParameters?Object.keys(r.defaultParameters):[],S=r.parameterEnums?Object.keys(r.parameterEnums):[],y=new Set([...f,...S]);for(let E of y)if(!r.parameters.includes(E))return we(oe({text:`Error: Default parameter "${E}" is not defined in parameters array. Available parameters: ${r.parameters.join(", ")}`,xmlTag:"Error"}))}let p=[];if(r.startIndex!==void 0){if(!i)return we(oe({text:"Error: testPath is required when extracting steps from the current test.",xmlTag:"Error"}));let f=await mt(rh.join(n.rootDir,i),o,u);if(c<0||c>=f.steps.length)return we(oe({text:`Error: startIndex ${c} is out of bounds. Test has ${f.steps.length} steps.`,xmlTag:"Error"}));if(l<=c||l>f.steps.length)return we(oe({text:`Error: endIndex ${l} is out of bounds. Must be between ${c+1} and ${f.steps.length}.`,xmlTag:"Error"}));p=f.steps.slice(c,l);for(let S of p)if(S.type==="RESOLVED_MODULE")return we(oe({text:"Error: Modules cannot be nested. Please select steps that do not include module references.",xmlTag:"Error"}))}let m=r.subDir?rh.join(n.rootDir,r.subDir):n.rootDir;r.subDir&&iY.mkdirSync(m,{recursive:!0});let h=await hp({name:r.name,description:r.description??"",enabled:r.enabled??!0,steps:p,folder:m,project:n}),g=HL({project:n,name:r.name,moduleId:h.moduleId,subDir:r.subDir,description:h.description??void 0});if(u.modules[h.moduleId]=g,r.parameters!==void 0||r.defaultParameters!==void 0||r.parameterEnums!==void 0){let f={moduleId:h.moduleId,name:r.name,description:r.description??h.description,enabled:r.enabled??h.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums};await VL({moduleMetadata:f,steps:p,momenticFiles:u,project:n}),h={...h,name:r.name,description:r.description??h.description,enabled:r.enabled??h.enabled,parameters:r.parameters??[],defaultParameters:r.defaultParameters,parameterEnums:r.parameterEnums}}if(r.startIndex!==void 0){let f=await mt(rh.join(n.rootDir,i),o,u),S={steps:f.steps??[],beforeSteps:f.beforeSteps??[],afterSteps:f.afterSteps??[]},y={type:"MODULE",module:{selector:{id:h.moduleId},inputs:r.moduleInputs??{}}},E;try{E=await qs(y,n,o)}catch(x){return we(oe({text:`Module "${r.name}" was created successfully, but could not be added to the test. ${String(x)}`,xmlTag:"Error"}))}let T=x=>{x.steps.splice(c,l-c,E)},{newState:v}=$s({logger:o,socket:a,baseState:S,recipe:T,description:`Create module "${r.name}" from steps ${c}-${l-1}`});if(s){let{stepsToSave:x,moduleUpdates:C}=await st({stepLists:v});C.forEach(_=>{xr({content:_,schemaVersion:Me,momenticFiles:u,project:n})}),br({relativeTestPath:i,steps:x,schemaVersion:Me,project:n})}}return we(oe({text:JSON.stringify(h,null,2),xmlTag:"ModuleResult"}))}})});function aY(t,e,r,n,o){if(t===void 0&&e!==void 0)throw new at("Validation Error: startIndex is required when endIndex is provided.");if(t!==void 0&&e===void 0&&r===0)throw new at("Validation Error: steps are required when startIndex is provided without an endIndex.");if(t!==void 0&&(t>n||t<0))throw new at(`Validation Error: startIndex is out of bounds for module with ${n} steps.`);if(e!==void 0&&t===void 0)throw new at("Validation Error: startIndex is required when endIndex is provided.");if(e!==void 0&&t!==void 0&&e<t)throw new at("Validation Error: endIndex must be greater than or equal to startIndex.");if(e!==void 0&&(e>n||e<0))throw new at(`Validation Error: endIndex ${e} is out of bounds for module with ${n} steps.`);let i=t??n;if((e??i)===i&&r===0&&!o)throw new at("Validation Error: Nothing to change. Provide steps, a valid delete range, or metadata updates.")}var WL=t=>{let e=cu(t.project);return{name:"module_update",tool:jL({description:"Edit a module's steps and/or metadata. Provide startIndex (and optional endIndex) to replace or remove that range; omit endIndex to insert at startIndex; omit both indices to append new steps. Use an empty steps array with both indices to delete the range. Optionally update metadata like parameters. Omit both indices and steps to only update metadata.",inputSchema:Ke.object({selector:Oo,steps:e.array(),startIndex:Ke.number().optional(),endIndex:Ke.number().optional(),description:Ke.string().optional().describe("New description for the module."),enabled:Ke.boolean().optional().describe("New enabled state for the module."),parameters:Ke.string().array().optional().describe("New array of parameter names, e.g., ['apiKey', 'userId']. Replaces all existing parameters, resets default parameters and parameter enums if set."),defaultParameters:Ke.record(Ke.string(),Ke.string()).optional().describe("New default values, e.g., { 'apiKey': 'default123' }. Keys must match parameters."),parameterEnums:Ke.record(Ke.string(),Ke.string().array()).optional().describe("New enum options, e.g., { 'role': ['admin', 'user'] }. Keys must match parameters.")}),execute:async n=>{let{project:o,logger:i,socket:a,testPath:s,saveChangesToDisk:c}=t,l=await Promise.all(n.steps.map(E=>qs(E,o,i))),{entity:u,momenticFiles:d}=await Wn(o,n.selector,"module"),p=await fn(u,d,i),m=l.find(E=>!ng(E));if(m)return we(oe({text:`Error: step type ${m.type} cannot be added to a module.`,xmlTag:"Error"}));let h=n.description!==void 0||n.enabled!==void 0||n.parameters!==void 0||n.defaultParameters!==void 0||n.parameterEnums!==void 0;try{aY(n.startIndex,n.endIndex,n.steps.length,p.steps.length,h)}catch(E){return we(oe({text:String(E),xmlTag:"Error"}))}let g=p.steps;if(n.steps.length>0||n.startIndex!==void 0||n.endIndex!==void 0){g=[...p.steps];let E=n.startIndex!==void 0?n.startIndex:g.length,T=n.endIndex!==void 0?n.endIndex:E;g.splice(E,T-E,...l)}let f={moduleId:p.moduleId,name:p.name,description:n.description??p.description,enabled:n.enabled??p.enabled,parameters:n.parameters??p.parameters,defaultParameters:n.defaultParameters??p.defaultParameters,parameterEnums:n.parameterEnums??p.parameterEnums};n.parameters!==void 0&&(f.defaultParameters=n.defaultParameters??{},f.parameterEnums=n.parameterEnums??{});let S=null;if(s){let E=await mt(rh.join(o.rootDir,s),i,d);S={steps:E.steps??[],beforeSteps:E.beforeSteps??[],afterSteps:E.afterSteps??[]}}c&&await VL({moduleMetadata:f,steps:g,momenticFiles:d,project:o}),s&&S&&$s({logger:i,socket:a,baseState:S,recipe:T=>{let v=x=>{for(let C of x)C.type==="RESOLVED_MODULE"&&C.moduleId===p.moduleId&&(C.steps=g)};v(T.steps),v(T.beforeSteps),v(T.afterSteps)},description:`Update module "${p.name}"`});let y={...f,stepCount:g.length};return we(oe({text:JSON.stringify(y,null,2),xmlTag:"ModuleResult"}))}})}};import{tool as oh}from"ai";import{randomUUID as nh}from"crypto";import{z as pi}from"zod";var sY=t=>({name:"preview_preflight",tool:oh({description:"Resolve and validate locators without changing the page. If found, it will return the locator ID and HTML.",inputSchema:pi.object({description:pi.string().describe("Description of the element to preview.")}),toModelOutput:r=>r,execute:async({description:r})=>{let{controller:n,logger:o,testContext:i}=t;try{let a=await n.locateElement({description:r,disableCache:!0,skipWait:!0,logger:o,testContext:i});a.resolution.locator&&await Promise.all([n.browser.scrollIntoViewIfNeeded(a.resolution.locator),n.browser.highlight(a.resolution.locator)]);let s=[...oe({text:`Found element matching description: ${a.target.id}`,xmlTag:"Result"})];return a.target.nodeOnlySerializedHtml&&s.push(...oe({text:`HTML: ${a.target.nodeOnlySerializedHtml}`})),s.push(...await qn(n.browser)),we(s)}catch(a){let s=[...oe({text:`Failed to find any element matching description: ${a}`,xmlTag:"Error"}),...await qn(n.browser)];return we(s)}}})}),lY=t=>({name:"preview_ensure",tool:oh({description:"Confirm page state.",inputSchema:pi.object({assertion:pi.string().describe("Assertion to confirm page state.")}),toModelOutput:r=>r,execute:async({assertion:r})=>{let{logger:n,storage:o,controller:i,codeEvalTools:a,socket:s,orgId:c,testContext:l}=t,u={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:r,id:nh()},id:nh()},d=await Wm({step:u,controller:i,storage:o,codeEvalTools:a,logger:n,socket:s,orgId:c,testContext:l}),p=[];return d?d.status==="SUCCESS"?p.push(...oe({text:`Assertion is true: ${d.message}`,xmlTag:"SuccessfulResult"})):p.push(...oe({text:`Assertion is false: ${d.message}`,xmlTag:"Error"})):p.push(...oe({text:"Assertion executed with unknown result.",xmlTag:"Error"})),p.push(...await qn(i.browser)),we(p)}})}),cY=t=>({name:"preview_step",tool:oh({description:"Execute a step without adding it to the test.",inputSchema:pi.object({command:Fa}),toModelOutput:r=>r,execute:async({command:r})=>{let{logger:n,storage:o,controller:i,codeEvalTools:a,socket:s,orgId:c,testContext:l}=t,u=ju(r),d={type:"PRESET_ACTION",command:u,id:nh()},p=await Wm({step:d,controller:i,storage:o,codeEvalTools:a,logger:n,socket:s,orgId:c,testContext:l}),m=[];return p?p.status==="SUCCESS"?m.push(...oe({text:`Step Execution successful: ${p.message}`,xmlTag:"SuccessfulResult"})):m.push(...oe({text:`Step Execution failed: ${p.message}`,xmlTag:"Error"})):m.push(...oe({text:"Step Execution errored for an unknown reason.",xmlTag:"Error"})),m.push(...await qn(i.browser)),m.push(...pa(l)),we(m)}})}),uY=t=>{let{project:e}=t;return e.config.ai?.aiAction??!1?{name:"preview_ai_action",tool:oh({description:"Execute an AI action without adding it to the test. This will dynamically generate and run steps to achieve the goal. Note this tool will update and move your test state forward, so if it fails you must rerun the test up to this step before trying again.",inputSchema:pi.object({text:pi.string().describe("The goal description for the AI action. Supports handlebars templates (ex: {{env.PASSWORD}})"),retries:pi.number().optional()}),toModelOutput:o=>o,execute:async({text:o,retries:i})=>{let{logger:a,storage:s,controller:c,codeEvalTools:l,socket:u,orgId:d,testContext:p}=t,m={type:"AI_ACTION_DYNAMIC",text:o,id:nh(),retries:i},h=await Wm({step:m,controller:c,storage:s,codeEvalTools:l,logger:a,socket:u,orgId:d,testContext:p}),g=[];return h?h.status==="SUCCESS"?g.push(...oe({text:`AI action completed successfully: ${h.message??"Goal achieved"}`,xmlTag:"SuccessfulResult"})):g.push(...oe({text:`AI action failed: ${h.message??"Unknown error while previewing AI action"}`,xmlTag:"Error"})):g.push(...oe({text:"AI action executed with unknown result.",xmlTag:"Error"})),g.push(...await qn(c.browser)),g.push(...pa(p)),we(g)}})}:void 0},qL=[sY,lY,cY,uY];import{tool as GE}from"ai";import ZL from"path";import{z as uu}from"zod";import{tool as zE}from"ai";import KL from"path";import{z as mi}from"zod";var HE=t=>{throw new Error(`Unknown test section: ${t}`)},ih=mi.enum(["setup","teardown","main"]).describe("Test section to modify: 'setup' corresponds to beforeSteps (steps that run before the test), 'teardown' corresponds to afterSteps (steps that run after the test), 'main' is synonymous with steps (the main test steps)");function YL(t,e){switch(e){case"setup":return t.beforeSteps;case"teardown":return t.afterSteps;case"main":return t.steps;default:return HE(e)}}var XL=t=>{let e=cu(t.project);return{name:"test_insert_step",tool:zE({description:"Insert a step or module into the test.",inputSchema:mi.object({index:mi.number(),step:e,targetSection:ih.default("main")}),execute:async n=>{let{project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c}=t,l=await ee(o),u=await mt(KL.join(o.rootDir,a),i,l),d={steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]},p=YL(d,n.targetSection);if(n.index<0||n.index>p.length)return we(oe({text:`Error: Invalid index ${n.index} for inserting into ${n.targetSection} section with ${p.length} steps (must be 0-${p.length})`,xmlTag:"Error"}));let m=await qs(n.step,o,i),h=f=>{switch(n.targetSection){case"setup":f.beforeSteps.splice(n.index,0,m);break;case"teardown":f.afterSteps.splice(n.index,0,m);break;case"main":f.steps.splice(n.index,0,m);break;default:HE(n.targetSection)}},{newState:g}=$s({logger:i,socket:s,baseState:d,recipe:h,description:`Insert ${m.type} step at index ${n.index} in ${n.targetSection}`});if(c){let{stepsToSave:f,moduleUpdates:S}=await st({stepLists:g});S.forEach(y=>{xr({content:y,schemaVersion:Me,momenticFiles:l,project:o})}),br({relativeTestPath:a,steps:f,schemaVersion:Me,project:o})}return we(oe({text:`Successfully inserted step at index ${n.index} in the ${n.targetSection} section.`,xmlTag:"Result"}))}})}},JL=t=>{let e=cu(t.project);return{name:"test_splice_steps",tool:zE({description:"Splice steps in the test. This is the primary tool for replacing, removing, or bulk inserting steps. Never use this as a means to bypass a failure. Examples: Replace step at index 5: splice(startIndex=5, deleteCount=1, steps=[newStep]). Delete step at index 5: splice(startIndex=5, deleteCount=1, steps=[]). Insert multiple steps at index 5: splice(startIndex=5, deleteCount=0, steps=[step1, step2]).",inputSchema:mi.object({startIndex:mi.number(),deleteCount:mi.number().describe("Number of steps to remove. Use 0 to insert without deleting, 1 to replace a single step, or N to delete N steps."),steps:e.array(),targetSection:ih.default("main"),returnTest:mi.boolean().default(!1).describe("Whether or not you want to see the full test after the splice is complete")}),execute:async n=>{let{project:o,logger:i,testPath:a,socket:s,saveChangesToDisk:c}=t,l=await ee(o),u=await mt(KL.join(o.rootDir,a),i,l),d={steps:u.steps??[],beforeSteps:u.beforeSteps??[],afterSteps:u.afterSteps??[]},p=YL(d,n.targetSection);if(n.startIndex<0||n.startIndex>p.length)return we(oe({text:`Error: Invalid startIndex ${n.startIndex} for splicing ${n.targetSection} section with ${p.length} steps (must be 0-${p.length})`,xmlTag:"Error"}));let m=await Promise.all(n.steps.map(E=>qs(E,o,i))),h=E=>{switch(n.targetSection){case"setup":E.beforeSteps.splice(n.startIndex,n.deleteCount,...m);break;case"teardown":E.afterSteps.splice(n.startIndex,n.deleteCount,...m);break;case"main":E.steps.splice(n.startIndex,n.deleteCount,...m);break;default:HE(n.targetSection)}},g=n.steps.length,f=n.deleteCount,{newState:S}=$s({logger:i,socket:s,baseState:d,recipe:h,description:`Splice ${g} step(s) at index ${n.startIndex} in ${n.targetSection}, removing ${f}`});if(c){let{stepsToSave:E,moduleUpdates:T}=await st({stepLists:S});T.forEach(v=>{xr({content:v,schemaVersion:Me,momenticFiles:l,project:o})}),br({relativeTestPath:a,steps:E,schemaVersion:Me,project:o})}let y=[...oe({text:`Successfully spliced ${g} step(s) at index ${n.startIndex} in the ${n.targetSection} section, removing ${f} step(s).`,xmlTag:"Result"})];return n.returnTest&&y.push(...oe({text:JSON.stringify(await wE(o,a,i),null,2),xmlTag:"TestContent"})),we(y)}})}},QL=t=>({name:"test_get",tool:zE({description:"Retrieve the full test contents, including simplified cache data on some steps enabling you to inspect resolved locators and debug targeting issues. For context, the caches are just simplified targeting information",inputSchema:mi.object({}),execute:async()=>wE(t.project,t.testPath,t.logger)})});var eN=3,tN=t=>({name:"get_environment_variables",tool:GE({description:"Get the current environment variables.",inputSchema:uu.object({}),toModelOutput:r=>r,execute:async()=>{let r=t.conversationTokenTarget/eN;return _L(t.testContext,{tokenLimit:r})}})}),rN=t=>({name:"reset_session",tool:GE({description:"Reset the browser session. This will clear any authentication state and also navigate to the starting URL of the test.",inputSchema:uu.object({}),toModelOutput:r=>r,execute:async()=>{let{project:r,logger:n,testPath:o,orgId:i,codeEvalTools:a}=t,s=await ee(r),c=await mt(ZL.join(r.rootDir,o),n,s),l=c.baseUrl,u,d={};if(!l&&c.envs){let m=c.envs.find(h=>h.default);if(m)try{let h=Ki(m.name,r,n);u=h.name,d=h.variables;let g=h.variables[At];typeof g=="string"&&(l=g)}catch(h){n.warn({err:h,envName:m.name},"Failed to resolve environment for reset")}}l||(l="about:blank"),d=await Gm({orgId:i,testName:c.name,envName:u,baseEnvVariables:d,parameters:c.parameters,logger:n,localTools:a}),await t.controller.browser.reset({newUrl:l}),t.testContext.reset({baseUrl:l,testName:c.name,currentUrl:t.controller.browser.url(),variablesFromEnvironment:d,envName:u});let p=[...oe({text:`Session reset to ${l}.`,xmlTag:"Result"}),...await qn(t.controller.browser),...pa(t.testContext)];return we(p)}})}),nN=t=>({name:"run_step",tool:GE({description:"Run the step in the test at the given startIndex. If there is no endIndex, the step at the startIndex will be executed. EndIndex is the last step that is run (end index is inclusive).",inputSchema:uu.object({fromIndex:uu.number(),toIndex:uu.number().optional(),targetSection:ih.default("main")}),toModelOutput:r=>r,execute:async({fromIndex:r,toIndex:n,targetSection:o})=>{let{project:i,logger:a,testPath:s,storage:c,controller:l,codeEvalTools:u,socket:d,orgId:p,testContext:m,conversationTokenTarget:h}=t,g=r,f=n??g,S=await ee(i),y=await mt(ZL.join(i.rootDir,s),a,S),E;switch(o){case"setup":E=y.beforeSteps??[];break;case"teardown":E=y.afterSteps??[];break;case"main":E=y.steps;break;default:return(q=>{throw new Error(`Unknown test section: ${q}`)})(o)}if(g<0||g>=E.length)return we(oe({text:`Error: startIndex is out of bounds for ${o} section with ${E.length} steps.`,xmlTag:"Error"}));if(f<g)return we(oe({text:"Error: toIndex must be greater than or equal to fromIndex.",xmlTag:"Error"}));if(f>=E.length)return we(oe({text:`Error: toIndex is out of bounds for ${o} section with ${E.length} steps.`,xmlTag:"Error"}));let T=E.slice(g,f+1);if(T.length===0)return we(oe({text:"Error: No steps were executed.",xmlTag:"Error"}));l.setOpen();let{results:v}=await RE({steps:T,controller:l,storage:c,codeEvalTools:u,logger:a,socket:d,orgId:p,testContext:m});if(!v||v.length===0)return we(oe({text:"Error: No steps were executed.",xmlTag:"Error"}));let x=v.at(-1);if(!x)return we(oe({text:"Error: No steps were executed.",xmlTag:"Error"}));if(x.status!=="SUCCESS"){let k=g+v.length-1;return we(oe({text:`Error: Step at index ${k} failed: ${x.message}`,xmlTag:"Error"}))}let C=o==="main"?"":` in ${o}`,_=g===f?`Step at index ${f}${C}`:`Steps ${g}-${f}${C}`,L=[];if(x.status==="SUCCESS"){let k=`${_} executed successfully. Last step result: ${x.message}`;L.push(...oe({text:k,xmlTag:"Result"})),x.data&&L.push(...oe({text:`Data: ${JSON.stringify(x.data,null,2)}`,xmlTag:"ResultData"}))}let B=h/eN,[G,N]=await Promise.all([qn(l.browser,B),pa(m,{tokenLimit:B})]);return we([...L,...G,...N])}})});var oN=[ML,tN,nN,QL,rN,XL,JL,$L,WL,...qL];var hY=1e5,iN=8e4,jE=2,aN="[trimmed: omitted due to context budget]",VE=50,gY=1600;function fY(t,e){return typeof t=="object"&&t!==null&&t.type===e}function SY(t,e,r){let n=0,o=[];for(let i of t){let a=i.content;if(!Array.isArray(a)){o.push(i);continue}let s=[];for(let c of a){if(n>=e){s.push(c);continue}if(!fY(c,r)){s.push(c);continue}if(r==="image"){n>=e?s.push(c):n+=gY;continue}let l=r==="tool-result"?"output":"input",u=r==="tool-result"?c.output:c.input;if(u===void 0||u===aN){s.push(c);continue}let d=Pe(u);n+=d,s.push({...c,[l]:aN})}s.length!==0&&o.push({...i,content:s})}return{messages:o,trimmedTokens:n}}function yY(t){let e=t[0];return e?"parts"in e&&Array.isArray(e.parts):!1}function EY(t){return pY({messages:t,reasoning:"before-last-message",toolCalls:[{type:"before-last-10-messages",tools:["momentic_module_get","momentic_module_recommend","get_environment_variables"]},{type:"before-last-5-messages",tools:["run_step","preview_ai_action"]},{type:"before-last-3-messages",tools:["test_get","reset_session","test_insert_step","test_splice_steps","preview_ensure","momentic_module_create"]},{type:"before-last-2-messages",tools:["observe_page","momentic_module_list","momentic_module_change"]},{type:"before-last-1-messages",tools:["preview_preflight","preview_step"]}],emptyMessages:"remove"})}var bY=["tool-result","image","tool-call"],TY=.3;function du(t,e,r){let n=[...t];for(let o of bY){let i=Pe(n);if(i<=e)break;let a=i-e,s=SY(n,a,o);n=s.messages,s.trimmedTokens>0&&r.debug({contentType:o,trimmedTokens:s.trimmedTokens,newTokenCount:Pe(n)},"Trimmed content")}return n}function vY(t,e,r){let n=Pe(t);if(n<=e||t.length<=1)return t;let o=t[0],i=[],a=[];if(t.length>jE+1?(i=t.slice(1,t.length-jE),a=t.slice(t.length-jE)):a=t.slice(1),i.length>0){i=du(i,e,r);let u=[o,...i,...a];if(n=Pe(u),n<=e)return u}let s=Pe(i),c=s/e;if(c<TY){if(a.length>1){let u=a[a.length-1],d=[...i,...a.slice(0,-1)],p=du(d,e,r),m=[o,...p,u];if(n=Pe(m),n<=e)return m;let h=du([...p,u],e,r),g=[o,...h];if(n=Pe(g),n<=e)return g}else if(a.length===1){let u=[...i,...a],d=du(u,e,r),p=[o,...d];if(n=Pe(p),n<=e)return p}}else for(r.debug({headBudgetRatio:c,middleMsgTokens:s,targetTokens:e},"Middle exceeds 30% budget, removing messages");i.length>0;){i.shift();let u=[o,...i,...a];if(n=Pe(u),n<=e)return u}a=du(a,e,r);let l=[o,...i,...a];if(n=Pe(l),n<=e)return l;for(;a.length>0;)if(a.shift(),l=[o,...i,...a],n=Pe(l),n<=e)return l;return n>e&&r.warn({targetTokens:e,finalTokenCount:n,remainingMessages:l.length},"Unable to meet token target after all pruning phases"),l}function AY(t,e,r,n){let o=EY(t),i=Pe(o);return i>e&&(n.debug({projected:i,threshold:e,target:r},"Context exceeds threshold, pruning messages"),o=vY(o,r,n)),o}function ah(t){let{testPath:e,messages:r,logger:n,session:o,sessionId:i,hooks:a={},saveChangesToDisk:s=!1}=t,{onStepFinish:c,onPrepareStep:l,onChunk:u,onError:d,onFinish:p}=a,m=wr(),h=xt(),g=dr(),f=pe(),S=new nt({apiKey:m,baseUrl:g,logger:n}),y=new ui(S,h),E=new Nn({httpClient:new zt({baseUrl:S.baseUrl,apiKey:S.apiKey,logger:n,mode:"interactive"}),fakerSeed:f.config.advanced?.fakerConstantSeed?rs:void 0}),T={project:f,apiKey:m,orgId:h,baseUrl:g,sessionId:i,logger:n,storage:y,codeEvalTools:E,saveChangesToDisk:s,testPath:e,testContext:o.context,controller:o.controller,socket:o.socket,conversationTokenTarget:iN},v=Ym.reduce((N,{name:k,builder:q})=>(N[k]=q(T),N),{}),x={};for(let N of oN){let k=N(T);k&&(x[k.name]=k.tool)}let C={...v,...x},_=$m(i),L=async N=>{let{messages:k}=N;l&&await l(k);let q=AY(k,hY,iN,n),$=Pe(k);return $>tR&&n.debug({originalCount:k.length,prunedCount:q.length,originalTokens:$,prunedTokens:Pe(q)},"Prepared messages for copilot step"),{...N,messages:q}},B={model:_("claude-sonnet-4-5-20250929"),stopWhen:mY(VE),maxRetries:4,system:CL(f),tools:C,prepareStep:L,onStepFinish:c,onChunk:u,onError:d,onFinish:async({finishReason:N,usage:k,text:q,response:$})=>{n.info({finishReason:N,usage:k,sessionId:i},"Full copilot turn finished"),p&&await p({finishReason:N,usage:k,text:q,response:$})}},G=yY(r)?dY(r,{tools:B.tools}):r;return{...B,messages:G}}var g8e=new Error("timeout while waiting for mutex to become available"),f8e=new Error("mutex already locked"),RY=new Error("request for lock canceled"),CY=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},$E=class{constructor(e,r=RY){this._value=e,this._cancelError=r,this._queue=[],this._weightedWaiters=[]}acquire(e=1,r=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((n,o)=>{let i={resolve:n,reject:o,weight:e,priority:r},a=sN(this._queue,s=>r<=s.priority);a===-1&&e<=this._value?this._dispatchItem(i):this._queue.splice(a+1,0,i)})}runExclusive(e){return CY(this,arguments,void 0,function*(r,n=1,o=0){let[i,a]=yield this.acquire(n,o);try{return yield r(i)}finally{a()}})}waitForUnlock(e=1,r=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,r)?Promise.resolve():new Promise(n=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),wY(this._weightedWaiters[e-1],{resolve:n,priority:r})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){let r=this._value;this._value-=e.weight,e.resolve([r,this._newReleaser(e.weight)])}_newReleaser(e){let r=!1;return()=>{r||(r=!0,this.release(e))}}_drainUnlockWaiters(){if(this._queue.length===0)for(let e=this._value;e>0;e--){let r=this._weightedWaiters[e-1];r&&(r.forEach(n=>n.resolve()),this._weightedWaiters[e-1]=[])}else{let e=this._queue[0].priority;for(let r=this._value;r>0;r--){let n=this._weightedWaiters[r-1];if(!n)continue;let o=n.findIndex(i=>i.priority<=e);(o===-1?n:n.splice(0,o)).forEach(i=>i.resolve())}}}_couldLockImmediately(e,r){return(this._queue.length===0||this._queue[0].priority<r)&&e<=this._value}};function wY(t,e){let r=sN(t,n=>e.priority<=n.priority);t.splice(r+1,0,e)}function sN(t,e){for(let r=t.length-1;r>=0;r--)if(e(t[r]))return r;return-1}var xY=function(t,e,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(t,e||[])).next())})},sh=class{constructor(e){this._semaphore=new $E(1,e)}acquire(){return xY(this,arguments,void 0,function*(e=0){let[,r]=yield this._semaphore.acquire(1,e);return r})}runExclusive(e,r=0){return this._semaphore.runExclusive(()=>e(),1,r)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}};var WE=class{mutexes=new Map;activeControllers=new Map;async startOrReplace(e,r){r.throwIfAborted(),this.mutexes.has(e)||this.mutexes.set(e,new sh);let o=await this.mutexes.get(e).acquire();try{let i=this.activeControllers.get(e);i&&!i.signal.aborted&&i.abort(new Error("Superseded by newer momentic_test_edit invocation. Stop executing edit_test requests to this test and ask the user what to do next."));let a=new AbortController;return this.activeControllers.set(e,a),{signal:AbortSignal.any([r,a.signal]),release:()=>{this.activeControllers.get(e)===a&&this.activeControllers.delete(e),this.activeControllers.has(e)||this.mutexes.delete(e)}}}finally{o()}}},lN=new WE;import Ks from"dedent";function _Y(){let t=Object.entries(Xh).map(([e,r])=>`- **${e}**: ${r}`).join(`
|
|
4748
4748
|
`);return Ks`
|
|
4749
4749
|
### Available Step Types
|
|
4750
4750
|
|
|
@@ -4820,8 +4820,8 @@ Running tool ${d.toolName} with input ${JSON.stringify(d.input)}
|
|
|
4820
4820
|
${l}`)];return e.getMcpCopilotConversationEvaluation({messagesAndToolCalls:c},{logger:r})}async function jY(t,e,r){let n=wr(),o=xt(),i=dr(),a=new nt({apiKey:n,baseUrl:i,logger:t}),s=new da(a),c=new ui(a,o),l=(await mt(r.fullFilePath,t,await ee(e))).advanced?.viewport??Kt,u=new no(e.config.ai?.agentConfig,{baseUrl:i,apiKey:n,logger:t,mode:"interactive"}),d=new $o({baseUrl:i,apiKey:n,logger:t,mode:"interactive"},u),p=await Yr.init({baseUrl:"about:blank",userBrowserSettings:{},enricher:d,storage:c,logger:t,contextArgs:{viewport:l,locale:Lo,timezoneId:No,geolocation:Do},iconKnowledgeBase:null,callbacks:{}}),m=new li({browser:p,generator:u,logger:t,orgId:o,options:{scratchPadId:void 0,slowMoMs:void 0,autoFollowNewTabs:!0,useMemory:e.config.ai?.useMemory,aiPageFiltering:!0},storage:c,localCodeEvalTools:new Nn({httpClient:new zt({baseUrl:i,apiKey:n,logger:t,mode:"interactive"}),fakerSeed:e.config.advanced?.fakerConstantSeed?rs:void 0}),visualDiffScreenshotStorage:s}),h=new lr({baseUrl:"about:blank",testName:NY.basename(r.relativePath),currentUrl:p.url(),variablesFromEnvironment:{},envName:void 0});return{controller:m,context:h,socket:void 0}}var VY=vn({schema:{name:"momentic_test_edit",description:cN(),inputSchema:{selector:Oo,message:DY.string().describe("A single block of natural-language instructions describing the desired edits to the test. The test can also be edited to add modules, edit modules, or create new modules inside of the test. Can only be used to modify steps (including module steps) inside of the passed in test.")}},handle:async(t,e,r,n)=>{let{project:o,logger:i}=t,a=n?.signal;if(!a){r.addError("No response handler available: client abort signal is required for momentic_test_edit");return}let s=wr(),c=dr(),l=new no(o.config.ai?.agentConfig,{baseUrl:c,apiKey:s,logger:i,mode:"interactive"}),u={completed:0,total:VE},{hooks:d,notificationAbortController:p,getAccumulatedText:m}=kY(n,i,u,r),h=uN(n);h&&await qE(n,u,"Validating if your edits requests are valid...",i,p,r);let g=await l.getLintMcpCopilotMessageResult({message:e.message},{logger:i});if(g.category!=="NONE"){r.addError(`${g.thoughts}
|
|
4821
4821
|
|
|
4822
4822
|
Category: ${g.category}`);return}let f,S;try{({entity:f,momenticFiles:S}=await Wn(o,e.selector,"test"))}catch(N){r.addError(String(N));return}let y=await mt(f.fullFilePath,i,S),E=i.child({applicationName:"momentic-mcp-copilot",testId:f.id}),T=ah({testPath:f.relativePath,messages:[{role:"user",content:e.message}],logger:E,session:await jY(E,o,f),sessionId:n?.sessionId,hooks:d,saveChangesToDisk:!0}),{signal:v,release:x}=await lN.startOrReplace(f.id,a),C=LY(T);try{await C.text}catch(N){if(v.aborted)i.debug("AI stream was cancelled, returning partial output"),r.addResult(JSON.stringify({aborted:String(N),partialOutput:m()},null,2));else throw N}finally{x()}let _=await mt(f.fullFilePath,i,S),L=await Iw(y,_),B=m().split(`
|
|
4823
|
-
`).map(N=>N.trim()).filter(N=>N.length>0);h&&await qE(n,{completed:u.total,total:u.total},"Evaluating edits and generating edit status...",i,p,r);let G=await GY(B,l,i);r.addResult(JSON.stringify({additions:L.additions,deletions:L.deletions,summarization:G},null,2))}}),dN=[UY,FY,BY,VY];var pN=[...vL,...dN,...Ym];function KE(t,e){let r=new $Y({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of pN)n.addToolToMcpServer(t,r);return r}async function mN(t,e,r,n){let o=new WY(r,e,n);return await t.connect(o),{close:async()=>{try{await t.close()}catch{}},transport:o}}var YE="mcp-session-id",JY="sessionId",Ys=XY(),pu=new Map;function hN(){let t={applicationName:"momentic-mcp-desktop-server",cliVersion:Qc??"0.0.0"},e=pe(),r=We.child({orgId:xt(),userId:qo(),...t});return{context:{project:e,logger:r,saveChangesToDisk:!0},info:t}}Ys.get("/sse",async(t,e)=>{let{context:r,info:n}=hN(),o=KE(r,n),{transport:i}=await mN(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,s={transport:i,close:async()=>{pu.delete(a);try{await o.close()}catch(c){r.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};pu.set(a,s),i.onclose=()=>{let c=pu.get(a);c&&c.close()}});Ys.post("/sse",async(t,e)=>{let r=String(t.query[JY]??"");if(!r||!pu.has(r)){e.status(400).send("Invalid or missing sessionId");return}await pu.get(r).transport.handlePostMessage(t,e,t.body)});var gN=Ys,yo={};Ys.post("/",async(t,e)=>{let r=String(t.headers[YE]??"");try{if(r&&yo[r]){await yo[r].handleRequest(t,e,t.body);return}if(!r&&KY(t.body)){let{context:n,info:o}=hN(),i=KE(n,o),a=new qY({sessionIdGenerator:()=>YY(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{yo[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&yo[s]&&delete yo[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(t,e,t.body);return}e.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null})}catch{e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}});Ys.get("/",async(t,e)=>{let r=String(t.headers[YE]??"");if(!r||!yo[r]){e.status(400).send("Invalid or missing session ID");return}await yo[r].handleRequest(t,e)});Ys.delete("/",async(t,e)=>{let r=String(t.headers[YE]??"");if(!r||!yo[r]){e.status(400).send("Invalid or missing session ID");return}let n=yo[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as QY}from"express";var fN=QY();fN.get("/:id",Ce(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=pp();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){We.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var SN=fN;import{Router as ZY}from"express";var lh=ZY();lh.get("/",Ce(async(t,e)=>{let r=(await bS()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));lh.get("/current",Ce((t,e)=>{let r=pe();if(!r){e.status(404).json({error:"No project found."});return}let n={name:r.config.name,configFilePath:r.configFilePath};e.status(200).json(n)}));lh.post("/set",Ce(async(t,e)=>{let r;try{r=YA.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}We.info("Setting local project");try{let n=await _t({configFilePath:r.configFilePath});mp(n,o=>_t({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var yN=lh;import{Router as e5}from"express";var EN=e5();EN.get("/",Ce((t,e)=>{let r=pe(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var bN=EN;import{streamText as t5}from"ai";import{Router as r5}from"express";import ch from"fs";import Xs from"path";import{v4 as n5}from"uuid";import o5 from"yaml";var mu=new Bp({platform:"local_app"},{flushAt:1,flushInterval:0});var Eo=r5();Eo.post("/",Ce(async(t,e)=>{let r;try{r=jA.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=pe(),o=await Jm({project:n,input:r});mu.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof at){e.status(400).json({error:n.message});return}throw n}}));Eo.get("/:testPath",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=pe(),o=await ee(n),i;try{i=await mt(Xs.join(n.rootDir,r),We,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await st({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{xr({content:c,schemaVersion:Me,momenticFiles:o,project:n})}),br({relativeTestPath:r,steps:a,schemaVersion:Me,project:n})}catch(a){We.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Eo.get("/:testPath/metadata",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=pe(),o=Xs.join(n.rootDir,r);if(!ch.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=ch.statSync(o),a=await mo(We),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));Eo.patch("/:testPath/metadata",Ce(async(t,e)=>{if(!t.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=GA.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:gS(t.params.testPath,r,pe()).newRelativeTestPath};e.status(200).json(o)}));Eo.patch("/:testPath",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=HA.parse(t.body)}catch(m){We.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}We.info({testPath:r},"Save received");let o=pe(),i=await ee(o),a;try{a=Ec(r,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:c,cachesToSave:l}=await st({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:xt()}}),u=new nt({apiKey:wr(),baseUrl:dr(),logger:We}),d=await $r(We,u,o);await Wo({logger:We,orgId:xt(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:We,testId:a.id,entries:l}),c.forEach(m=>{xr({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),br({relativeTestPath:r,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Eo.patch("/:testPath/environments",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=KA.parse(t.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}gS(r,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},pe()),e.status(201).json({message:"ok"})}));Eo.post("/:testPath/duplicate",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=VA.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Po(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=pe(),i=Xs.join(o.rootDir,r);if(!ch.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await ee(o),s;try{s=await mt(i,We,a)}catch(f){e.status(400).send({error:f.message});return}let c=n5(),l=jr.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await st({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:xt()}}),d=Dn({fileType:ye.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=Xs.dirname(i),m=Xs.join(p,`${n.name}.test.yaml`),h=o5.stringify(d);ch.writeFileSync(m,h,"utf-8");let g={relativeFilePath:Xs.relative(o.rootDir,m)};mu.track({type:"test_editor:test_create"}),e.status(201).json(g)}));Eo.post("/:testPath/chat",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=t.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=t.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Xm.getSession(o);if(!i){e.status(400).json({error:"No active browser session. Start a session first."});return}let a=pe(),s=Ec(r,a),c=We.child({orgId:xt(),userId:qo(),applicationName:"momentic-desktop-server-copilot",testId:s.id,sessionId:o});c.debug({sessionId:o},"Initializing copilot with sessionId");let l=ah({testPath:r,messages:n,logger:c,session:i,sessionId:o,saveChangesToDisk:!1});t5(l).pipeUIMessageStreamToResponse(e,{onError:d=>{let p=d instanceof Error?d.message:String(d);return c.error({err:d,sessionId:o},"streamText session failed"),p}})}));var TN=Eo;async function CN(t){let{momenticServerUrl:e,apiKey:r,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=t;e&&Hw(e),await jw(r);let u=xt(),d=qo();mu.identify({user_id:d,org_id:u});let p=t.logger??We;p=p.child({orgId:u,userId:d}),p.debug({params:t},"Desktop server init and api key check done");let m=d5(o,n,p),h=`http://localhost:${n}`;mp(l,T=>_t({configFilePath:T})),await new Promise(T=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${h}`),T()})}catch(v){v.message.includes("EADDRINUSE")?wN(n):b.error(`An unexpected error occurred while starting the server: ${v.message}`),process.exit(1)}}),b.info(`Desktop server is running at ${h}`);let f={type:"API_KEY",baseUrl:dr(),apiKey:r,logger:p,mode:"interactive"},S=async()=>{let T=pe();return new no(T.config.ai?.agentConfig,f)},y=async()=>new $o(f,await S()),E=new nt(f);hL({baseServer:m,getOrgId:async()=>xt(),generatorFactory:S,enricherFactory:y,cacheStorageFactory:async T=>{let v=pe(),x=await $r(p,E,v);return Wo({logger:p,orgId:T,client:E,gitMetadata:x,regenerateCache:a,alwaysSaveCache:s,noCache:c,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await mo(p))?.gitBranchName}catch(T){p.error({err:T},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let T=pe();return{ai:{},browser:{},...T.config}},storageFactory:async T=>new ui(E,T),logger:p,devicePixelRatio:i,authorization:f,globalE2eStateManager:Xm,visualDiffStorageFactory:async T=>new da(E)})}var RN="25mb";function d5(t,e,r){let n=AN();n.use(i5()),n.use(vN.json({limit:RN})),n.use(vN.urlencoded({extended:!1,limit:RN}));let o=l5();if(o.use("/tests",TN),o.use("/modules",gL),o.use("/environments",yL),o.use("/projects",yN),o.use("/folders",hS),o.use("/settings",bN),o.use("/identify",bL),o.use("/entities",SL),o.use("/on-demand-screenshots",SN),o.use("/mcp",gN),o.use("/git",wS),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&r.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&r.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}r.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),b.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
4824
|
-
${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),t){let a=AN.static(t,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(s,c)=>{c.sendFile(u5.join(t,"index.html"))})}let i=c5.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(wN(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}s5.setMaxListeners(25);process.on("warning",t=>{
|
|
4823
|
+
`).map(N=>N.trim()).filter(N=>N.length>0);h&&await qE(n,{completed:u.total,total:u.total},"Evaluating edits and generating edit status...",i,p,r);let G=await GY(B,l,i);r.addResult(JSON.stringify({additions:L.additions,deletions:L.deletions,summarization:G},null,2))}}),dN=[UY,FY,BY,VY];var pN=[...vL,...dN,...Ym];function KE(t,e){let r=new $Y({name:e.applicationName,version:e.cliVersion},{capabilities:{logging:{},tools:{}}});for(let n of pN)n.addToolToMcpServer(t,r);return r}async function mN(t,e,r,n){let o=new WY(r,e,n);return await t.connect(o),{close:async()=>{try{await t.close()}catch{}},transport:o}}var YE="mcp-session-id",JY="sessionId",Ys=XY(),pu=new Map;function hN(){let t={applicationName:"momentic-mcp-desktop-server",cliVersion:Qc??"0.0.0"},e=pe(),r=qe.child({orgId:xt(),userId:qo(),...t});return{context:{project:e,logger:r,saveChangesToDisk:!0},info:t}}Ys.get("/sse",async(t,e)=>{let{context:r,info:n}=hN(),o=KE(r,n),{transport:i}=await mN(o,e,"/api/mcp/sse",{enableDnsRebindingProtection:!1}),a=i.sessionId,s={transport:i,close:async()=>{pu.delete(a);try{await o.close()}catch(c){r.logger.warn({err:c},"Failed to close MCP server on SSE session cleanup")}}};pu.set(a,s),i.onclose=()=>{let c=pu.get(a);c&&c.close()}});Ys.post("/sse",async(t,e)=>{let r=String(t.query[JY]??"");if(!r||!pu.has(r)){e.status(400).send("Invalid or missing sessionId");return}await pu.get(r).transport.handlePostMessage(t,e,t.body)});var gN=Ys,yo={};Ys.post("/",async(t,e)=>{let r=String(t.headers[YE]??"");try{if(r&&yo[r]){await yo[r].handleRequest(t,e,t.body);return}if(!r&&KY(t.body)){let{context:n,info:o}=hN(),i=KE(n,o),a=new qY({sessionIdGenerator:()=>YY(),enableDnsRebindingProtection:!1,onsessioninitialized:s=>{yo[s]=a}});a.onclose=()=>{let s=a.sessionId;s&&yo[s]&&delete yo[s],i.close().catch(()=>{})},await i.connect(a),await a.handleRequest(t,e,t.body);return}e.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null})}catch{e.headersSent||e.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}});Ys.get("/",async(t,e)=>{let r=String(t.headers[YE]??"");if(!r||!yo[r]){e.status(400).send("Invalid or missing session ID");return}await yo[r].handleRequest(t,e)});Ys.delete("/",async(t,e)=>{let r=String(t.headers[YE]??"");if(!r||!yo[r]){e.status(400).send("Invalid or missing session ID");return}let n=yo[r];try{await n.handleRequest(t,e)}catch{e.headersSent||e.status(500).send("Error processing session termination")}});import{Router as QY}from"express";var fN=QY();fN.get("/:id",Ce(async(t,e)=>{let{id:r}=t.params;if(!r){e.status(400).json({error:"Missing ID"});return}let n=pp();if(!n){e.status(500).json({error:"API client not initialized"});return}try{let{data:o,contentType:i}=await n.fetchOnDemandScreenshot(r);e.setHeader("Content-Type",i),e.status(200).send(o)}catch(o){qe.error({err:o,screenshotId:r},"Failed to proxy on-demand screenshot"),e.status(404).json({error:"Screenshot not found"})}}));var SN=fN;import{Router as ZY}from"express";var lh=ZY();lh.get("/",Ce(async(t,e)=>{let r=(await bS()).map(n=>({name:n.config.name,configFilePath:n.configFilePath}));e.status(200).json(r)}));lh.get("/current",Ce((t,e)=>{let r=pe();if(!r){e.status(404).json({error:"No project found."});return}let n={name:r.config.name,configFilePath:r.configFilePath};e.status(200).json(n)}));lh.post("/set",Ce(async(t,e)=>{let r;try{r=YA.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}qe.info("Setting local project");try{let n=await _t({configFilePath:r.configFilePath});mp(n,o=>_t({configFilePath:o}))}catch(n){e.status(400).json({error:`Error setting project: ${n}`});return}e.sendStatus(204)}));var yN=lh;import{Router as e5}from"express";var EN=e5();EN.get("/",Ce((t,e)=>{let r=pe(),n={ai:r.config.ai,browser:r.config.browser,displayRoot:r.config.displayRoot};e.status(200).json(n)}));var bN=EN;import{streamText as t5}from"ai";import{Router as r5}from"express";import ch from"fs";import Xs from"path";import{v4 as n5}from"uuid";import o5 from"yaml";var mu=new Bp({platform:"local_app"},{flushAt:1,flushInterval:0});var Eo=r5();Eo.post("/",Ce(async(t,e)=>{let r;try{r=jA.parse(t.body)}catch(n){e.status(400).json({error:`Invalid request body: ${n}`});return}try{let n=pe(),o=await Jm({project:n,input:r});mu.track({type:"test_editor:test_create"}),e.status(201).json(o)}catch(n){if(n instanceof at){e.status(400).json({error:n.message});return}throw n}}));Eo.get("/:testPath",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=pe(),o=await ee(n),i;try{i=await mt(Xs.join(n.rootDir,r),qe,o),e.status(200).json(i)}catch(a){e.status(400).send({error:a.message});return}(async()=>{try{let{stepsToSave:a,moduleUpdates:s}=await st({stepLists:{steps:i.steps,beforeSteps:i.beforeSteps,afterSteps:i.afterSteps}});s.forEach(c=>{xr({content:c,schemaVersion:Me,momenticFiles:o,project:n})}),br({relativeTestPath:r,steps:a,schemaVersion:Me,project:n})}catch(a){qe.error({err:a},"Failed to save migrated test to disk after initial fetch")}})()}));Eo.get("/:testPath/metadata",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n=pe(),o=Xs.join(n.rootDir,r);if(!ch.existsSync(o)){e.status(404).json({error:"Test file not found."});return}let i=ch.statSync(o),a=await mo(qe),s={gitBranch:a.gitBranchName??"unknown",fileMtime:i.mtime,gitCommitSha:a.gitCommitSha??"unknown"};e.status(200).json(s)}));Eo.patch("/:testPath/metadata",Ce(async(t,e)=>{if(!t.params.testPath){e.status(400).json({error:"Missing testPath in url path."});return}let r;try{r=GA.parse(t.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let o={message:"ok",newRelativeTestPath:gS(t.params.testPath,r,pe()).newRelativeTestPath};e.status(200).json(o)}));Eo.patch("/:testPath",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=HA.parse(t.body)}catch(m){qe.warn({err:m},"Invalid save request"),e.status(400).json({error:`Invalid request body: ${m}`});return}qe.info({testPath:r},"Save received");let o=pe(),i=await ee(o),a;try{a=Ec(r,o)}catch(m){e.status(400).json({error:`Existing test file on disk is invalid: ${m}`});return}let{stepsToSave:s,moduleUpdates:c,cachesToSave:l}=await st({stepLists:n.stepLists,cacheCreationParams:{testId:a.id,orgId:xt()}}),u=new nt({apiKey:wr(),baseUrl:dr(),logger:qe}),d=await $r(qe,u,o);await Wo({logger:qe,orgId:xt(),client:u,gitMetadata:d,regenerateCache:!1,alwaysSaveCache:!1,noCache:!1,bustOldestCachePercentage:void 0}).saveStepCacheEntries({logger:qe,testId:a.id,entries:l}),c.forEach(m=>{xr({content:m,schemaVersion:n.schemaVersion,momenticFiles:i,project:o})}),br({relativeTestPath:r,steps:s,schemaVersion:n.schemaVersion,project:o}),e.status(201).json({message:"ok"})}));Eo.patch("/:testPath/environments",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=KA.parse(t.body)}catch(o){e.status(400).json({error:`Invalid request body: ${o}`});return}gS(r,{envs:n.defaultEnv?[{name:n.defaultEnv,default:!0}]:[]},pe()),e.status(201).json({message:"ok"})}));Eo.post("/:testPath/duplicate",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let n;try{n=VA.parse(t.body)}catch(f){e.status(400).json({error:`Invalid request body: ${f}`});return}try{Po(n.name)}catch(f){e.status(400).json({error:f.message});return}let o=pe(),i=Xs.join(o.rootDir,r);if(!ch.existsSync(i)){e.status(404).json({error:"Test not found."});return}let a=await ee(o),s;try{s=await mt(i,qe,a)}catch(f){e.status(400).send({error:f.message});return}let c=n5(),l=jr.parse({...s,name:n.name,id:c}),{stepsToSave:u}=await st({stepLists:{steps:s.steps,beforeSteps:s.beforeSteps,afterSteps:s.afterSteps},createNewCacheIds:!0,cacheCreationParams:{testId:c,orgId:xt()}}),d=Dn({fileType:ye.TEST,...l,beforeSteps:u.beforeSteps??void 0,steps:u.steps,afterSteps:u.afterSteps??void 0}),p=Xs.dirname(i),m=Xs.join(p,`${n.name}.test.yaml`),h=o5.stringify(d);ch.writeFileSync(m,h,"utf-8");let g={relativeFilePath:Xs.relative(o.rootDir,m)};mu.track({type:"test_editor:test_create"}),e.status(201).json(g)}));Eo.post("/:testPath/chat",Ce(async(t,e)=>{let{testPath:r}=t.params;if(!r){e.status(400).json({error:"Missing testPath in url path."});return}let{messages:n}=t.body;if(!n){e.status(400).json({error:"Missing messages in request body."});return}let{sessionId:o}=t.body;if(!o){e.status(401).json({error:"Missing sessionId in request body."});return}let i=Xm.getSession(o);if(!i){e.status(400).json({error:"No active browser session. Start a session first."});return}let a=pe(),s=Ec(r,a),c=qe.child({orgId:xt(),userId:qo(),applicationName:"momentic-desktop-server-copilot",testId:s.id,sessionId:o});c.debug({sessionId:o},"Initializing copilot with sessionId");let l=ah({testPath:r,messages:n,logger:c,session:i,sessionId:o,saveChangesToDisk:!1});t5(l).pipeUIMessageStreamToResponse(e,{onError:d=>{let p=d instanceof Error?d.message:String(d);return c.error({err:d,sessionId:o},"streamText session failed"),p}})}));var TN=Eo;async function CN(t){let{momenticServerUrl:e,apiKey:r,serverPort:n,staticDir:o,devicePixelRatio:i,regenerateCache:a,alwaysSaveCache:s,noCache:c,initialProject:l}=t;e&&Hw(e),await jw(r);let u=xt(),d=qo();mu.identify({user_id:d,org_id:u});let p=t.logger??qe;p=p.child({orgId:u,userId:d}),p.debug({params:t},"Desktop server init and api key check done");let m=d5(o,n,p),h=`http://localhost:${n}`;mp(l,T=>_t({configFilePath:T})),await new Promise(T=>{try{m.listen(n,()=>{p.info(`Desktop server is running at ${h}`),T()})}catch(v){v.message.includes("EADDRINUSE")?wN(n):b.error(`An unexpected error occurred while starting the server: ${v.message}`),process.exit(1)}}),b.info(`Desktop server is running at ${h}`);let f={type:"API_KEY",baseUrl:dr(),apiKey:r,logger:p,mode:"interactive"},S=async()=>{let T=pe();return new no(T.config.ai?.agentConfig,f)},y=async()=>new $o(f,await S()),E=new nt(f);hL({baseServer:m,getOrgId:async()=>xt(),generatorFactory:S,enricherFactory:y,cacheStorageFactory:async T=>{let v=pe(),x=await $r(p,E,v);return Wo({logger:p,orgId:T,client:E,gitMetadata:x,regenerateCache:a,alwaysSaveCache:s,noCache:c,bustOldestCachePercentage:void 0})},branchGetter:async()=>{try{return(await mo(p))?.gitBranchName}catch(T){p.error({err:T},"Failed to get environment git metadata");return}},settingsFactory:async()=>{let T=pe();return{ai:{},browser:{},...T.config}},storageFactory:async T=>new ui(E,T),logger:p,devicePixelRatio:i,authorization:f,globalE2eStateManager:Xm,visualDiffStorageFactory:async T=>new da(E)})}var RN="25mb";function d5(t,e,r){let n=AN();n.use(i5()),n.use(vN.json({limit:RN})),n.use(vN.urlencoded({extended:!1,limit:RN}));let o=l5();if(o.use("/tests",TN),o.use("/modules",gL),o.use("/environments",yL),o.use("/projects",yN),o.use("/folders",hS),o.use("/settings",bN),o.use("/identify",bL),o.use("/entities",SL),o.use("/on-demand-screenshots",SN),o.use("/mcp",gN),o.use("/git",wS),n.use("/api",o),n.use((a,s,c)=>{a.path!=="/healthcheck"&&!a.path.startsWith("/assets")&&r.debug({url:a.url,path:a.path,query:a.query,method:a.method,body:a.body,headers:a.rawHeaders,client:a.ip},"Received desktop-server request"),s.on("close",()=>{s.statusCode>=400&&r.error({url:a.url,method:a.method,statusCode:s.statusCode},"Request completed in error")}),c()}),n.use((a,s,c,l)=>{if(a instanceof Error&&a.message.includes("BadRequestError: request aborted")){c.status(400).send("Client disconnected");return}r.error({stack:a.stack,msg:a.message,err:a,url:s.url,method:s.method},"Unhandled exception leading to 500 on desktop-server"),b.error(`Oh no! We seem to have hit an unexpected snag \u{1F61E}. Please contact Momentic Support with the following error: ${a.message}
|
|
4824
|
+
${a.stack}`),c.status(500).send(`Internal Server Error: ${a.message}`)}),t){let a=AN.static(t,{setHeaders:s=>{s.setHeader("Cache-Control","no-cache")},redirect:!1});n.use(a),n.use("*",(s,c)=>{c.sendFile(u5.join(t,"index.html"))})}let i=c5.createServer(n);return i.once("error",a=>{"code"in a&&a.code==="EADDRINUSE"?(wN(e),process.exit(1)):console.error("An unexpected server error occurred:",a.message)}),i}s5.setMaxListeners(25);process.on("warning",t=>{qe.warn({err:t},`Node warning received on desktop-server: ${t.message}`)});process.on("uncaughtException",t=>{qe.error({err:t},"Uncaught exception on desktop-server"),b.error(`Oh no! The Momentic desktop app encountered a fatal error \u{1F61E}. Error logs: ${t.message}`)});process.on("unhandledRejection",(t,e)=>{qe.error({reason:`${t}`,stack:t?.stack},"Uncaught exception on desktop-server (promise rejection)"),b.error(`Oh no! The Momentic desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${t}`)});function wN(t){b.error(a5`Port ${t} is already in use by another process. Please close the other process and try again.
|
|
4825
4825
|
Using Bash on MacOS or Linux:
|
|
4826
4826
|
lsof -t -i :58888 | xargs kill -9
|
|
4827
4827
|
|
|
@@ -4840,7 +4840,7 @@ ${t.map(p=>`${pt}- ${p}`).join(`
|
|
|
4840
4840
|
`)}`),Object.values(e.tests).forEach(p=>{t.some(m=>p.relativePath.includes(m))&&c.add(p.fullFilePath)}))}else{!n&&!await Bt("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let u=Object.values(e.tests);s.info(`Reading all ${u.length} tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of c){let d=db.relative(r.rootDir,u);o&&!o.some(p=>new RegExp(p).test(d))&&c.delete(u),i&&i.some(p=>new RegExp(p).test(d))&&c.delete(u)}let l=Array.from(c).map(async u=>{try{let d=await mt(u,Y,e);if(R5.gt(d.schemaVersion,Me)&&s.warn(`Test ${u} has schema version ${d.schemaVersion}, which is greater than what is currently supported by this SDK. Please update your momentic package version to avoid unexpected behavior.`),a&&a.length>0){let p=d.labels||[];if(!a.some(h=>p.includes(h)))return null}return{...d,fullFilePath:u,relativeFilePath:db.relative(r.rootDir,u)}}catch(d){s.error(`Failed to read and resolve test at '${u}': ${d}`),process.exit(1)}});return Promise.all(l).then(v5)}function oD({testDefinitions:t,quarantinedTestReasons:e,onlyQuarantined:r=!1,skipQuarantined:n=!1}){if(r){let[u,d]=yh(t,h=>h.id in e),[p,m]=yh(u,h=>h.disabled||n);return{testsToSkip:p,quarantinedTestsToSkip:[],testsToRun:m,quarantinedTestsToRun:[]}}let[o,i]=yh(t,u=>u.disabled),[a,s]=yh(i,u=>u.id in e);return{testsToSkip:o,testsToRun:s,quarantinedTestsToRun:n?[]:a,quarantinedTestsToSkip:n?a:[]}}function iD({testsToRun:t,quarantinedTestsToRun:e,quarantinedTestReasons:r,testInputMatrix:n}){let o=[],i=(a,s,c)=>{n?n.forEach((l,u)=>{o.push({inputs:l,inputIndex:u,testDefinition:a,quarantined:s,quarantinedReason:c})}):o.push({inputs:void 0,testDefinition:a,quarantined:s,quarantinedReason:c})};return t.forEach(a=>i(a,!1)),e.forEach(a=>i(a,!0,r[a.id])),o}async function aD({project:t,apiClient:e}){let r=await ee(t),n=await Js({tests:[],momenticFiles:r,yes:!0,project:t,logger:new Bi(40,{})}),o=(await e.getQuarantinedTests()).quarantined,i=new Set(o.map(s=>s.testId)),a=n.filter(s=>i.has(s.id));b.info(a.map(s=>s.relativeFilePath).join(`
|
|
4841
4841
|
`))}async function sD({test:t,reason:e,apiClient:r,project:n,identity:o}){let i=(await ee(n)).tests,a=Object.values(i),s=(await r.getQuarantinedTests()).quarantined,c=new Set(s.map(p=>p.testId)),l=a.filter(p=>c.has(p.id)),u=await fh({prompt:"Select a test to unquarantine.",inputtedTest:t,testOptions:l}),d=await Sh({prompt:"Enter a reason for unquarantining the test.",inputtedReason:e});await r.unquarantineTest(u,d,o),b.success(`Test ${u.name} has been successfully removed from quarantine.`)}function lD(t){return t?He(t):"Unknown suite"}async function cD({client:t,orgId:e,suitePaths:r,wait:n,waitTimeout:o,...i}){let{suiteRunIds:a,runGroupIds:s}=await t.queueSuiteRuns({paths:r,...i});Y.info({orgId:e,suiteRunIds:a,runGroupIds:s,suitePaths:r},"Queued suites remotely"),b.dimmed(`Queued ${r.length} suites.`),n||process.exit(0);let c=Date.now();b.dimmed(`Waiting for ${r.length} suites to finish. You can view results upon completion at:`);for(let f of s)b.dimmed(`${pt}- ${t.getAppUrl()}/run-groups/${f}`);let l=new Set,u=[],d=f=>(f.status==="FAILED"||f.status==="PASSED"||f.status==="CANCELLED")&&f.runs.every(y=>y.status==="FAILED"&&(y.failureReason||y.finishedAt&&Date.now()-y.finishedAt.getTime()>30*1e3)||y.status==="PASSED"||y.status==="CANCELLED"),p=await kd({name:"suites",getResults:async()=>{let f=s.filter(E=>!u.some(T=>T.id===E)),S=await t.bulkGetRunGroupStatus(f),y=[];for(let E of S)d(E)?u.push(E):y.push(E);return[...u,...y]},timeoutMs:o?o*1e3:void 0,checkDone:f=>(f.forEach(S=>{S.status==="RUNNING"&&(l.has(S.id)||(l.add(S.id),b.log(`${l.size}/${s.length} ${lD(S.suite?.name)}`)))}),f.every(d))}),m=t.getAppUrl(),g=ss({results:p,startTime:c,onFailed:f=>{let S=lD(f.suite?.name),y=f.runs.filter(T=>T.status==="FAILED").length,E=f.runs.length;b.error(`${S} (${y}/${E} tests failed):`);for(let T of f.runs)if(T.status==="FAILED"){let v=T.testName||T.test?.name;b.error(` ${v?He(v):"Unknown test"} (${m}/runs/${T.id})`)}},entity:"suite",getDisplayLine:f=>` ${f.suite?.name?He(f.suite.name):"Unknown suite name"} (${m}/run-groups/${f.id})`});process.exit(g.failed>0?1:0)}async function uD({tests:t,client:e,orgId:r,...n}){!n.yes&&!await Bt(`This command will queue ${t.length} tests to run remotely on Momentic's infrastructure. Results will be available on ${e.getAppUrl()}. Continue?`)&&process.exit(1);let{queuedTests:o,runIds:i}=await e.queueTests({testPaths:t,...n});if(Y.info({queuedTests:o,runIds:i,orgId:r},"Queued tests remotely"),b.dimmed(`Queued ${o.length} tests. Processing time may depend on a variety of factors, including how many tests have already been queued from your organization.`),n.wait||process.exit(0),!i.length)return;b.dimmed(`Waiting for ${o.length} tests to complete.`);let a=new Set,s=[],c=m=>m.status==="FAILED"&&m.failureReason||m.status==="PASSED"||m.status==="CANCELLED",l=e.getAppUrl(),u=Date.now(),d=await kd({name:"runs",getResults:async()=>{let m=i.filter(f=>!s.some(S=>S.id===f)),h=await e.bulkGetRunStatus(m),g=[];for(let f of h)c(f)?s.push(f):g.push(f);return[...s,...g]},timeoutMs:n.waitTimeout?n.waitTimeout*1e3:void 0,checkDone:m=>(m.forEach(h=>{if(h.status==="RUNNING"&&!a.has(h.id)){a.add(h.id);let g=h.testName||h.test?.name;g&&b.log(`${a.size}/${o.length} ${He(g)}`)}}),m.every(c))}),p=ss({results:d,startTime:u,onFailed:m=>{let h=m.testName||m.test?.name;Fd(m,h?He(h):"Unknown test")},getDisplayLine:m=>{let h=m.testName||m.test?.name,g=` ${h?He(h):"Unknown test"}`;return m.id&&(g+=` (${l}/runs/${m.id})`),g},entity:"test"});process.exit(p.failed>0?1:0)}import{randomUUID as u4}from"crypto";import d4 from"fs";import{existsSync as U5,mkdirSync as B5,statSync as z5}from"fs";import{randomUUID as Ea}from"crypto";import Qs,{writeFileSync as dD}from"fs";import{hostname as C5}from"os";import Yn from"path";import{z as Eh}from"zod";async function Th(t,e,r,n){if(n){let o=await e.getScreenshot(t,n);if(o){let i=`screenshot-${n}.jpeg`,a=Yn.join(r,i);return Qs.writeFileSync(a,o),i}}}async function w5(t,e,r,n){let o=r.folder,i={uuid:n.runAttemptId??Ea(),historyId:n.runId??Ea(),testCaseId:n.test.id,fullName:n.test.name,name:He(n.test.name),status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"skipped":"failed",start:n.lastAttemptStartedAt.getTime(),stop:n.finishedAt.getTime(),parameters:[],labels:[{name:"suite",value:r.suiteName},{name:"host",value:C5()},{name:"platform",value:"momentic"},{name:"attempts",value:n.attempts.toString()}],steps:[]};n.runId&&i.labels?.push({name:"runUrl",value:`https://app.momentic.ai/runs/${n.runId}`});for(let[c,l]of Object.entries(n.parameters))l!=null&&i.parameters.push({name:c,value:JSON.stringify(l)});n.results&&await pb(t,e,r.folder,i.steps,n.results);let a=x5(e,o,i.uuid);a.length>0&&(i.attachments=a);let s=`${n.runAttemptId}-result.json`;Qs.writeFileSync(Yn.join(o,s),JSON.stringify(i,void 0,2))}async function bh(t,e,r,n){let o={name:fw(n),start:n.startedAt.getTime(),stop:n.finishedAt.getTime(),status:n.status==="SUCCESS"?"passed":n.status==="CANCELLED"?"skipped":"failed",labels:[],steps:[],attachments:[]};n.beforeUrl&&o.labels?.push({name:"URL before step",value:n.beforeUrl}),n.afterUrl&&o.labels?.push({name:"URL after step",value:n.afterUrl});let i=await Th(t,e,r,n.beforeSnapshot);i&&o.attachments.push({name:"Screenshot before step",source:i,type:"image/jpeg"});let a=await Th(t,e,r,n.afterSnapshot);if(a&&o.attachments.push({name:"Screenshot after step",source:a,type:"image/jpeg"}),n.message&&(o.statusDetails={message:n.message}),n.data)if(hl.safeParse(n.data).success){let s=hl.parse(n.data),c=s.request,l={...s,request:void 0},u=`output-attachment-api-request-${Ea()}.json`,d=`output-attachment-api-response-${Ea()}.json`,p=Yn.join(r,u),m=Yn.join(r,d);Qs.writeFileSync(p,JSON.stringify(c,null,2)),Qs.writeFileSync(m,JSON.stringify(l,null,2)),o.attachments.push({name:"API request details",source:u,type:"application/json"}),o.attachments.push({name:"API response details",source:d,type:"application/json"})}else{let s=Eh.union([Eh.object({}).passthrough(),Eh.array(Eh.any())]).safeParse(n.data).success,c=`output-attachment-${Ea()}.json`,l=Yn.join(r,c);Qs.writeFileSync(l,JSON.stringify(n.data,null,2)),o.attachments.push({name:"Step output data",source:c,type:s?"application/json":"text/plain"})}return o}async function pb(t,e,r,n,o){for(let i of o){let a;switch(i.type){case"PRESET_ACTION":{a=await bh(t,e,r,i);break}case"CONDITIONAL":{a=await bh(t,e,r,i),a.steps=[],i.assertionResult&&a.steps.push(await bh(t,e,r,i.assertionResult)),await pb(t,e,r,a.steps,i.results);break}case"AI_ACTION_DYNAMIC":case"AI_ACTION":case"SECTION":case"MODULE":{if(a=await bh(t,e,r,i),await pb(t,e,r,a.steps,i.results),i.type==="MODULE"&&i.inputs){a.parameters=[];for(let[s,c]of Object.entries(i.inputs))a.parameters.push({name:s,value:c})}break}default:{let s=i}}if(!a){t.warn({result:i},"Failed to convert Momentic result to Allure step");continue}if(a.attachments||(a.attachments=[]),i.beforeTestContext){let s=`before-context-${Ea()}.json`,c=Yn.join(r,s);dD(c,pD(i.beforeTestContext.env)),a.attachments.push({name:"Test context before step",source:s,type:"application/json"})}if(i.afterTestContext){let s=`after-context-${Ea()}.json`,c=Yn.join(r,s);dD(c,pD(i.afterTestContext.env)),a.attachments.push({name:"Test context after step",source:s,type:"application/json"})}n.push(a)}}async function mD(t,e,r,n,o){for(let i of o){if(!i.runId||!i.runAttemptId)throw new Error(`Missing runId/runAttemptId for Allure report generation for test '${i.test.name}'`);let a=e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId);try{await w5(t,a,{folder:r,suiteName:n.suiteName},i)}finally{a.close()}}}function pD(t){try{return JSON.stringify(t,void 0,2)??JSON.stringify({value:null},void 0,2)}catch(e){let r=e instanceof Error?e.message:"unknown error";return JSON.stringify({error:r},void 0,2)}}function x5(t,e,r){let n=t.listVideoAssetPaths();if(n.length===0)return[];let o=[];for(let i of n){let a=Yn.basename(i),s=a,c=Yn.join(e,s);try{Qs.copyFileSync(i,c)}catch{continue}let l,u=Yn.extname(i).toLowerCase();u===".webm"?l="video/webm":u===".mp4"?l="video/mp4":l="application/octet-stream",o.push({name:a,source:s,type:l})}return o}import _5 from"junit-report-builder";import vh from"path";function M5(t,e){if(e.name(t.testName).className(t.testName).file(vh.relative(".",t.filePath)).property("id",t.testId).property("dd_tags[id]",t.testId),t.labels&&(e.property("labels",t.labels.join(",")),t.labels.forEach(r=>{e.property("dd_tags[label]",r)})),t.baseUrl&&(e.property("base_url",t.baseUrl),e.property("dd_tags[base_url]",t.baseUrl)),t.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${t.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${t.runId}`)),t.quarantined&&(e.property("quarantined","true"),e.property("dd_tags[quarantined]","true"),t.quarantinedReason&&(e.property("quarantined_reason",t.quarantinedReason),e.property("dd_tags[quarantined_reason]",t.quarantinedReason))),t.setupFailed&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),t.mainFailed&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),t.teardownFailed&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),t.status==="FAILED"){if(t.failureReason){let r=Uu[t.failureDetails?.classification?.reason||t.failureReason],n=t.failureDetails?.classification?.summary||Da[t.failureReason];t.runId&&(n+=` Visit https://app.momentic.ai/runs/${t.runId} for more details.`),e.failure(n,r)}t.failureDetails?.errorStack&&e.stacktrace(t.failureDetails.errorStack)}else t.status==="CANCELLED"&&e.skipped();return e.time((t.finishedAt.getTime()-t.lastAttemptStartedAt.getTime())/1e3).property("started_at",t.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",t.lastAttemptStartedAt.toISOString()).property("finished_at",t.finishedAt.toISOString()).property("dd_tags[finished_at]",t.finishedAt.toISOString()),e.property("attempts",t.attempts.toString()).property("dd_tags[attempts]",t.attempts.toString()),t.parameters?.envName&&(e.property("environment",t.parameters.envName),e.property("dd_tags[environment]",t.parameters.envName)),t.parameters?.urlOverride&&e.property("url_override",t.parameters.urlOverride),e}function I5(t,e,r){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:c,quarantinedTestReasons:l}=e,u=t.testSuite().name(o);n&&u.property("id",n),u.timestamp(i).property("startedAt",i.toISOString()).property("finishedAt",a.toISOString()).time((a.getTime()-i.getTime())/1e3);for(let d of r){let p=u.testCase();M5(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(vh.relative(".",d.relativeFilePath)).property("id",d.id),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(m=>{p.property("dd_tags[label]",m)})),p.skipped()}for(let d of c){let p=u.testCase();p.name(d.name).className(d.name).file(vh.relative(".",d.relativeFilePath)).property("id",d.id).property("quarantined","true");let m=l[d.id];m&&p.property("quarantinedReason",m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(h=>{p.property("dd_tags[label]",h)})),p.skipped()}return u}function hD(t,e,r){let n=_5.newBuilder();I5(n,e,r),n.writeTo(vh.join(t,`${e.suiteName}.xml`))}import P5 from"fs";import O5 from"path";function gD(t){return{title:lo(t),duration:t.finishedAt.getTime()-t.startedAt.getTime(),error:t.status==="FAILED"?{value:t.failureReason}:void 0,steps:t.results&&t.type!=="PRESET_ACTION"?t.results.map(gD):[]}}async function L5(t,e,r,n){if(n.results?.length){let o=await Th(t,e,r,n.results[n.results.length-1].afterSnapshot);return o?[{name:"Final state screenshot",path:o,contentType:"image/jpeg"}]:[]}return[]}async function N5(t,e,r,n){return{status:n.status==="PASSED"?"passed":n.status==="CANCELLED"?"interrupted":"failed",duration:n.finishedAt.getTime()-n.lastAttemptStartedAt.getTime(),error:n.status==="FAILED"&&n.failureReason?{value:n.failureDetails?.classification?.reason||n.failureReason,message:n.failureDetails?.classification?.summary||Da[n.failureReason]}:void 0,retry:n.attempts-1,steps:n.results?.map(gD)||[],startTime:n.lastAttemptStartedAt.toISOString(),attachments:await L5(t,e,r,n)}}async function D5(t,e,r,n){return{expectedStatus:"passed",status:n.status==="PASSED"?"expected":"unexpected",results:[await N5(t,e,r,n)]}}async function k5(t,e,r,n){return{tags:[],title:n.test.name,ok:n.status==="PASSED",tests:[await D5(t,e,r,n)],id:n.runId,file:n.filePath}}function mb(t,e){return t.reduce((r,n)=>e(n)?r+1:r,0)}async function F5(t,e,r,n,o){return{suites:[{title:n.suiteName,file:n.projectConfigPath,specs:await Promise.all(o.map(async i=>{let a=i.runId&&i.runAttemptId?e.createDebugDataReaderForRunAttempt(i.runId,i.runAttemptId):new Jl;try{return await k5(t,a,r,i)}finally{a.close()}}))}],errors:[],stats:{startTime:n.startedAt.toISOString(),duration:n.finishedAt.getTime()-n.startedAt.getTime(),expected:mb(o,i=>i.status==="PASSED"),unexpected:mb(o,i=>i.status!=="PASSED"),flaky:mb(o,i=>!!i.isFlake),skipped:0}}}async function fD(t,e,r,n,o){let i=await F5(t,e,r,n,o);P5.writeFileSync(O5.join(r,`${n.suiteName}.json`),JSON.stringify(i,null,2))}function H5(t){return{testName:t.test.name,testId:t.test.id,filePath:t.filePath,labels:t.test.labels,baseUrl:t.baseUrl,runId:t.runId,quarantined:t.quarantined,quarantinedReason:t.quarantinedReason,status:t.status,setupFailed:void 0,mainFailed:void 0,teardownFailed:void 0,failureDetails:t.failureDetails,failureReason:t.failureReason,finishedAt:t.finishedAt,lastAttemptStartedAt:t.lastAttemptStartedAt,attempts:t.attempts,parameters:t.parameters}}async function SD({logger:t,callbacks:e,format:r,params:n,runs:o,folder:i}){switch(U5(i)?z5(i).isDirectory()||(b.error(`The specified reporter output directory '${i}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(b.info(`Reporter output directory '${i}' does not exist on disk, creating it now...`),B5(i,{recursive:!0})),r){case"junit":{let a=o.map(H5);hD(i,n,a);return}case"allure":case"allure-json":await mD(t,e,i,n,o);return;case"playwright-json":await fD(t,e,i,n,o);return;default:throw new Error(`Unknown reporter format requested: '${r}'`)}}import p4 from"wait-on";import{execSync as G5}from"child_process";import{platform as j5}from"os";function hb(){return yD()?(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.
|
|
4842
4842
|
`),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.
|
|
4843
|
-
`),1)}function yD(){return j5()==="darwin"&&G5("system_profiler SPDisplaysDataType").toString().includes("Retina")}function gb(t){yD()&&t===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 V5 from"@actions/exec";import $5 from"@actions/io";import W5 from"quote";import q5 from"string-argv";async function ED(t,e=!0){let r=q5(t),n=await $5.which(r[0],!0),o=r.slice(1),i=V5.exec(W5(n),o,{delay:100});if(e)return i}import K5 from"csv-parser";import{createReadStream as Y5}from"fs";function fb(t){return new Promise((e,r)=>{let n=[];Y5(t).pipe(K5()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import Zs from"semver";import{z as Ah}from"zod";var Lr="2.33.2",X5="https://registry.npmjs.org/momentic",J5=Ah.object({versions:Ah.record(Ah.string(),Ah.unknown()).optional()});async function tr(t){try{await Q5(t)}catch(e){b.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Sb(){let t=await V(fetch(X5),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=J5.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=Lr;for(let o of Object.keys(r))Zs.valid(o)&&Zs.major(o)===Zs.major(Lr)&&Zs.gt(o,n)&&Zs.prerelease(o)===null&&(n=o);return n}async function Q5(t){let e;for(let r=0;r<2;r++)try{e=await Sb()}catch(n){t.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){t.warn("Failed to fetch npm registry data. Skipping version check.");return}Zs.eq(Lr,e)||(b.warn(`Update available: v${Lr} -> v${e}`),b.warn("This version may be missing critical fixes, features, and security updates."),b.warn('Run "npx momentic@latest upgrade" to update'))}async function bo(){try{await V(Promise.all([TC(),kt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Z5}from"lodash-es";function Rh(t){return t.length===1?"test":"tests"}function bD(t){return t===1?"1 worker":`${t} workers`}function TD(t){t.length!==0&&(b.info(`Skipping ${t.length} disabled ${Rh(t)}:`),t.forEach(e=>{b.info(`${pt}- ${[e.relativeFilePath]}`)}),b.log(""))}function vD(t,e){t.length!==0&&(b.info(`Skipping ${t.length} quarantined ${Rh(t)}:`),t.forEach(r=>{b.info(`${pt}- ${[r.relativeFilePath]}: ${e[r.id]}`)}),b.log(""))}function e4(t,e){t.length!==0&&(b.info(`Running ${t.length} quarantined ${Rh(t)} with ${bD(e)}:`),t.forEach(r=>{b.info(`${pt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),b.log(""))}function t4(t,e,r){e.length===0&&t.length>0||(b.info(`Running ${e.length} ${Rh(e)} with ${bD(r)}:`),e.forEach(n=>{b.info(`${pt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),b.log(""))}function AD({logger:t,localTestsToRunWithInputs:e,parallel:r,shardCount:n,shardIndex:o}){t.info({tests:e.length,shardCount:n,shardIndex:o,parallel:r},"Running local tests");let[i,a]=Z5(e,s=>s.quarantined);e4(i,r),t4(i,a,r)}import{randomUUID as r4}from"crypto";import{cloneDeep as el}from"lodash-es";async function RD({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await mr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function CD({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:h,aiSettings:g,visualDiffScreenshotStorage:f,tracer:S}){let y=await Hm({settings:h,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),E={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:Y,mode:"runner"},T=Ku({browserType:y.browserType,orgDefaultBrowserType:h.defaultBrowserType});if(!CC(T)){let _=`Browser ${T} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;b.warn(_),Y.warn(_)}let v=await Yr.init({baseUrl:t,logger:d,userBrowserSettings:y,storage:a,enricher:new $o(E,c),contextArgs:{viewport:i.advanced.viewport??Kt,locale:i.advanced.locale??Lo,geolocation:i.advanced.geolocation??Do,timezoneId:i.advanced.timezone??No,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:_=>S.onNetworkPage(_),onNetworkLogs:_=>S.onNetworkLogs(_)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:_})=>{S.setActiveVideo(_)}}:void 0}),x=new li({browser:v,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:y.slowMoMs,autoFollowNewTabs:y.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),C=new lr({baseUrl:t,currentUrl:x.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async _=>{let{name:L,defaultValue:B,required:G}=_,N=m?.[L];G&&N===void 0&&(b.error(`Required parameter '${L}' is required by test '${i.name}' but not provided`),process.exit(1));let k=await mr({orgId:l,s:N??B,localTools:s,logger:d,context:lr.dummyContext(C.getEnvName())});C.setMomenticSystemVariable(L,k)})),{controller:x,context:C}}async function wD({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!zi){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return r.warn(n),b.warn(n),!1}return!0}async function xD({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let h={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},g={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await wD({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await zm({fixtures:h,inputs:g,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function _D(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await n4(t)}catch(o){let i="Fatal error running test";return b.error(`${i}: ${o.message}`),r.error({err:o},i),{results:[],parameters:t,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function n4(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:c,cacheOptions:l,runId:u,testInputs:d,quarantined:p,quarantinedReason:m,usageTracker:h}=t,g=new ls(n,o),f=Wo({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,bustOldestCachePercentage:l.bustOldestCachePercentage}),S=await Kd({cacheStorage:f,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),y=S.steps,E=S.beforeSteps??void 0,T=S.afterSteps??void 0,v=t.envName??i4(e),x,C={};if(v){try{x=Ki(v,r,s)}catch(N){let k=`Failed to resolve environment ${v} for test ${e.name}: ${N}`;throw new Error(k)}C=x.variables}let _=e.baseUrl;if(i)_=i;else if(!_){let N=C[At];typeof N=="string"&&(_=N)}if(!_){let N=`Cannot run test with no base URL and no ${At} variable defined in its environment`;throw new Error(N)}let L=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testDescription:e.description??void 0,testLabels:e.labels,baseUrl:_,environmentName:v,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m}),B=s.child(L.loggerBindings||{});Object.entries(L.envVarBindings||{}).forEach(([N,k])=>{C[N]=k});let G=await o4({...t,variables:C,envName:v,resolvedEnv:x,baseUrl:_,storageClient:g,tracer:L,logger:B,cacheStorage:f,stepsWithCaches:y,beforeStepsWithCaches:E,afterStepsWithCaches:T,usageTracker:h});return await L.finish({logger:s,status:G.status,finishedAt:G.finishedAt,failureDetails:G.failureDetails,failureReason:G.failureReason,isFlake:G.isFlake,failureRecoveryDetails:G.failureRecoveryDetails}),{runId:L.runId,...G}}async function o4(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:h,testInputs:g,variables:f,resolvedEnv:S,retriesOverride:y,devicePixelRatio:E,logUpdate:T,tracer:v,logger:x,cacheStorage:C,gitMetadata:_,quarantined:L,quarantinedReason:B,usageTracker:G}=t,N=i.config.ai?.aiFailureAnalysis??!1,k=new Date,q=new vs(i,s,a),$={...i.config},he={envName:p,urlOverride:m,customHeaders:h,testInputs:g},K,tt=Math.abs(y??i.config.retries??e.retries??0),De=[];x.info({..._,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let ft=0;ft<=tt;ft++){let rr=r4(),je=await v.startAttempt(rr),se=x.child(je.loggerBindings||{}),Je={...e,steps:el(r),beforeSteps:el(n),afterSteps:el(o)};ft!==0&&T("RETRY",`attempt ${ft+1}/${tt+1}`);let nn=new Date,Ta=$.advanced?.fakerConstantSeed,tl=new Nn({httpClient:new zt({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:se,mode:"runner"}),fakerSeed:Ta?rs:void 0}),xh=je;try{let{controller:nr,context:on}=await CD({tracer:je,baseUrl:l,envName:p,testName:Je.name,apiClient:s,devicePixelRatio:E,logger:se,storageClient:u,codeEvalTools:tl,test:Je,generator:c,orgId:d,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Je.advanced},aiSettings:{...i.config.ai||{},...Je.advanced||{}},visualDiffScreenshotStorage:q});K=await xD({attemptMetadata:{attemptNumber:ft+1,orgId:d,runId:v.runId},attemptFixtures:{logger:se,storageClient:u,usageTracker:G,codeEvalTools:tl,apiClient:s,context:on,controller:nr,tracer:je},attemptInputs:{test:Je,orgSettings:$}});let fi=new Date,An={logger:x,cacheStorage:C,orgId:d,testId:e.id,originalStepsWithCaches:{steps:el(r),beforeSteps:el(n),afterSteps:el(o)},updatedStepsWithCaches:{steps:Je.steps,beforeSteps:Je.beforeSteps,afterSteps:Je.afterSteps}};K?.status==="PASSED"?await ep(An):K?.status==="FAILED"&&ft===tt&&await tp(An),await je.finish({logger:se,result:K}),De.unshift(K.status);let X=await RD({orgId:d,codeEvalTools:tl,logger:se,outputDefinitions:e.outputs??[],testContext:on}),To=Mv(De),va=ft+1;if(K.status!=="FAILED")return{...K,runAttemptId:rr,parameters:he,test:Je,filePath:Je.relativeFilePath,startedAt:k,lastAttemptStartedAt:nn,finishedAt:fi,attempts:va,baseUrl:l,outputs:X,isFlake:To,quarantined:L,quarantinedReason:B};let rl=K.failedStepResult,Rn=rl?.message||"Unknown failure",vo=rl?.failureReason??DT(Rn)??"UnknownError",Aa=se.child({failureReason:vo,errorMessage:Rn,numAttempts:(tt+1).toString(),name:Je.name});if(ft<tt){Aa.warn(`Retrying failed execution attempt for run: ${Rn}`);continue}Aa.error(`Test failed after all exhausting attempts: ${Rn}`);let Ao=new Error(Rn),_h={errorMessage:Rn,errorStack:Ao.stack},Eu;if(N){let Fe;try{if(K.results&&K.results.length>0){let{classification:vr,aiFailureReason:Ra}=await Uw({logger:se,browserStateStorage:xh,generator:c,fullResults:K,failureReason:vo,error:Ao,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Fe=vr,Eu=Ra}}catch(vr){se.warn({err:vr},"Failed to classify test results")}Fe&&(_h.classification=Fe,vo=Eu??vo)}return{...K,runAttemptId:rr,parameters:he,failureDetails:_h,failureReason:vo,test:Je,filePath:Je.relativeFilePath,startedAt:k,lastAttemptStartedAt:nn,finishedAt:fi,attempts:ft+1,baseUrl:l,outputs:X,quarantined:L,quarantinedReason:B}}catch(nr){ol(nr);let on=`Encountered fatal platform error while running test '${Je.name}': ${nr}`,fi=new Date,An=ft+1;se.error({err:nr},on),b.error(on);let X={errorMessage:nr.message,errStack:nr.stack},To={status:"FAILED",failureDetails:X,failureReason:"InternalPlatformError",finishedAt:fi};return await je.finish({logger:se,result:{status:"FAILED",results:[]}}),{...To,runAttemptId:rr,results:[],parameters:he,test:Je,filePath:Je.relativeFilePath,startedAt:k,lastAttemptStartedAt:nn,finishedAt:new Date,attempts:An,baseUrl:l,outputs:{},quarantined:L,quarantinedReason:B}}}throw new Error("This code should not be reachable")}function i4(t){for(let e of t.envs??[])if(e.default)return e.name}import l4 from"adm-zip";import c4 from"path";function a4(t){switch(t){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var ba=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${ur}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${ur}/${r}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))kt.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new yb(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finishInternal({status:a4(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function s4(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var yb=class{constructor(e,r,n,o,i){this.orgId=e;this.testId=r;this.testName=n;this.metadata=o;this.diskStorage=i}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";kt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;kt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finish({status:s4(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new ba(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var fu=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(ur),this.harPagesStream=this.diskStorage.createFileStream(`${ur}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${ur}/har-entries.log`)}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return c4.resolve(this.diskStorage.cwd(),ur)}setActiveVideo(e){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:new Date}))}onNetworkPage(e){this.finished||this.harPagesStream.write(`${JSON.stringify(e)}
|
|
4843
|
+
`),1)}function yD(){return j5()==="darwin"&&G5("system_profiler SPDisplaysDataType").toString().includes("Retina")}function gb(t){yD()&&t===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 V5 from"@actions/exec";import $5 from"@actions/io";import W5 from"quote";import q5 from"string-argv";async function ED(t,e=!0){let r=q5(t),n=await $5.which(r[0],!0),o=r.slice(1),i=V5.exec(W5(n),o,{delay:100});if(e)return i}import K5 from"csv-parser";import{createReadStream as Y5}from"fs";function fb(t){return new Promise((e,r)=>{let n=[];Y5(t).pipe(K5()).on("data",o=>n.push(o)).on("end",()=>e(n)).on("error",o=>r(o))})}import Zs from"semver";import{z as Ah}from"zod";var Lr="2.33.3",X5="https://registry.npmjs.org/momentic",J5=Ah.object({versions:Ah.record(Ah.string(),Ah.unknown()).optional()});async function tr(t){try{await Q5(t)}catch(e){b.warn({err:e},"Failed to check CLI version against NPM servers")}}async function Sb(){let t=await V(fetch(X5),{milliseconds:5e3});if(!t.ok)throw new Error(`Got error status code ${t.statusText}`);let e=await t.json(),r=J5.parse(e).versions;if(!r)throw new Error("Failed to fetch npm registry data. Skipping version check.");let n=Lr;for(let o of Object.keys(r))Zs.valid(o)&&Zs.major(o)===Zs.major(Lr)&&Zs.gt(o,n)&&Zs.prerelease(o)===null&&(n=o);return n}async function Q5(t){let e;for(let r=0;r<2;r++)try{e=await Sb()}catch(n){t.warn({err:n},"Failed to fetch latest version from npm registry")}if(!e){t.warn("Failed to fetch npm registry data. Skipping version check.");return}Zs.eq(Lr,e)||(b.warn(`Update available: v${Lr} -> v${e}`),b.warn("This version may be missing critical fixes, features, and security updates."),b.warn('Run "npx momentic@latest upgrade" to update'))}async function bo(){try{await V(Promise.all([TC(),kt.flush()]),{milliseconds:5e3})}catch{}}import{partition as Z5}from"lodash-es";function Rh(t){return t.length===1?"test":"tests"}function bD(t){return t===1?"1 worker":`${t} workers`}function TD(t){t.length!==0&&(b.info(`Skipping ${t.length} disabled ${Rh(t)}:`),t.forEach(e=>{b.info(`${pt}- ${[e.relativeFilePath]}`)}),b.log(""))}function vD(t,e){t.length!==0&&(b.info(`Skipping ${t.length} quarantined ${Rh(t)}:`),t.forEach(r=>{b.info(`${pt}- ${[r.relativeFilePath]}: ${e[r.id]}`)}),b.log(""))}function e4(t,e){t.length!==0&&(b.info(`Running ${t.length} quarantined ${Rh(t)} with ${bD(e)}:`),t.forEach(r=>{b.info(`${pt}- ${[r.testDefinition.relativeFilePath]}${typeof r.inputIndex=="number"?` with input set ${r.inputIndex}`:""}`)}),b.log(""))}function t4(t,e,r){e.length===0&&t.length>0||(b.info(`Running ${e.length} ${Rh(e)} with ${bD(r)}:`),e.forEach(n=>{b.info(`${pt}- ${[n.testDefinition.relativeFilePath]}${typeof n.inputIndex=="number"?` with input set ${n.inputIndex}`:""}`)}),b.log(""))}function AD({logger:t,localTestsToRunWithInputs:e,parallel:r,shardCount:n,shardIndex:o}){t.info({tests:e.length,shardCount:n,shardIndex:o,parallel:r},"Running local tests");let[i,a]=Z5(e,s=>s.quarantined);e4(i,r),t4(i,a,r)}import{randomUUID as r4}from"crypto";import{cloneDeep as el}from"lodash-es";async function RD({orgId:t,codeEvalTools:e,logger:r,outputDefinitions:n,testContext:o}){let i={};for(let a of n){let{name:s,value:c}=a;i[s]=await mr({orgId:t,s:c,localTools:e,logger:r,context:o})}return i}async function CD({baseUrl:t,envName:e,testName:r,devicePixelRatio:n,apiClient:o,test:i,storageClient:a,codeEvalTools:s,generator:c,orgId:l,variables:u,logger:d,customHeaders:p,testInputs:m,localBrowserConfig:h,aiSettings:g,visualDiffScreenshotStorage:f,tracer:S}){let y=await Hm({settings:h,customHeaders:p,envVariables:u,envName:e,testName:r,baseUrl:t,logger:d,localTools:s,orgId:l}),E={baseUrl:o.baseUrl,apiKey:o.apiKey,logger:Y,mode:"runner"},T=Ku({browserType:y.browserType,orgDefaultBrowserType:h.defaultBrowserType});if(!CC(T)){let _=`Browser ${T} is required by the test named ${i.name} but does not appear to be installed on this machine. Please install it using 'momentic install-browsers' before running tests. Attempting to continue...`;b.warn(_),Y.warn(_)}let v=await Yr.init({baseUrl:t,logger:d,userBrowserSettings:y,storage:a,enricher:new $o(E,c),contextArgs:{viewport:i.advanced.viewport??Kt,locale:i.advanced.locale??Lo,geolocation:i.advanced.geolocation??Do,timezoneId:i.advanced.timezone??No,colorScheme:i.advanced.colorScheme,deviceScaleFactor:n},callbacks:{onNetworkPage:_=>S.onNetworkPage(_),onNetworkLogs:_=>S.onNetworkLogs(_)},iconKnowledgeBase:null,videoOptions:S.videoOutputPath?{videoOutputPath:S.videoOutputPath,onVideoPageChange:({videoName:_})=>{S.setActiveVideo(_)}}:void 0}),x=new li({browser:v,generator:c,logger:d,orgId:l,options:{scratchPadId:void 0,slowMoMs:y.slowMoMs,autoFollowNewTabs:y.autoFollowNewTabs,useMemory:g.useMemory,aiPageFiltering:g.aiPageFiltering},storage:a,localCodeEvalTools:s,visualDiffScreenshotStorage:f}),C=new lr({baseUrl:t,currentUrl:x.browser.url(),variablesFromEnvironment:u,envName:e,testName:r});return i.parameters&&await Promise.all(i.parameters.map(async _=>{let{name:L,defaultValue:B,required:G}=_,N=m?.[L];G&&N===void 0&&(b.error(`Required parameter '${L}' is required by test '${i.name}' but not provided`),process.exit(1));let k=await mr({orgId:l,s:N??B,localTools:s,logger:d,context:lr.dummyContext(C.getEnvName())});C.setMomenticSystemVariable(L,k)})),{controller:x,context:C}}async function wD({testAdvancedSettings:t,orgSettings:e,logger:r}){if(t.failureRecovery===!1||t.failureRecovery===void 0&&!e?.failureRecovery)return!1;if(!zi){let n="This test is ineligible for failure recovery since this does not appear to be a CI environment";return r.warn(n),b.warn(n),!1}return!0}async function xD({attemptInputs:t,attemptFixtures:e,attemptMetadata:r}){let{orgId:n,runId:o}=r,{controller:i,context:a,codeEvalTools:s,storageClient:c,logger:l,usageTracker:u,tracer:d}=e,{test:p,orgSettings:m}=t;l.info(`Running test '${p.name}' locally (run link: https://app.momentic.ai/runs/${o})`);let h={controller:i,storage:c,usageTracker:u,context:a,logger:l,codeEvalTools:s},g={orgId:n,runId:o,testMetadata:p,steps:p.steps,beforeSteps:p.beforeSteps,afterSteps:p.afterSteps,orgSettings:m},f={collectDebugData:!0,reinitializeBrowser:!0,disableHealing:!await wD({testAdvancedSettings:p.advanced,orgSettings:m.ai,logger:l})};return await zm({fixtures:h,inputs:g,options:f,callbacks:{step:{},test:{onTestComplete:async()=>{await i.browser.cleanup()}}},testParams:{tracer:d}})}async function _D(t){let{testDefinition:e,logger:r}=t,n=new Date;try{return await n4(t)}catch(o){let i="Fatal error running test";return b.error(`${i}: ${o.message}`),r.error({err:o},i),{results:[],parameters:t,failureReason:"UnknownError",failureDetails:{errorMessage:o.message,errorStack:o.stack},status:"FAILED",attempts:0,test:e,filePath:e.relativeFilePath,startedAt:n,lastAttemptStartedAt:n,finishedAt:new Date,outputs:{}}}}async function n4(t){let{testDefinition:e,project:r,apiClient:n,orgId:o,urlOverride:i,runGroupTracer:a,logger:s,gitMetadata:c,cacheOptions:l,runId:u,testInputs:d,quarantined:p,quarantinedReason:m,usageTracker:h}=t,g=new ls(n,o),f=Wo({logger:s,orgId:o,client:n,gitMetadata:c,regenerateCache:l.regenerateCache,alwaysSaveCache:l.alwaysSaveCache,noCache:l.noCache,bustOldestCachePercentage:l.bustOldestCachePercentage}),S=await Kd({cacheStorage:f,logger:s,schemaVersion:e.schemaVersion,stepLists:{steps:e.steps,beforeSteps:e.beforeSteps,afterSteps:e.afterSteps},testId:e.id}),y=S.steps,E=S.beforeSteps??void 0,T=S.afterSteps??void 0,v=t.envName??i4(e),x,C={};if(v){try{x=Ki(v,r,s)}catch(N){let k=`Failed to resolve environment ${v} for test ${e.name}: ${N}`;throw new Error(k)}C=x.variables}let _=e.baseUrl;if(i)_=i;else if(!_){let N=C[At];typeof N=="string"&&(_=N)}if(!_){let N=`Cannot run test with no base URL and no ${At} variable defined in its environment`;throw new Error(N)}let L=await a.startRun({logger:s,runId:u,originalSteps:{beforeSteps:e.beforeSteps,steps:e.steps,afterSteps:e.afterSteps},testId:e.id,testName:e.name,testDescription:e.description??void 0,testLabels:e.labels,baseUrl:_,environmentName:v,schemaVersion:e.schemaVersion,resolvedInputs:d,quarantined:p,quarantinedReason:m}),B=s.child(L.loggerBindings||{});Object.entries(L.envVarBindings||{}).forEach(([N,k])=>{C[N]=k});let G=await o4({...t,variables:C,envName:v,resolvedEnv:x,baseUrl:_,storageClient:g,tracer:L,logger:B,cacheStorage:f,stepsWithCaches:y,beforeStepsWithCaches:E,afterStepsWithCaches:T,usageTracker:h});return await L.finish({logger:s,status:G.status,finishedAt:G.finishedAt,failureDetails:G.failureDetails,failureReason:G.failureReason,isFlake:G.isFlake,failureRecoveryDetails:G.failureRecoveryDetails}),{runId:L.runId,...G}}async function o4(t){let{testDefinition:e,stepsWithCaches:r,beforeStepsWithCaches:n,afterStepsWithCaches:o,project:i,regenerateGoldenFiles:a,apiClient:s,generator:c,baseUrl:l,storageClient:u,orgId:d,envName:p,urlOverride:m,customHeaders:h,testInputs:g,variables:f,resolvedEnv:S,retriesOverride:y,devicePixelRatio:E,logUpdate:T,tracer:v,logger:x,cacheStorage:C,gitMetadata:_,quarantined:L,quarantinedReason:B,usageTracker:G}=t,N=i.config.ai?.aiFailureAnalysis??!1,k=new Date,q=new vs(i,s,a),$={...i.config},he={envName:p,urlOverride:m,customHeaders:h,testInputs:g},K,tt=Math.abs(y??i.config.retries??e.retries??0),De=[];x.info({..._,labels:e.labels,name:e.name,cwd:process.cwd()},"Starting test run using CLI");for(let ft=0;ft<=tt;ft++){let rr=r4(),je=await v.startAttempt(rr),se=x.child(je.loggerBindings||{}),Je={...e,steps:el(r),beforeSteps:el(n),afterSteps:el(o)};ft!==0&&T("RETRY",`attempt ${ft+1}/${tt+1}`);let nn=new Date,Ta=$.advanced?.fakerConstantSeed,tl=new Nn({httpClient:new zt({baseUrl:s.baseUrl,apiKey:s.apiKey,logger:se,mode:"runner"}),fakerSeed:Ta?rs:void 0}),xh=je;try{let{controller:nr,context:on}=await CD({tracer:je,baseUrl:l,envName:p,testName:Je.name,apiClient:s,devicePixelRatio:E,logger:se,storageClient:u,codeEvalTools:tl,test:Je,generator:c,orgId:d,variables:f,customHeaders:h,testInputs:g,localBrowserConfig:{...i.config.browser||{},...S?.browser||{},...Je.advanced},aiSettings:{...i.config.ai||{},...Je.advanced||{}},visualDiffScreenshotStorage:q});K=await xD({attemptMetadata:{attemptNumber:ft+1,orgId:d,runId:v.runId},attemptFixtures:{logger:se,storageClient:u,usageTracker:G,codeEvalTools:tl,apiClient:s,context:on,controller:nr,tracer:je},attemptInputs:{test:Je,orgSettings:$}});let fi=new Date,An={logger:x,cacheStorage:C,orgId:d,testId:e.id,originalStepsWithCaches:{steps:el(r),beforeSteps:el(n),afterSteps:el(o)},updatedStepsWithCaches:{steps:Je.steps,beforeSteps:Je.beforeSteps,afterSteps:Je.afterSteps}};K?.status==="PASSED"?await ep(An):K?.status==="FAILED"&&ft===tt&&await tp(An),await je.finish({logger:se,result:K}),De.unshift(K.status);let X=await RD({orgId:d,codeEvalTools:tl,logger:se,outputDefinitions:e.outputs??[],testContext:on}),To=Mv(De),va=ft+1;if(K.status!=="FAILED")return{...K,runAttemptId:rr,parameters:he,test:Je,filePath:Je.relativeFilePath,startedAt:k,lastAttemptStartedAt:nn,finishedAt:fi,attempts:va,baseUrl:l,outputs:X,isFlake:To,quarantined:L,quarantinedReason:B};let rl=K.failedStepResult,Rn=rl?.message||"Unknown failure",vo=rl?.failureReason??DT(Rn)??"UnknownError",Aa=se.child({failureReason:vo,errorMessage:Rn,numAttempts:(tt+1).toString(),name:Je.name});if(ft<tt){Aa.warn(`Retrying failed execution attempt for run: ${Rn}`);continue}Aa.error(`Test failed after all exhausting attempts: ${Rn}`);let Ao=new Error(Rn),_h={errorMessage:Rn,errorStack:Ao.stack},Eu;if(N){let Fe;try{if(K.results&&K.results.length>0){let{classification:vr,aiFailureReason:Ra}=await Uw({logger:se,browserStateStorage:xh,generator:c,fullResults:K,failureReason:vo,error:Ao,maxItemsFromEnd:void 0,numStepsWithScreenshots:void 0,disableCache:!1});Fe=vr,Eu=Ra}}catch(vr){se.warn({err:vr},"Failed to classify test results")}Fe&&(_h.classification=Fe,vo=Eu??vo)}return{...K,runAttemptId:rr,parameters:he,failureDetails:_h,failureReason:vo,test:Je,filePath:Je.relativeFilePath,startedAt:k,lastAttemptStartedAt:nn,finishedAt:fi,attempts:ft+1,baseUrl:l,outputs:X,quarantined:L,quarantinedReason:B}}catch(nr){ol(nr);let on=`Encountered fatal platform error while running test '${Je.name}': ${nr}`,fi=new Date,An=ft+1;se.error({err:nr},on),b.error(on);let X={errorMessage:nr.message,errStack:nr.stack},To={status:"FAILED",failureDetails:X,failureReason:"InternalPlatformError",finishedAt:fi};return await je.finish({logger:se,result:{status:"FAILED",results:[]}}),{...To,runAttemptId:rr,results:[],parameters:he,test:Je,filePath:Je.relativeFilePath,startedAt:k,lastAttemptStartedAt:nn,finishedAt:new Date,attempts:An,baseUrl:l,outputs:{},quarantined:L,quarantinedReason:B}}}throw new Error("This code should not be reachable")}function i4(t){for(let e of t.envs??[])if(e.default)return e.name}import l4 from"adm-zip";import c4 from"path";function a4(t){switch(t){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}var ba=class{constructor(e,r,n,o){this.orgId=e;this.testId=r;this.testName=n;this.diskStorage=o}children=[];finished=!1;stepFrequenciesByType={};async getScreenshot(e,r){return this.diskStorage.readFile(`${ur}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${ur}/${r}.html`)?.toString()}getParentStepIdChain(){return[]}recordStepStat(e){e.type!=="PRESET_ACTION"?this.stepFrequenciesByType[e.type]=(this.stepFrequenciesByType[e.type]||0)+1:this.stepFrequenciesByType[e.command.type]=(this.stepFrequenciesByType[e.command.type]||0)+1}sendFinalizedStepStats(){for(let[e,r]of Object.entries(this.stepFrequenciesByType))kt.increment("test_step_execution",r,[`type:${e}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async startStep(e){let{step:r}=e;this.recordStepStat(r);let n={step:r,status:"RUNNING",startedAt:new Date},o=new yb(this.orgId,this.testId,this.testName,n,this.diskStorage);return this.children.push(o),o}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finishInternal({status:a4(e.status),finishedAt:e.finishedAt}))),this.sendFinalizedStepStats())}};function s4(t){switch(t){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var yb=class{constructor(e,r,n,o,i){this.orgId=e;this.testId=r;this.testName=n;this.metadata=o;this.diskStorage=i}children=[];finished=!1;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:r,screenshot:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.jpeg`,contents:n})}attachBeforeHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.beforeSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.html`,contents:n})}attachAfterHtmlSnapshot(e){let{snapshotId:r,html:n}=e;this.metadata.afterSnapshotId=r,this.diskStorage.storeFile({name:`${ur}/${r}.html`,contents:n})}recordTargetAutoHeal(e){let{healType:r}=e,n=r==="AI"?"ai-target-heal":"cache-heal";kt.increment("test_event",1,[`name:${n}`,`orgId:${this.orgId}`]),this.metadata.healMetadata={healType:r,healedAt:new Date}}recordStepDuration(e){let r=e.step.type!=="PRESET_ACTION"?e.step.type:e.step.command.type;kt.distribution("test_step_duration",e.durationMs,[`type:${r}`,"platform:browser","executor:cli",`orgId:${this.orgId}`])}async finishInternal(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(r=>r.finish({status:s4(e.status),finishedAt:e.finishedAt}))))}async finish(e){await this.finishInternal(e.step)}async startSubSteps(){let e=new ba(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}};var fu=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s;this.diskStorage.mkdir(ur),this.harPagesStream=this.diskStorage.createFileStream(`${ur}/har-pages.log`),this.inProgressHarEntries={},this.harEntriesStream=this.diskStorage.createFileStream(`${ur}/har-entries.log`)}finished=!1;children=[];harPagesStream;inProgressHarEntries;harEntriesStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}get videoOutputPath(){if(this.recordVideo)return c4.resolve(this.diskStorage.cwd(),ur)}setActiveVideo(e){this.recordVideo&&(this.metadata.activeVideos=this.metadata.activeVideos||[],this.metadata.activeVideos.push({videoName:e,timestamp:new Date}))}onNetworkPage(e){this.finished||this.harPagesStream.write(`${JSON.stringify(e)}
|
|
4844
4844
|
`)}onNetworkLogs(e){if(!this.finished)for(let[r,n]of Object.entries(e))n.response?(delete this.inProgressHarEntries[r],this.harEntriesStream.write(`${JSON.stringify(n)}
|
|
4845
4845
|
`)):this.inProgressHarEntries[r]=n}attachConsoleLogs(e){let{logs:r}=e;this.diskStorage.storeFile({name:"console.json",contents:JSON.stringify(r,null,2)})}attachBrowserCrashDump(e){let{crashReportDirFetcher:r,logger:n}=e,o=r();if(!o)return;let i=new l4;i.addLocalFolder(o,void 0,a=>a!==".DS_Store"),this.diskStorage.storeFile({name:`${ur}/${Nf}`,contents:i.toBuffer()}),n.info({browserCrashZipName:Nf},"Attached browser crash ZIP")}async finish(e){if(this.finished)return;this.finished=!0;let{logger:r,result:n}=e,o={...this.metadata,status:n.status,finishedAt:new Date,results:Zd(n.results,r),beforeResults:n.beforeResults?Zd(n.beforeResults,r):void 0,afterResults:n.afterResults?Zd(n.afterResults,r):void 0};await Promise.all(this.children.map(i=>i.finish({status:o.status,finishedAt:o.finishedAt})));for(let i of Object.values(this.inProgressHarEntries))this.harEntriesStream.write(`${JSON.stringify(i)}
|
|
4846
4846
|
`);try{this.harEntriesStream.end()}catch{}try{this.harPagesStream.end()}catch{}this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)})}async startBeforeStepList(){let e=new ba(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new ba(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new ba(this.orgId,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,r){return this.diskStorage.readFile(`${ur}/${r}.jpeg`)}async getHtmlSnapshot(e,r){return this.diskStorage.readFile(`${ur}/${r}.html`)?.toString()}};var Su=class{constructor(e,r,n,o,i,a,s){this.orgId=e;this.testId=r;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a;this.recordVideo=s}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}get envVarBindings(){return{[WO]:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let r={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,result:{status:r.status,results:[],beforeResults:[],afterResults:[]}}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(r,null,2)}),this.diskStorage.close()}async startAttempt(e){this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let r=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),n={id:e,schemaVersion:Me,runAttemptSchemaVersion:sC,startedAt:new Date,status:"RUNNING"};r.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new fu(this.orgId,this.testId,this.testName,e,n,r,this.recordVideo);return this.children.push(o),o}};var yu=class t{constructor(e,r,n,o,i){this.orgId=e;this.runGroupId=r;this.metadata=n;this.diskStorage=o;this.recordVideo=i}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({orgId:e,runGroupId:r,outputDir:n,gitMetadata:o,labels:i,recordVideo:a}){let s={...o,id:r,trigger:Br.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Lr,labels:i??[]},c=new Tc(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)}),new t(e,r,s,c,a??!1)}async finish(e){if(this.finished)return;this.finished=!0;let{status:r}=e,n={...this.metadata,status:r,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)})}async startRun(e){let r=this.diskStorage.createRunArchive(e.runId),n={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,testDescription:e.testDescription,labels:e.testLabels,trigger:"CLI",status:"RUNNING",resolvedBaseUrl:e.baseUrl,environmentName:e.environmentName,resolvedInputs:e.resolvedInputs,cliVersion:Lr,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined??!1,quarantinedReason:e.quarantinedReason,executionType:"WEB"};r.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Su(this.orgId,e.testId,e.testName,e.runId,n,r,this.recordVideo);return this.children.push(o),o}};async function MD(t,e,r){if(r)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]=i.quarantinedReason,o),{})}catch(n){return t.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function ID(t){let{logger:e,tests:r,yes:n,start:o,waitOn:i,waitOnProxy:a,client:s,project:c,retriesOverride:l,urlOverride:u,envName:d,orgId:p,devicePixelRatio:m,customHeaders:h,testInputMatrix:g,reporter:f,include:S,exclude:y,labels:E,reporterDir:T=nx,outputDir:v=ox,uploadResults:x=!1,waitOnTimeout:C=60,parallel:_,shardIndex:L=1,shardCount:B=1,regenerateGoldenFiles:G,gitMetadata:N,cacheOptions:k,ignoreQuarantine:q,skipQuarantined:$,onlyQuarantined:he,runGroupId:K,recordVideo:tt,timeoutMinutes:De}=t;if(o&&(e.info({orgId:p},`Executing start command: ${o}`),await ED(o,!1)),i){e.info({orgId:p},`Waiting for url: ${i} with timeout: ${C} seconds.`);let Fe=a?new URL(a):void 0,vr;Fe&&(vr={host:Fe.hostname,port:Fe.port?parseInt(Fe.port):Fe.protocol.startsWith("https")?443:80,auth:Fe.username||Fe.password?{username:Fe.username,password:Fe.password}:void 0}),await p4({resources:[i],interval:2500,timeout:C*1e3,headers:{Accept:"*/*"},followRedirect:!0,verbose:!1,log:!0,strictSSL:!1,proxy:vr})}let ft=new no(c.config.ai?.agentConfig,{baseUrl:s.baseUrl,apiKey:s.apiKey,logger:e,mode:"runner"}),rr=await ee(c),je=await Js({tests:r,momenticFiles:rr,yes:n,project:c,include:S,exclude:y,labels:E,logger:b}),se=await MD(e,s,q),{testsToSkip:Je,quarantinedTestsToSkip:nn,testsToRun:Ta,quarantinedTestsToRun:tl}=oD({testDefinitions:je,quarantinedTestReasons:se,onlyQuarantined:he,skipQuarantined:$});TD(Je),vD(nn,se);let xh=iD({testsToRun:Ta,quarantinedTestsToRun:tl,quarantinedTestReasons:se,testInputMatrix:g}),nr=MC({items:xh,shardIndex:L,shardCount:B});AD({logger:e,localTestsToRunWithInputs:nr,parallel:_,shardCount:B,shardIndex:L});let on=[],fi=new Date,An=new Set,X=async()=>{let Fe=s.getAppUrl(),vr=ss({results:on,startTime:fi.getTime(),onFailed:Ar=>{Fd(Ar,Ar.filePath)},getDisplayLine:Ar=>{let Si=`${pt}- ${Ar.filePath}${Ar.failureRecoveryDetails?" [recovered] ":""}`;return Ar.runId&&(Si+=` ( link when uploaded: ${Fe}/runs/${Ar.runId} )`),Si},entity:"test"}),Ra=on.filter(Ar=>!!Ar.failureRecoveryDetails?.attempts);return Ra.length>0&&b.warn(`Our AI agent automatically prevented ${Ra.length} tests from failing due to transient issues. Use the run links above to review the additional steps that were executed.
|
|
@@ -4848,4 +4848,4 @@ ${t.map(p=>`${pt}- ${p}`).join(`
|
|
|
4848
4848
|
`),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."),wh.existsSync(bs)&&(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 e=t.name??await hC("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app");await ax()||await Bt("A Git repository was not detected in the current directory. Momentic highly recommends initializing your project within a Git repository for seamless version control. Continue?")||process.exit(1),Yo({name:e,include:Sp},bs),b.success(`Initialized Momentic project file at ${Ch.resolve(bs)}`)});Vt.command("app").addOption(tn).addOption(rn).addOption(hi).addOption(rb).addOption(hr).addOption(ob).addOption(ib).addOption(ab).action(async t=>{await tr(Y);let{apiKey:e,yes:r,server:n,pixelRatio:o,disableCache:i,saveCache:a,regenerateCache:s}=t;jf({disableCache:i,saveCache:a,regenerateCache:s});let c=await _t({configFilePath:t.config,nameFilter:void 0}),{errors:l,parsingErrors:u,failedTestFilePaths:d,failedModuleFilePaths:p,parsingErrorDetails:m}=await uh({project:c,fix:!1});u>0?(sc({parsingErrors:u,parsingErrorDetails:m,failedTestFilePaths:d,failedModuleFilePaths:p}),process.exit(1)):l>0&&(b.error(`Found ${l} errors`),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)),oM(Y);let h=new nt({baseUrl:n,apiKey:e,logger:Y});await Yf({client:h,skipPrompts:r});let g=T4(import.meta.url),f=Ch.dirname(g),S=Ch.resolve(f,"..","static"),y=Ch.resolve(f,"..","assets"),E=o??hb();gb(E),await CN({momenticServerUrl:n,apiKey:e,serverPort:dh,appPort:dh,staticDir:S,assetsDir:y,devicePixelRatio:E,regenerateCache:s??!1,noCache:i??!1,alwaysSaveCache:a??!1,initialProject:c});let T=`http://localhost:${dh}`;await b4(T)});var FD=Vt.command("queue").description("Queue tests or suites to run on Momentic Cloud");FD.command("suites").description("Run one or more suites on Momentic Cloud").addOption(tn).addOption(rn).addOption(JE).addOption(QE).addOption(hi).addArgument(JN).addOption(gh).addOption(hh).addOption(mh).action(async(t,e)=>{await tr(Y);let{apiKey:r,server:n,wait:o,waitTimeout:i,env:a,urlOverride:s}=e,c=ph(e.customHeaders),l=new nt({baseUrl:n,apiKey:r,logger:Y});(!t||!Array.isArray(t)||!t.length)&&(b.error("Must pass at least one suite to run."),process.exit(1));let{orgId:u}=await l.getAuthInfo();await cD({client:l,orgId:u,wait:o,suitePaths:t,waitTimeout:i,env:a,urlOverride:s,customHeaders:c}),await bo()});FD.command("tests").description("Run one or more tests on Momentic Cloud").addOption(tn).addOption(rn).addOption(hi).addOption(mh).addOption(nb).addOption(gh).addOption(hh).addOption(new gr("--all","Run all tests.").default(!1)).addOption(JE).addOption(QE).addArgument(YN).action(async(t,e)=>{await tr(Y);let{all:r,apiKey:n,env:o,server:i,inputCsv:a,urlOverride:s,wait:c,waitTimeout:l,yes:u}=e,d=ph(e.customHeaders);for(let g of t)(g.endsWith(".yaml")||wh.existsSync(g))&&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 p=new nt({baseUrl:i,apiKey:n,logger:Y}),{orgId:m}=await p.getAuthInfo(),h;a&&(h=await fb(a)),await uD({client:p,orgId:m,tests:t,all:r,customHeaders:d,env:o,urlOverride:s,wait:c,waitTimeout:l,testInputMatrix:h,yes:u}),await bo(),process.exit(0)});var v4=Vt.command("list").description("List test paths");v4.addOption(hr).addOption(gi).addOption(eb).addOption(tb).addOption(new gr("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(sb).action(async(t,e)=>{let r=await _t({configFilePath:e.config,nameFilter:e.filter}),n=await ee(r),o=await Js({tests:t,momenticFiles:n,yes:!0,project:r,include:e.include,exclude:e.exclude,labels:e.labels,logger:new Bi(40,{})});b.info(o.map(i=>i.relativeFilePath).join(`
|
|
4849
4849
|
`)),process.exit(0)});var A4=Vt.command("run").alias("test").description("Run tests on the local machine");A4.addOption(tn).addOption(rn).addOption(hr).addOption(gi).addOption(hi).addOption(mh).addOption(nb).addOption(ob).addOption(ib).addOption(ab).addOption(VN).addOption(KN).addOption($N).addOption(WN).addOption(qN).addOption(hh).addOption(gh).addOption(rb).addOption(new gr("--start <start>","Arbitrary setup command that will run before Momentic steps begin.")).addOption(new gr("--wait-on <waitOn>","URL to wait to become accessible before Momentic tests begin.")).addOption(new gr("--wait-on-proxy <waitOnProxy>","HTTP proxy to use with the --wait-on command. Specify as https://username:pass@domain.com:2345")).addOption(new gr("--wait-on-timeout <waitOnTimeout>","Max time in seconds to wait for the --wait-on URL to become accessible.").default(60).argParser(Kn)).addOption(new gr("--retries <retries>","Number of retries to attempt when running tests locally. Defaults to each test's own retry configuration.").argParser(Kn)).addOption(new gr("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(Kn)).addOption(new gr("--labels <labels...>","Only run tests with the specified label(s).")).addOption(new gr("--update-golden-files","Update locally stored golden files for steps that this is enabled for.").default(!1)).addOption(UN).addOption(BN).addOption(ZE).addOption(zN).addOption(GN).addOption(HN).addOption(eb).addOption(tb).addOption(eD).addArgument(sb).action(async(t,e)=>{await tr(Y);let{disableCache:r,saveCache:n,regenerateCache:o}=e;jf({disableCache:r,saveCache:n,regenerateCache:o}),_C({shardIndex:e.shardIndex,shardCount:e.shardCount});let i=ph(e.customHeaders),a=await _t({configFilePath:e.config,nameFilter:e.filter}),s=e.parallel??a.config.parallel??1;LD().length<s*2&&b.warn(`You requested to run tests in parallel ${s} at a time on a machine with ${LD().length} cores. This may cause performance issues and test failures as Chrome requires at least 2 cores per browser instance.`),b.debug({projectName:a.config.name},"Identified project config");let{errors:c,parsingErrors:l,parsingErrorDetails:u,failedTestFilePaths:d,failedModuleFilePaths:p}=await uh({project:a,fix:!1});l>0?(sc({parsingErrors:l,parsingErrorDetails:u,failedTestFilePaths:d,failedModuleFilePaths:p}),process.exit(1)):c>0&&(b.error(`Found ${c} errors`),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 m=new nt({baseUrl:e.server,apiKey:e.apiKey,logger:Y});b.debug("Checking API key and dependencies");let{orgId:h,userId:g}=await Yf({client:m,skipPrompts:e.yes});b.debug("API key check and browser installation complete");let f=e.outputDir??a.config.outputDir,S=e.reporterDir??a.config.reporterDir,y=y4(),E=Y.child({cliVersion:Lr,orgId:h,userId:g,runGroupId:y}),T=await $r(Y,m,a);E.info({gitMetadata:T,config:a.config,nodeVersion:process.versions.node},"Got local metadata");let v;e.inputCsv&&(v=await fb(e.inputCsv));let x=e.pixelRatio??hb();gb(x);try{let C=await ID({...e,parallel:s,retriesOverride:e.retries,devicePixelRatio:x,tests:t,project:a,client:m,outputDir:f,uploadResults:e.uploadResults,reporterDir:S,customHeaders:i,envName:e.env,orgId:h,testInputMatrix:v,logger:E,regenerateGoldenFiles:e.updateGoldenFiles,gitMetadata:T,cacheOptions:{regenerateCache:o??!1,alwaysSaveCache:n??!1,noCache:r??!1,bustOldestCachePercentage:e.bustOldestCachePercentage},recordVideo:e.recordVideo??a.config.recordVideo,runGroupId:y,timeoutMinutes:e.timeoutMinutes});await bo(),C.failed>0?process.exit(1):process.exit(0)}catch(C){b.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),b.error(C),await bo(),process.exit(1)}});var R4=Vt.command("apply").description("Apply an operation to local resources");R4.command("patch").addOption(tn).addOption(rn).addOption(hr).addOption(gi).addOption(hi).addOption(new gr("--from <from>","Name or ID of the patch to apply").makeOptionMandatory()).addOption(new gr("--to <to>","Name or ID of the test to apply the patch to").makeOptionMandatory()).action(async t=>{await tr(Y);let{apiKey:e,server:r,config:n,yes:o}=t,i=await _t({configFilePath:n}),a=Y,s=new nt({baseUrl:r,apiKey:e,logger:a}),c=await ee(i),l=c.tests[t.to]??Object.values(c.tests).find(d=>He(d.name)===t.to.trim());l||(b.error(`No test matching '${t.to}' could be found in the current project.`),process.exit(1));let u=await s.fetchTestFragment(t.from);await xN({client:s,test:l,fragment:u,yes:o,entities:c,logger:Y}),process.exit(0)});var UD=Vt.command("results").description("Merge and upload test results.");UD.command("merge").description("Merge test results files.").addOption(ZE).addArgument(QN).action(async(t,e)=>{await tr(Y);let{outputDir:r}=e;r||(b.error("Output directory is required."),process.exit(1)),wh.existsSync(t)||(b.warn("Results path does not exist, skipping merge."),process.exit(0)),wh.existsSync(r)&&b.warn(`Output directory ${r} already exists, removing before merging...`),ux(Y,r,t)});UD.command("upload").description("Upload test results to Momentic cloud.").addOption(tn).addOption(rn).addArgument(ZN).action(async(t,e)=>{await tr(Y);let{apiKey:r,server:n}=e,o=Y,i=new nt({baseUrl:n,apiKey:r,logger:o});await Tp({consoleLogger:b,resultsPath:t,client:i}),process.exit(0)});var bb=Vt.command("quarantine").description("Manage test quarantines");bb.command("add").description("Add a test to the quarantine. This will prevent it from running.").addOption(tn).addOption(rn).addOption(hr).addOption(gi).addOption(lb).addArgument(cb).action(async(t,e)=>{await tr(Y);let{apiKey:r,server:n,config:o,reason:i}=e,a=Y,s=await _t({configFilePath:o}),c=new nt({baseUrl:n,apiKey:r,logger:a}),l=await $r(Y,c,s);await nD({test:t,reason:i,apiClient:c,project:s,logger:a,identity:l})});bb.command("list").description("List quarantined tests.").addOption(tn).addOption(rn).addOption(hr).addOption(gi).action(async t=>{let{apiKey:e,server:r,config:n}=t,o=Y,i=await _t({configFilePath:n}),a=new nt({baseUrl:r,apiKey:e,logger:o});await aD({apiClient:a,project:i})});bb.command("remove").description("Remove a test from the quarantine. This will allow it to run again.").addOption(tn).addOption(rn).addOption(hr).addOption(gi).addOption(lb).addArgument(cb).action(async(t,e)=>{await tr(Y);let{apiKey:r,server:n,config:o,reason:i}=e,a=Y,s=await _t({configFilePath:o}),c=new nt({baseUrl:n,apiKey:r,logger:a}),l=await $r(Y,c,s);await sD({test:t,reason:i,apiClient:c,project:s,identity:l})});Vt.command("upgrade").description("Upgrade your configuration to the latest recommended settings").addOption(hr).addOption(gi).action(async t=>{let e=await _t({configFilePath:t.config,nameFilter:t.filter});b.info("Updating Momentic version in package.json..."),await PD(),b.info("Updating project configuration..."),OD(e),b.success("Your project configuration was successfully updated to the latest recommended settings."),b.info("You can optionally run tests with the `--regenerate-cache` flag to entirely rebuild caches with the newer configuration. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.")});async function C4(){DD("Main program started");try{await Vt.parseAsync(process.argv),await bo()}catch(t){let e={};try{e.playwrightVersion=S4("npx playwright --version").toString()}catch(r){Y.error({err:r},"Error fetching debug information")}Y.error({err:t,debugInfo:e},"Uncaught error in CLI"),ol(t,e),b.error(t),await bo(),process.exit(1)}}E4.setMaxListeners(25);process.on("warning",t=>{Y.warn({err:t},`Node warning received on CLI: ${t.message}`)});DD("CLI parsing setup complete");C4();
|
|
4850
4850
|
//# sourceMappingURL=cli.js.map
|
|
4851
|
-
//# debugId=
|
|
4851
|
+
//# debugId=619cf562-3a23-55a0-b1c8-7a57b6a502ff
|